文章目录

  • 基础函数
  • 直方图阈值
    • 实现
    • threshold 函数使用
  • 三角法阈值
    • 实现
  • 迭代法阈值
    • 算法步骤
    • Python语法补充
    • 实现
  • 大津法
    • 理论
    • cv实现
    • 底层复现
  • 自适应阈值
    • 理论
    • 具体操作步骤
    • 优化
    • CV实现
    • 底层复现

基础函数

在此列出,后面将直接使用,不再赘述

  1. 导入库
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
  1. 展示函数
def show(img):if img.ndim == 2:plt.imshow(img, cmap='gray', vmin=0, vmax=255)else:img = cv.cvtColor(img, cv.COLOR_BGR2RGB)plt.imshow(img)plt.show()

直方图阈值

算法描述:根据图像灰度直方图,人工寻找阈值
算法特点:适用双峰图像

实现

导入图片

img = cv.imread('pic/eagle.jpg', 0)
show(img)


画出直方图

plt.hist(img.ravel(), 256, [0, 256])
plt.show()

plt.hist(img.flatten(), np.arange(-0.5, 256, 1), color='g')
plt.show()


二值化

_, img_bin = cv.threshold(img, 125, 255, cv.THRESH_BINARY)
show(img_bin)

threshold 函数使用

三角法阈值

论文:AUTOMATIC MEASUREMENT OF SISTER CHROMATID EXCHANGE FREQUENCY

算法思想:几何法,适用单峰图像


距离最远的点,即为分割点

实现

img = cv.imread('pic/blossom', 0)
show(img)

plt.hist(img.flattern(), np.arange(-0.5, 256, 1), color='g')
plt.show()

th, img_ = cv.threshold(img, 0, 255, cv.THRESH_TRIANGLE)
print(th)
show(np.hstack([img, img_bin])

三角法自动寻找阈值,第二个参数随便写就行

迭代法阈值

算法步骤

  1. 选取初始分割阈值,通常可选图像灰度平均值TTT
  2. 根据阈值TTT将图像像素分割为背景和前景,分别求出两者的平均灰度T0和T1T_0和T_1T0​和T1​
  3. 计算新的阈值T′=T0+T12T'={T_0+T_1 \over 2}T′=2T0​+T1​​
  4. 若T==T′T==T'T==T′,则迭代结束,TTT即为最终阈值。否则令T=T′T=T'T=T′,转第(2)步。

前景为>T>T>T的部分,背景为<T<T<T的部分

Python语法补充

a = np.random.randint(0, 10, (4, 4))

a[a <= 5]

a[a <= 5].mean()

实现

img = cv.imread('pic/eagle', 0)T = img.mean()while True:t0 = img[img < T].mean() // 背景平均灰度值t1 = img[img >= T].mean()    // 前景平均灰度值t = (t0 + t1) / 2print(T, t)if T == t:    // 可适当放宽条件, abs(T-t) < 1breakT = t
T = int(T) // 浮点数没有用print(f"Best Threshold = {T}")

Best Threshold = 120

大津法

理论

算法思想:最大类间方差
对于给定阈值TTT,可以将图像分为目标和背景。其中背景点数占图像比例为p0p_0p0​,平均灰度值为m0m_0m0​。而且标定数占图像比例为p1p_1p1​,平均灰度值为m1m_1m1​,其中满足
p0+p1=1p_0+p_1=1p0​+p1​=1
整幅图像的平均灰度值为常数,跟阈值无关,且为
mˉ=p0m0+p1m1\bar m = p_0m_0+p_1m_1mˉ=p0​m0​+p1​m1​
类间方差为
σ2=p0(m0−mˉ)2+p1(m1−mˉ)2\sigma^2=p_0(m_0-\bar m)^2+p_1(m_1-\bar m)^2σ2=p0​(m0​−mˉ)2+p1​(m1​−mˉ)2
代入p0+p1=1和mˉp_0+p_1=1和\bar mp0​+p1​=1和mˉ可简化为
σ2=p0p1(m0−m1)2\sigma^2=p_0p_1(m_0-m_1)^2σ2=p0​p1​(m0​−m1​)2
遍历灰度值,找出能使σ2\sigma^2σ2最大的值

cv实现

img = cv.imread('pic/eagle.jpg', 0)th, img_bin = cv.threshod(img, -1, 255, cv.THRESH_OTSU)
print(th)
show(img_bin)

底层复现

img = cv.imread('pic/eagle', 0)Sigma = -1
T = 0for t in range(0, 256):bg = img[img <= t]obj = img[img > t]p0 = bg.size / img.sizep1 = obj.size / img.sizem0 = 0 if obj.size==0 else bg.mean()m1 =  0 if obj.size==0 else obj.mean()sigma = p0*p1*(m0-m1)**2if sigma > Sigma:Sigma = sigmaT = t

自适应阈值

理论

算法思想:局部二值化

全局二值化容易受阴影影响,所以可以局部二值化。自适应阈值分割的本质就是局部二值化。

具体操作步骤

  1. 对某个像素值,原来为SSS,取其周围的n×nn \times nn×n的区域,求区域均值或高斯加权值,记为T;
  2. 对8位图像,如果S>TS>TS>T,则该像素点二值化为255,否则为0.

优化

  1. 在实际操作中,通过卷积操作,即均值模糊或高斯模糊,实现求区域均值或高斯加权值;
  2. 上面步骤中,增加超参数CCC,CCC可以为任何实数,当S>T−CS>T-CS>T−C时,把原像素二值化为255.
  3. 也可以设置超参数 α∈[0,1]\alpha \in [0,1]α∈[0,1],当S>(1−α)TS>(1-\alpha)TS>(1−α)T时把原像素点二值化为255,通常取α=0.15\alpha=0.15α=0.15。

注:邻域大小一般要大于目标大小,但也不能太大,否则效果不好。

CV实现

img = cv.imread('pic/page', 0)
show(img)

img_bin = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 21, 6)
show(img_bin)

