【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理

欢迎关注 『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", flags=0)# # 全局阈值处理,作为参照比较histCV1 = cv2.calcHist([img], [0], None, [256], [0, 256])  # 灰度直方图ret1, imgOtsu = cv2.threshold(img, 127, 255, cv2.THRESH_OTSU)  # 阈值分割, thresh=T# (1) 计算 Laplacian 梯度算子laplace = cv2.Laplacian(img, cv2.CV_32F, ksize=3)  # Laplace 卷积算子grad = cv2.convertScaleAbs(laplace)gradMax = np.int(np.max(grad))# (2) 以灰度值的 99.5% 分位为阈值, 对边缘图像进行二值处理, 作为遮罩模板per995 = np.percentile(grad, q=99.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 numFt>0 else 0  # F(t) 平均灰度numBt = nonzeroPixels-numFt  # B(t) 像素数量sumBt = totalGray - sumFt  # B(t) 灰度值总和pB = numBt / nonzeroPixels  # B(t) 像素数占比mB = (sumBt/numBt) if numBt>0 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, cmap='gray')  # 遮罩模板,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()

在这里插入图片描述


(本节完)


版权声明:

youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124281445)

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更新】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乘法口诀表

java程序之乘法口诀表的实现。 结果演示 代码演示 package com.seven;public class Cfb {public static void main(String[] args) {for(int i1;i<9;i){for(int j1;j<i;j){System.out.print(j"*"i""(j*i));}System.out.println("");}}…

mysql explain 派生表_MySQL的Explain命令

Explain命令是查看查询优化器如何决定执行查询的主要办法。调用 EXPLAIN要使用EXPLAIN&#xff0c;只需在查询中的SELECT关键字之前增加EXPLAIN。MySQL会在查询上设置一个标记。当执行查询时&#xff0c;这个标记会使其返回关于在执行计划中每一步的信息&#xff0c;而不是执行…

【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法 3.5 多阈值处理方法 OTSU 方法使用最大化类间方差&#xff08;intra-class variance&#xff09;作为…

完全数

java程序实现完全数&#xff0c;那么什么是完全数的呢&#xff0c;完全数&#xff0c;又称完美数或完备数&#xff0c;是一些特殊的自然数。它所有的真因子&#xff08;即除了自身以外的约数&#xff09;的和&#xff08;即因子函数&#xff09;&#xff0c;恰好等于它本身。 …

【youcans 的 OpenCV 例程200篇】166.自适应阈值处理

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】166.自适应阈值处理 3.6 自适应阈值处理 噪声和非均匀光照等因素对阈值处理的影响很大&#xff0c;例如光照复杂时 Otsu 算法等全…

任一汉字在Unicode表中的顺序

查询任意一个汉字在Unicode表中的顺序并进行输出显示。 结果演示 代码演示 package com.seven; public class WeiZhi {public static void main(String[] args) {char A 我;System.out.println("汉字 我 在Unicode表中的顺序&#xff1a;"(int)A);}}了解更多关注…

【youcans 的 OpenCV 例程200篇】168.图像分割之区域生长

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】168.图像分割之区域生长 4. 区域分割的基本方法 4.1 区域生长 区域生长方法将具有相似性质的像素…

倒三角

Java实现一个倒立的三角形形状进行输出显示。根据文本提示输入一个整数&#xff0c;输入的整数是生成的倒三角形的行数&#xff0c;输入整数之后点击回车下面就会呈现出你想要得到的三角形。 结果演示 代码演示 package com.eight; import java.util.Scanner; public class …

mysql中文注入_SQL注入之Mysql报错注入

——志向和热爱是伟大行为的双翼。昨天偷懒了没学什么东西&#xff0c;先自我反省一下 - -。今天认真的学习了一下Mysql报错注入利用方法及原理&#xff0c;好久之前就像认真的学一下这个了&#xff0c;是在上海市大学生网络安全大赛中遇到的web100。当时懵逼状态&#xff0c;被…

计算字符位置

根据已有的字符串找到自己想要的字符位置&#xff0c;程序会帮助你找到你想要的任意字符的位置&#xff0c;包括一共有几个这样的字符&#xff0c;第一次在哪里出现&#xff0c;最后一次在哪里出现等。 结果演示 代码演示 package com.eight; public class FangFa {public s…

【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理 3.7 基于移动平均的可变阈值处理 移动平均法是一种简单高效的局…

【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离 ### 4.2 区域分离与聚合 区域分裂合并算法的基本思想是将图像细分为一组…

多彩三角形

H5特效多才三角形&#xff0c;使用H5新特性canvas画布制作的四周阴影效果中部出现很多的各种颜色的三角形。 效果演示 代码演示 <!DOCTYPE HTML> <html><head><title>demo</title><style type"text/css">body {margin: 0;pa…

ado.net mysql 连接池_ADO.NET数据连接池

【IT168 技术文档】21世纪什么最贵&#xff1f;数据库连接。对于以数据库做数据存储基石的应用系统来说&#xff0c;数据库连接是整个系统中最珍贵的资源之一。数据库连接池是为了更有效地利用数据库连接的最重要措施。它对于一个大型的应用系统的性能至关重要&#xff0c;特别…

【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类

【OpenCV 例程200篇】 系列&#xff0c;持续更新中… 【OpenCV 例程200篇 总目录-202205更新】 【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类 5. 区域分割之聚类方法 5.1 基于 k 均值聚类的区域分割 聚类方法的思想是将样本集合按照其特征的相似性划分为若干类别…

计算名次和奖学金

使用Java的switch的判断计算学生的名次和对应的奖学金&#xff0c;根据文本提示输入你的名词&#xff0c;点击Enter之后会出现你应该获得的奖学金金额。 结果演示 代码演示 package com.eight; import java.util.Scanner; public class Mingci {public static void main(Str…

android反射开启通知_Android中反射的简单应用

自己对反射的理解和应用还处于比较浅显的阶段&#xff0c;写这篇文章更多在于整理总结&#xff0c;也就是帮助自己进一步的理解和学习反射机制。反射反射的概念是由Smith在1982年首次提出的&#xff0c;主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。java中类反…

【OpenCV 例程200篇 目录-202205更新】

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【OpenCV 例程200篇 目录】 更新日期&#xff1a;2022-05-12 【youcans 的 OpenCV 例程200篇】01. 图像的读取&#xff08;cv2.im…

最大值平均值和排序

根据文本提示输入五个年龄&#xff0c;点击Enter之后程序会输出五个年龄中最大的年龄&#xff0c;平均年龄即年龄从小到大的排序分别是啥。 结果演示 代码演示 package com.nine; import java.util.Scanner; import java.util.Arrays; public class Shuzu {public static v…

【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割 5. 区域分割之聚类方法 5.2 基于超像素的区域分割 超像素图像分割基于依赖于图像的颜色信息及空间关系信息&#xff0c;将图像分割为远超于目标个数、远小于像素数量的超像素块&…