金蝶进销存软件免费版,汕头网站推广优化,对电子商务网站设计的理解,网页美工设计入门详解欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列#xff0c;持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理 3.4 全局阈值处理改进方法
在实际的图像处理中#xff0c;噪声严重影响阈值处理的… 欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理 3.4 全局阈值处理改进方法
在实际的图像处理中噪声严重影响阈值处理的结果严重的噪声会把简单的阈值处理问题变为不能解决的问题。
例程 11.21使用 Laplace 边缘信息改进全局阈值处理
对于酵母细胞图像希望通过全局阈值处理等等图像中与亮点对应的区域。如果直接使用 OTSU 方法可以分割细胞区域但不能检测亮点。
使用 Laplace 算子计算梯度可以得到亮点的边缘像素忽略背景区域像素对直方图的贡献可以改善直方图的分布从而便于通过阈值处理进行分割。
具体步骤如下
1计算图像 f(x,y)f(x,y)f(x,y) 的 Laplace 算子得到梯度图像 2以灰度值的 99.5% 分位为阈值对梯度图像进行二值处理作为遮罩模板以排除无效背景像素的影响 3基于遮罩模板计算图像 f(x,y)f(x,y)f(x,y) 的直方图分布即只对 gT(x,y)1g_T(x,y)1gT(x,y)1 的像素进行统计计算 4基于遮罩模板的直方图分布采用 OTSU 算法计算最佳分割阈值 5使用 OTSU 算法得到的最佳分割阈值对图像 f(x,y)f(x,y)f(x,y) 进行全局阈值处理。
注意本例中用 OTSU 算法求非零像素的最佳分割阈值不能通过调用 cv2.threshold() 获得。 # 11.21 使用 Laplace 边缘信息改进全局阈值处理img cv2.imread(../images/Fig1043a.tif, flags0)# # 全局阈值处理作为参照比较histCV1 cv2.calcHist([img], [0], None, [256], [0, 256]) # 灰度直方图ret1, imgOtsu cv2.threshold(img, 127, 255, cv2.THRESH_OTSU) # 阈值分割, threshT# (1) 计算 Laplacian 梯度算子laplace cv2.Laplacian(img, cv2.CV_32F, ksize3) # Laplace 卷积算子grad cv2.convertScaleAbs(laplace)gradMax np.int(np.max(grad))# (2) 以灰度值的 99.5% 分位为阈值, 对边缘图像进行二值处理, 作为遮罩模板per995 np.percentile(grad, q99.5) # 99.5 分位的灰度值, [0, per995] 占比99.5%_, gradPer995 cv2.threshold(np.uint8(grad), per995, 1, cv2.THRESH_BINARY) # 对边缘图像二值处理# (3) 计算基于遮罩模板的直方图分布以排除无效背景像素的影响fp np.uint8(img * gradPer995)histCV2 cv2.calcHist([fp], [0], None, [256], [0, 256])histCV2[0] 0 # fp 非零像素直方图# (4) OTSU 算法计算 fp 非零像素的最佳分割阈值# nonzeroPixels np.count_nonzero(gradPer995) # 非零像素总数nonzeroPixels sum(histCV2[1:]) # 非零像素总数totalGray np.dot(histCV2[:,0], range(256)) # 内积, 总和灰度值mG totalGray / nonzeroPixels # 平均灰度icv np.zeros(256)numFt, sumFt 0, 0for t in range(0, 256): # 遍历灰度值numFt histCV2[t,0] # F(t) 像素数量sumFt histCV2[t,0] * t # F(t) 灰度值总和pF numFt / nonzeroPixels # F(t) 像素数占比mF (sumFt/numFt) if numFt0 else 0 # F(t) 平均灰度numBt nonzeroPixels-numFt # B(t) 像素数量sumBt totalGray - sumFt # B(t) 灰度值总和pB numBt / nonzeroPixels # B(t) 像素数占比mB (sumBt/numBt) if numBt0 else 0 # B(t) 平均灰度icv[t] pF * (mF-mG)**2 pB * (mB-mG)**2 # OTSU 算法: 灰度 t 的类间方差maxIcv max(icv) # ICV 的最大值maxIndex np.argmax(icv) # 最大值的索引print(per995, nonzeroPixels, maxIcv, maxIndex)# 使用 fp 非零像素的最佳分割阈值对原始图像进行固定阈值处理ret, imgBin cv2.threshold(img, maxIndex, 255, cv2.THRESH_BINARY) # 以 maxIndex 作为最优阈值plt.figure(figsize(10, 7))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.title(OTSU binary(T{}).format(round(ret1))), plt.axis(off)plt.imshow(imgOtsu, gray)plt.subplot(234), plt.axis(off), plt.title(Threshold of Laplacian)plt.imshow(gradPer995, cmapgray) # 遮罩模板Laplacian 995 分位plt.subplot(235, yticks[]), plt.title(Hist of boundries) # 直方图plt.bar(range(256), histCV2[:,0])plt.subplot(236), plt.title(OTSU by Laplacian(T{}).format(maxIndex)), plt.axis(off)plt.imshow(imgBin, gray)plt.show()本节完 版权声明
youcansxupt 原创作品转载必须标注原文链接(https://blog.csdn.net/youcans/article/details/124281445)
Copyright 2022 youcans, XUPT Crated2022-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更新】