6 就是上面的C,21就是核大小

底层复现

一. 通过超参数C实现

img = cv.imrad('pic/page', 0)C = 0
winSize = 21   // 和一个字体差不多大img_blur = cv.blur(img, (winSize, winSize))
show(img > img_blur)

C = 6img_bin = np.uint8(img>img_blur.astype(np.int) - C) * 255show(img_bin)


二. 通过超参数α\alphaα实现

img = cv.imread('pic/page.jpg', 0)alpha = 0.15
winSize = 21img_blur = cv.GaussianBlur(img, (winSize, winSize), 5)
img_bin = np.uint8(img > (1-alpha) * img_blur) * 255 show(img_bin)

对于参数不是很敏感

opencv实现阈值分割相关推荐

  1. Python+OpenCV:阈值分割

    Python+OpenCV:阈值分割 阈值分割 ############################################################################ ...

  2. OpenCV自适应阈值分割函数:adaptiveThreshold()介绍

    OpenCV自适应阈值分割函数:adaptiveThreshold()介绍 [注意] 1. adaptiveThreshold()函数的ThresholdTypes参数只能设置为"CV_TH ...

  3. opencv 图像阈值分割图像

    最简单的图像分割的方法. 应用举例:从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体).这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分 ...

  4. opencv 图像分割 阈值分割 图像二值化 灰度图

    # -*- coding: utf-8 -*- """ @File : 191213_测试_阈值分割.py @Time : 2019/12/13 15:14 @Autho ...

  5. python+openCV 自适应阈值分割

    当图像各局部亮度不同时,全局阈值就很难将背景和目标分割.因此提出了自适应阈值,即在图像的不同区域采用不同的阈值进行分割.利用函数cv2.adaptiveThreshold()进行分割. cv2.ada ...

  6. python+opencv实现阈值分割

    系列文章目录 文章目录 系列文章目录 前言 一.全局阈值 1.效果图 2.源码 二.滑动改变阈值(滑动条) 1.效果图 2.源码 三.自适应阈值分割 1.效果图 2.源码 3.GaussianBlur ...

  7. 基于OpenCV和C++实现最大阈值分割算法

    代码如下:: /******************************************************************************************** ...

  8. halcon 阈值分割

    Halcon算子学习:图像阈值分割算子 前言 1.threshold-全局固定阈值分割 2.Binary Threshold-自动全局阈值分割 3.dyn_threshold-局部动态阈值分割 小结: ...

  9. opencv阈值分割类型

    threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type); src:输入图,只能输入单通道图 ...

  10. opencv 阈值分割 — threshold()

    OpenCV阈值分割函数:threshold() 函数原型: double threshold(InputArray src, OutputArray dst, double thresh, doub ...

最新文章

  1. 美酒节成就及任务攻略指引
  2. AndroidMenifest.xml file missing 报错
  3. eclipse java字体 太小,如何在Eclipse for Java文本编辑器中更改字体大小?
  4. 【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(四)
  5. 如何使用css3做简单的动画效果?
  6. 丰桥自助打印顺丰面单
  7. 最小生生树算法-prim/kruskal
  8. ADA程序实例(面向对象特性之多态)
  9. 原生js生成渐变色数组集合
  10. 汇编语言学习笔记(续)
  11. 2022年度“十大基础研究关键词”在深发布
  12. ABAQUS学习之路
  13. ThinkPHP 5.0.23 远程代码执行 漏洞复现
  14. 特征多项式的基无关性
  15. 微信公众号 服务器自动回复,微信订阅后台自动回复功能的实现
  16. Altair Simdroid 流体分析模块介绍
  17. vb发出声音音乐代码
  18. 微信登录功能实现(可用)
  19. 电脑快捷方式图标变白的解决方式
  20. 秋季锻炼“十大法宝”

热门文章

  1. 中国大学MOOC(慕课)离线下载视频支持电脑播放
  2. mergesort java_排序--归并排序MergeSort(Java实现)
  3. Java开发框架!高级java工程师简历模板
  4. 可以在电脑上在线录制视频GIF的软件,不需要下载安装
  5. kali xss漏洞扫描工具使用教程
  6. 大二学生web期末大作业 在线电影网站 HTML+CSS+JS
  7. 高职高考计算机网课app,本人准备高职高考,但是初中数学基础不行,所以求一套不错的初中数学练习题,教材的话我就刷网课。...
  8. ps画画模糊笔刷_杨雪果ps笔刷|杨雪果CG绘画笔刷(Blur's good brush)下载v7.0 免费版 - 欧普软件下载...
  9. mac tree命令
  10. 【java】读取html乱码