《数字图像处理-OpenCV/Python》连载:图像的阈值处理
本书京东 优惠购书链接 https://item.jd.com/14098452.html
本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html
第 9 章 图像的阈值处理
图像的阈值处理简单、直观,计算速度快,是很多图像处理算法的预处理过程。
本章内容概要
- 学习图像的阈值处理方法,理解不同阈值对处理结果的影响。
- 介绍利用图像局部特征的阈值处理方法,如自适应阈值处理和移动平均阈值处理。
- 介绍HSV模型,学习基于HSV颜色范围的彩色图像阈值处理。
9.1 固定阈值处理
根据灰度值和灰度值的限制将图像划分为多个区域,或提取图像中的目标物体,是最基本的阈值处理方法。
当图像中的目标和背景的灰度分布较为明显时,可以对整个图像使用固定阈值进行全局阈值处理。如果图像的直方图存在明显边界,则很容易找到图像的分割阈值,但如果图像的直方图分界不明显,则很难找到合适的阈值,甚至可能无法找到固定阈值有效地分割图像。
当图像中存在噪声时,通常难以通过全局阈值将图像的边界完全分开。如果图像的边界是在局部对比下出现的,使用全局阈值的效果会很差。
OpenCV中的函数cv.threshold用于对图像进行阈值处理。
函数原型
cv.threshold(src, thresh, maxval, type[, dst]) → retval, dst
参数说明
- src:输入图像,是多维Numpy数组,允许为单通道图像或多通道图像。
- dst:输出图像,与src的尺寸和通道数相同。
- thresh:阈值,是浮点型数据,取值范围为0~255。
- maxval:最大值,指饱和限值,用于部分变换类型,一般可取255。
- type:阈值变换类型。
- THRESH_BINARY:当大于阈值thresh时置为maxval,否则置为0。
- THRESH_BINARY_INV:当大于阈值thresh时置为0,否则置为maxval。
- THRESH_TRUNC:当大于阈值thresh时置为阈值thresh,否则保持不变。
- THRESH_TOZERO:当大于阈值thresh时保持不变,否则置为0。
- THRESH_TOZERO_INV:当大于阈值thresh时置为0,否则保持不变。
- THRESH_OTSU:使用OTSU算法自动确定阈值,可以组合使用。
- THRESH_TRIANGLE:使用Triangle算法自动确定阈值,可以组合使用。
- retval:返回的阈值图像。
注意问题
(1)retval通常是二值化的阈值图像,但在某些类型(如TRUNC、TOZERO、TOZERO_INV)中返回的是阈值饱和图像。
(2)函数允许输入单通道或多通道图像,但是输入多通道图像时,要对各通道独立进行阈值处理。返回的阈值图像也是多通道图像,而不是黑白的二值图像,在使用时要特别谨慎。
(3)阈值变换类型为使用OTSU算法、Triangle算法时,只能处理8位单通道输入图像。
(4)阈值变换类型为使用OTSU算法、Triangle算法时,阈值thresh不起作用。
【例程0901】阈值处理之固定阈值法
本例程使用固定阈值法对灰度图像进行阈值处理。对于多峰灰度分布图像,阈值大小会严重影响阈值处理的结果。
# 【0901】阈值处理之固定阈值法
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
if __name__ == '__main__':
# 生成灰度图像
hImg, wImg = 512, 512
img = np.zeros((hImg, wImg), np.uint8) # 创建黑色图像
cv.rectangle(img, (60, 60), (450, 320), (127, 127, 127), -1) # 矩形填充
cv.circle(img, (256, 256), 120, (205, 205, 205), -1) # 圆形填充
# 添加高斯噪声
mu, sigma = 0.0, 20.0
noiseGause = np.random.normal(mu, sigma, img.shape)
imgNoise = np.add(img, noiseGause)
imgNoise = np.uint8(cv.normalize(imgNoise, None, 0, 255, cv.NORM_MINMAX))
# 阈值处理
_, imgBin1 = cv.threshold(imgNoise, 63, 255, cv.THRESH_BINARY) # thresh=63
_, imgBin2 = cv.threshold(imgNoise, 125, 255, cv.THRESH_BINARY) # thresh=125
_, imgBin3 = cv.threshold(imgNoise, 175, 255, cv.THRESH_BINARY) # thresh=175
plt.figure(figsize=(9, 6))
plt.subplot(231), plt.axis('off'), plt.title("1. Original"), plt.imshow(img, 'gray')
plt.subplot(232), plt.axis('off'), plt.title("2. Noisy image"), plt.imshow(imgNoise, 'gray')
histCV = cv.calcHist([imgNoise], [0], None, [256], [0, 256])
plt.subplot(233, yticks=[]), plt.title("3. Gray hist")
plt.bar(range(256), histCV[:, 0]), plt.axis([0, 255, 0, np.max(histCV)])
plt.subplot(234), plt.axis('off'), plt.title("4. threshold=63"), plt.imshow(imgBin1, 'gray')
plt.subplot(235), plt.axis('off'), plt.title("5. threshold=125"), plt.imshow(imgBin2, 'gray')
plt.subplot(236), plt.axis('off'), plt.title("6. threshold=175"), plt.imshow(imgBin3, 'gray')
plt.tight_layout()
plt.show()
程序说明:
(1) 运行结果,使用固定阈值法对图像进行阈值处理如图9-1所示。图9-1(1)所示为程序生成的测试图,图9-1(2)所示为在图9-1(1)上添加了高斯噪声,图9-1(3)所示为图9-1(2)的灰度直方图,具有3个显著的灰度峰值分布。
(2) 图9-1(4)~(6)所示为不同阈值对图9-1(2)进行阈值处理所得到的二值图像,结果是完全不同的。表明对于多峰灰度分布图像,阈值大小会严重影响阈值处理的结果。
(3) 图9-1(4)~(6)的分割结果中都带有大量噪点,表明噪点也会影响阈值处理的结果。
图9-1 使用固定阈值法对图像进行阈值处理
**
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/135164986)
Copyright 2023 youcans, XUPT
Crated:2023-12-23
《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html