0. 完整仓库 & 教程:
这一章节的完整代码在:Chapter 8. Erosion, Dilation, Opening, Closing, and Connection
如果你喜欢这个系列的文章或者感觉对你有帮助,请给我的仓库一个⭐️。
1. 腐蚀、膨胀、开运算和闭运算
1.1 腐蚀
算法:
当 中的集合 𝐴 和 集合𝐵 ,𝐵 对 𝐴 的侵蚀表示为 𝐴⊖𝐵 ,定义为:
在代码的实现中,该算法使用卷积内核(convolution kernel) 𝐵 对图像 𝐴 与进行卷积。内核 𝐵 具有可定义的锚点,即中心点。然后在图像上滑动内核 𝐵,提取内核 𝐵 覆盖区域的最小像素值,并替换锚点处的像素。
图像和结果对比(noisy_fingerprint, noise_rectangle):
结果分析:
腐蚀操作将减少图像中的高光区域(在我们的例子中为纯白色)。 它本质上是沿着图中物体的边界移除像素并减小物体的大小。 它具有减少零星高光噪点的效果,并且其效果随着卷积元素尺寸的增大而增加,同时消耗的时间也会急剧增加。
代码实现(完整代码见顶部GitHub):
for(int i = 0; i < image->Height; i++) {
for(int j = 0; j < image->Width; j++) {
int min = 255;
// the size of structual element can be changed values of x and y:
for(int x = -1; x <= 1; x++) {
for(int y = -1; y <= 1; y++) {
int temp = tempin[(image->Width)*(i+x) + (j+y)];
if(temp < min) min = temp;
}
}
tempout[image->Width * i + j] = min;
}
}
1.2 膨胀
算法:
当 中的集合 𝐴 和 集合𝐵 ,𝐵 对 𝐴 的膨胀表示为 𝐴⊕𝐵 ,定义为:
与腐蚀算法类似,它也使用卷积内核 𝐵 对图像 𝐴 与进行卷积。 然后在图像上滑动核𝐵,提取核𝐵覆盖区域的最大像素值,并替换中心点的像素。
图像和结果对比(noisy_fingerprint, noise_rectangle):
结果分析:
膨胀与腐蚀相反,它将放大图像中的高光区域(在我们的例子中为纯白色)。 它具有放大细节的效果,放大的程度取决于卷积元素的大小。 但膨胀操作会放大图像中不需要的零星噪声。
代码实现(完整代码见顶部GitHub):
for(int i = 0; i < ima