欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中
【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法
3.1 阈值处理基础
阈值就是临界值。图像阈值处理简单、直观,计算速度快,是图像处理的基础操作,在图像分割中处于核心地位。
根据灰度值和灰度值的限制将图像划分为多个区域,或提取图像中的目标物体,是最基本的阈值处理方法。
例如,图像由暗色背景上的亮目标组成,目标像素和背景像素的灰度值组合构成两种主要模式,可以通过设定适当的阈值 T,将图像的像素划分为两类:灰度值大于 T 的像素集是目标,小于 T 的像素集是背景。
如果图像的直方图存在明显边界,容易找到图像的分割阈值;但如果图像直方图分界不明显,则很难找到合适的阈值,甚至可能无法找到固定的阈值有效地分割图像。
当 T 是应用于整幅图像的常数,称为全局阈值处理;当 T 对于整幅图像发生变化时,称为可变阈值处理。有时,对应于图像中任一点的 T 值取决于该点的邻域的限制,称为局部阈值处理。
当图像中存在高斯噪声时,通常难以通过全局阈值将图像的边界完全分开。如果图像的边界是在局部对比下出现的,不同位置的阈值也不同,使用全局阈值的效果将会很差。
OpenCV 提供了函数 cv.threshold 可以对图像进行阈值处理。
函数说明:
cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
函数 threshold() 可以将灰度图像转换为二值图像,图像完全由像素 0 和 255 构成,呈现出只有黑白两色的视觉效果。
灰度阈值化通过选取的灰度阈值 thresh,将每个像素的灰度值与阈值进行比较,将灰度大于阈值的像素点置为最大灰度,小于阈值的像素点置为最小灰度,得到二值图像,可以突出图像轮廓,把目标从背景中分割出来。
参数说明:
- scr:变换操作的输入图像,nparray 二维数组,必须是单通道灰度图像!
- thresh:阈值,取值范围 0~255
- maxval:填充色,取值范围 0~255,一般取 255
- type:变换类型
- cv2.THRESH_BINARY:大于阈值时置 255,否则置 0
- cv2.THRESH_BINARY_INV:大于阈值时置 0,否则置 255
- cv2.THRESH_TRUNC:大于阈值时置为阈值 thresh,否则不变(保持原色)
- cv2.THRESH_TOZERO:大于阈值时不变(保持原色),否则置 0
- cv2.THRESH_TOZERO_INV:大于阈值时置 0,否则不变(保持原色)
- cv2.THRESH_OTSU:使用 OTSU 算法选择阈值
- 返回值 retval:返回二值化的阈值
- 返回值 dst:返回阈值变换的输出图像
注意:
-
- 函数 cv2.threshold 进行固定阈值的二值化处理;函数 cv2.adaptiveThreshold 为自适应阈值的二值化处理函数,可以通过比较像素点与周围像素点的关系动态调整阈值。
-
- 确切地说,只有 type 为 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV 时输出为二值图像,其它变换类型时进行阈值处理但并不是二值处理。
例程 11.15:图像阈值处理之固定阈值法
# 11.15 图像阈值处理之固定阈值法# 生成灰度图像hImg, wImg = 512, 512img = np.zeros((hImg, wImg), np.uint8) # # 创建黑色图像 RGB=0cv2.rectangle(img, (60,60), (450,320), (127,127,127), -1) # -1 表示矩形填充cv2.circle(img, (256, 256), 120, (205,205,205), -1) # -1 表示圆形填充# 添加高斯噪声mu, sigma = 0.0, 25.0noiseGause = np.random.normal(mu, sigma, img.shape)imgNoise = img + noiseGauseimgNoise = np.uint8(cv2.normalize(imgNoise, None, 0, 255, cv2.NORM_MINMAX)) # 归一化为 [0,255]# 阈值处理ret, imgBin1 = cv2.threshold(img, 63, 255, cv2.THRESH_BINARY) # 阈值分割, thresh=63ret, imgBin2 = cv2.threshold(img, 125, 255, cv2.THRESH_BINARY) # 阈值分割, thresh=125ret, imgBin3 = cv2.threshold(img, 175, 255, cv2.THRESH_BINARY) # 阈值分割, thresh=175plt.figure(figsize=(10, 7))plt.subplot(231), plt.axis('off'), plt.title("original"), plt.imshow(img, 'gray')plt.subplot(232), plt.axis('off'), plt.title("original with noise"), plt.imshow(imgNoise, 'gray')plt.subplot(233, yticks=[]), plt.title("Gray Hist") # 直方图histNP, bins = np.histogram(imgNoise.flatten(), bins=255, range=[0, 255], density=True)plt.bar(bins[:-1], histNP[:])plt.subplot(234), plt.title("threshold=63"), plt.axis('off'), plt.imshow(imgBin1,'gray')plt.subplot(235), plt.title("threshold=125"), plt.axis('off'), plt.imshow(imgBin2,'gray')plt.subplot(236), plt.title("threshold=175"), plt.axis('off'), plt.imshow(imgBin3,'gray')plt.tight_layout()plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124181317)
Copyright 2022 youcans, XUPT
Crated:2022-4-15
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法
【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理
【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法
【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现
【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法
【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法
【youcans 的 OpenCV 例程200篇】166.自适应阈值处理
【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】