youcans 的 OpenCV 例程200篇147. 图像分割之孤立点检测
Posted 小白YouCans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了youcans 的 OpenCV 例程200篇147. 图像分割之孤立点检测相关的知识,希望对你有一定的参考价值。
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中
【youcans 的 OpenCV 例程200篇】147. 图像分割之孤立点检测
1. 图像分割基本概念
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。图像分割是由图像处理到图像分析的关键步骤,是计算机视觉的基础,也是图像理解的重要组成部分。
所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。简单的说就是在一副图像中,把目标从背景中分离出来。
从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像索赋予相同的编号。
图像分割的基本方法是基于图像灰度值的不连续性和相似性。基于不连续性的图像分割,是根据灰度的突变检测边界,将图像分割为多个区域;基于相似性的图像分割,是根据预定义的准则将图像分割为多个相似的区域。
常用的图像分割方法有:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。
2. 点、线和边缘检测
本节基于图像灰度的不连续性,讨论根据灰度的突变检测边界,以此为基础进行图像分割。
- 边缘像素是图像中灰度突变的像素,而边缘是相连边缘像素的集合。
- 线是一条细边缘线段,其两侧的背景灰度与线段的像素灰度存在显著差异。
- 孤立的点是一个被背景像素围绕的前景像素,或一个被前景像素围绕的背景像素。
导数可以用来检测灰度的局部突变:
- 一阶导数通常产生粗边缘;
- 二阶导数对精细细节(如细线、孤立点和噪声)的响应更强;
- 二阶导数在灰度斜坡和台阶过渡处会产生双边缘响应,即二阶导数在进入和离开边缘时的符号相反;
- 二阶导数的符号可用于确定边缘的过渡是从亮到暗还是从暗到亮。
计算图像中每个像素位置的一阶导数和二阶导数的方法是空间卷积。对一个 3*3 模板,计算模板区域内灰度值与模板系数的卷积。
2.1 图像的孤立点检测
孤立点的检测,是检测嵌在一幅图像的恒定区域或亮度几乎不变的区域里的孤立点。孤立点的检测以二阶导数为基础。
二阶导数的计算可以采用拉普拉斯二阶有限差分公式:
∇
2
f
=
∂
2
f
∂
x
2
+
∂
2
f
∂
y
2
∇
2
f
(
x
,
y
)
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
4
f
(
x
,
y
)
\\beginaligned \\nabla ^2 f &= \\dfrac\\partial ^2 f\\partial x ^2 + \\dfrac\\partial ^2 f\\partial y ^2 \\\\ \\nabla ^2 f(x,y) &= f(x+1,y) + f(x-1,y) + f(x,y+1) + f(x,y-1) - 4f(x,y) \\endaligned
∇2f∇2f(x,y)=∂x2∂2f+∂y2∂2f=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−4f(x,y)
拉普拉斯差分公式可以用拉普拉斯核的卷积来实现:
K
1
=
[
0
1
0
1
−
4
1
0
1
0
]
,
K
2
=
[
1
1
1
1
−
8
1
1
1
1
]
,
K
3
=
[
0
−
1
0
−
1
4
−
1
0
−
1
0
]
,
K
4
=
[
−
1
−
1
−
1
−
1
8
−
1
−
1
−
1
−
1
]
\\beginaligned &K1 = \\beginbmatrix 0 & 1 &0\\\\ 1 & -4 &1\\\\ 0 & 1 &0\\\\ \\endbmatrix, \\ &K2 = \\beginbmatrix 1 & 1 & 1\\\\ 1 & -8 & 1\\\\ 1 & 1 & 1\\\\ \\endbmatrix, \\\\ &K3 = \\beginbmatrix 0 & -1 &0\\\\ -1 & 4 &-1\\\\ 0 & -1 &0\\\\ \\endbmatrix, \\ &K4 = \\beginbmatrix -1 & -1 &-1\\\\ -1 & 8 &-1\\\\ -1 & -1 &-1\\\\ \\endbmatrix \\endaligned
K1=⎣⎡0101−41010⎦⎤, K3=⎣⎡0−10−14−10−10⎦⎤, K2=⎣⎡1111−81111⎦⎤,K4=⎣⎡−1−1−1−18−1−1−1−1⎦⎤
当孤立点在卷积模板的中心时,拉普拉斯滤波器的响应很强烈,而孤立点在非模板中心时,拉普拉斯滤波器响应为零。当滤波器在一个点的响应超过设定阈值 T,则认为在卷积核的中心检测到了孤立点,标记为 1,而其它点都被标记为 0,从而产生一副二值图像。
g
(
x
,
y
)
=
1
,
∣
Z
(
x
,
y
)
∣
>
T
0
,
e
l
s
e
g(x,y) = \\begincases 1, \\quad |Z(x,y)| > T \\\\ 0, \\quad else \\endcases
g(x,y)=1,∣Z(x,y)∣>T0,else
注意:
(1)本节所称的孤立点检测,是绝对意义上的孤立点,即一个孤立的像素。人眼所能感知、识别的孤立点,通常来说其实是一个微小的区域,而不是孤立的一个像素,因此并不能用这种方法检测。
(2)使用 Laplace 算子进行图像孤立点检测,推荐使用 scipy.signal 实现卷积运算,不建议使用 cv2.filter2D 实现。后者自动将卷积结果进行归一化处理,不便于通过阈值 T 检测孤立点。
例程 11.1:图像的孤立点检测
# 11.1 图像孤立点检测 (Laplace 算子)
imgGray = cv2.imread("../images/Fig1004.tif", flags=0)
hImg, wImg = imgGray.shape
# scipy.signal 实现卷积运算 (注意:不能用 cv2.filter2D 处理)
from scipy import signal
kernelLaplace = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]]) # Laplacian kernel
imgLaplace = signal.convolve2d(imgGray, kernelLaplace, boundary='symm', mode='same') # same 卷积
# 在原图上用半径为 5 的圆圈标记角点
T = 0.9 * max(imgLaplace.max(), -imgLaplace.min())
imgPoint = np.zeros((hImg, wImg), np.uint8) # 创建黑色图像
for h in range(hImg):
for w in range(wImg):
if (imgLaplace[h, w] > T) or (imgLaplace[h, w] < -T):
imgPoint[h, w] = 255 # 二值处理
cv2.circle(imgPoint, (w, h), 10, 255)
print(imgLaplace.shape, imgLaplace.max(), imgLaplace.min(), T)
plt.figure(figsize=(9, 6))
plt.subplot(131), plt.axis('off'), plt.title("Original")
plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255)
plt.subplot(132), plt.axis('off'), plt.title("Laplacian K2")
plt.imshow(imgLaplace, cmap='gray', vmin=0, vmax=255)
plt.subplot(133), plt.axis('off'), plt.title("Isolated point")
plt.imshow(imgPoint, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124005009)
Copyright 2022 youcans, XUPT
Crated:2022-4-1
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】01. 图像的读取(cv2.imread)
【youcans 的 OpenCV 例程200篇】02. 图像的保存(cv2.imwrite)
【youcans 的 OpenCV 例程200篇】03. 图像的显示(cv2.imshow)
【youcans 的 OpenCV 例程200篇】04. 用 matplotlib 显示图像(plt.imshow)
【youcans 的 OpenCV 例程200篇】05. 图像的属性(np.shape)
【youcans 的 OpenCV 例程200篇】06. 像素的编辑(img.itemset)
【youcans 的 OpenCV 例程200篇】07. 图像的创建(np.zeros)
【youcans 的 OpenCV 例程200篇】08. 图像的复制(np.copy)
【youcans 的 OpenCV 例程200篇】09. 图像的裁剪(cv2.selectROI)
【youcans 的 OpenCV 例程200篇】10. 图像的拼接(np.hstack)
【youcans 的 OpenCV 例程200篇】11. 图像通道的拆分(cv2.split)
【youcans 的 OpenCV 例程200篇】12. 图像通道的合并(cv2.merge)
【youcans 的 OpenCV 例程200篇】13. 图像的加法运算(cv2.add)
【youcans 的 OpenCV 例程200篇】14. 图像与标量相加(cv2.add)
【youcans 的 OpenCV 例程200篇】15. 图像的加权加法(cv2.addWeight)
【youcans 的 OpenCV 例程200篇】16. 不同尺寸的图像加法
【youcans 的 OpenCV 例程200篇】17. 两张图像的渐变切换
【youcans 的 OpenCV 例程200篇】18. 图像的掩模加法
【youcans 的 OpenCV 例程200篇】19. 图像的圆形遮罩
【youcans 的 OpenCV 例程200篇】20. 图像的按位运算
【youcans 的 OpenCV 例程200篇】21. 图像的叠加
【youcans 的 OpenCV 例程200篇】22. 图像添加非中文文字
【youcans 的 OpenCV 例程200篇】23. 图像添加中文文字
【youcans 的 OpenCV 例程200篇】24. 图像的仿射变换
【youcans 的 OpenCV 例程200篇】25. 图像的平移
【youcan以上是关于youcans 的 OpenCV 例程200篇147. 图像分割之孤立点检测的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 例程200篇236. 特征提取之主成分分析(OpenCV)
youcans 的 OpenCV 例程200篇184.鼠标交互标记的分水岭算法
youcans 的 OpenCV 例程200篇183.基于轮廓标记的分水岭算法
OpenCV 例程200篇236. 特征提取之主成分分析(OpenCV)