欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
OpenCV 例程200篇 总目录-202205更新
【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理
3.4 全局阈值处理改进方法
在实际的图像处理中,噪声严重影响阈值处理的结果,严重的噪声会把简单的阈值处理问题变为不能解决的问题。
例程 11.20:基于边缘信息改进全局阈值处理
对于大背景中的小目标,图像的直方图受到背景的大波峰控制,即由于背景内容太多而将目标在直方图中淹没了,使全局阈值处理容易失败。
如果只利用接近目标和背景之间的边缘的像素,忽略无效的背景区域像素对直方图的贡献,可以改善直方图的分布,从而便于通过阈值处理进行分割。
具体步骤如下:
(1)计算图像 f(x,y)f(x,y)f(x,y) 的梯度算子,得到梯度幅值图像;
(2)对梯度幅值图像进行二值处理,选取强边缘像素作为遮罩模板 gT(x,y)g_T(x,y)gT(x,y),以排除无效背景像素的影响;
(3)基于遮罩模板计算图像 f(x,y)f(x,y)f(x,y) 的直方图分布,即只对 gT(x,y)=1g_T(x,y)=1gT(x,y)=1 的像素进行统计计算;
(4)由基于遮罩模板的直方图找到适当的分割阈值,对图像 f(x,y)f(x,y)f(x,y) 进行全局阈值处理。
# 11.20 基于边缘信息改进全局阈值处理img = cv2.imread("../images/Fig1041a.tif", flags=0)# # 全局阈值处理,作为参照比较histCV1 = cv2.calcHist([img], [0], None, [256], [0, 256]) # 灰度直方图totalPixels = img.shape[0] * img.shape[1] # 像素总数totalGray = np.dot(histCV1[:,0], range(256)) # 内积, 总和灰度值meanGray = round(totalGray/totalPixels) # 平均灰度ret, imgBin = cv2.threshold(img, meanGray, 255, cv2.THRESH_BINARY) # thresh=meanGray# (1) 计算 Sobel 梯度算子SobelX = cv2.Sobel(img, cv2.CV_32F, 1, 0) # 计算 x 轴方向SobelY = cv2.Sobel(img, cv2.CV_32F, 0, 1) # 计算 y 轴方向grad = np.sqrt(SobelX**2 + SobelY**2)gradMax = np.int(np.max(grad))# (2) 设置阈值 T=0.3*gradMax,对梯度图像进行阈值处理,作为遮罩模板_, maskBW= cv2.threshold(np.uint8(grad), 0.3*gradMax, 255, cv2.THRESH_BINARY)# (3) 计算基于遮罩模板的直方图分布,以排除无效背景像素的影响histCV2 = cv2.calcHist([img], [0], maskBW, [256], [0, 256])histCV2[0] = 0# (4) 排除无效背景像素影响后,进行阈值处理Tmask = 120 # 观察直方图 histCV2,找到分割阈值_, imgBin2 = cv2.threshold(img, Tmask, 255, cv2.THRESH_BINARY)print(gradMax, meanGray)plt.figure(figsize=(9,6))plt.subplot(231), plt.axis('off'), plt.title("Origin"), plt.imshow(img, 'gray')plt.subplot(232,yticks=[]), plt.axis([0,255,0,np.max(histCV1)])plt.bar(range(256), histCV1[:,0]), plt.title("Gray Hist")plt.subplot(233), plt.axis('off'), plt.title("Binary"), plt.imshow(imgBin, 'gray')plt.subplot(234), plt.axis('off'), plt.title("Threshold of Sobel")plt.imshow(maskBW, cmap='gray')plt.subplot(235, yticks=[]), plt.title("Hist of boundries") # 直方图plt.bar(range(256), histCV2[:,0])plt.subplot(236), plt.axis('off'), plt.title("Binary by edge improved")plt.imshow(imgBin2, 'gray')plt.tight_layout()plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124281390)
Copyright 2022 youcans, XUPT
Crated:2022-4-18
欢迎关注 『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更新】