那里有大量的示例实现。Google是您的朋友:)
编辑
以下是该过程的伪代码(非常类似于在2D中进行卷积)。我确定还有更聪明的方法可以做到:
// grayscale image, binary mask
void morph(inImage, outImage, kernel, type) {
// half size of the kernel, kernel size is n*n (easier if n is odd)
sz = (kernel.n - 1 ) / 2;
for X in inImage.rows {
for Y in inImage.cols {
if ( isOnBoundary(X,Y, inImage, sz) ) {
// check if pixel (X,Y) for boundary cases and deal with it (copy pixel as is)
// must consider half size of the kernel
val = inImage(X,Y); // quick fix
}
else {
list = [];
// get the neighborhood of this pixel (X,Y)
for I in kernel.n {
for J in kernel.n {
if ( kernel(I,J) == 1 ) {
list.add( inImage(X+I-sz, Y+J-sz) );
}
}
}
if type == dilation {
// dilation: set to one if any 1 is present, zero otherwise
val = max(list);
} else if type == erosion {
// erosion: set to zero if any 0 is present, one otherwise
val = min(list);
}
}
// set output image pixel
outImage(X,Y) = val;
}
}
}
上面的代码基于本教程 (请在页面末尾查看源代码)。
编辑2 :
list.add(inImage(X + I-sz,Y + J-sz));
这个想法是我们要在(X,Y)处的当前图像像素上叠加以sz(mask的一半大小)为中心的大小为nxn的内核掩模,然后仅获取掩模所在像素的强度值是一个(我们正在将它们添加到列表中)。提取该像素的所有邻居后,我们将输出图像像素设置为该列表的最大值(最大强度)以进行扩张,并设置为min进行侵蚀(当然这仅适用于灰度图像和二进制蒙版)
上面的语句中X / Y和I / J的索引都假定从0开始。如果愿意,您总是可以将I / J的索引重写为掩码大小的一半(从-sz到+ sz)进行了很小的更改(我链接到的教程使用的方式)...
范例 :
考虑一下放置在像素(X,Y)上并居中的3x3内核蒙版,并查看我们如何遍历其周围的邻域:
--------------------
| | | | sz = 1;
-------------------- for (I=0 ; I<3 ; ++I)
| | (X,Y) | | for (J=0 ; J<3 ; ++J)
-------------------- vect.push_back( inImage.getPixel(X+I-sz, Y+J-sz) );
| | | |
--------------------
0
我对二进制图像中的扩张方法有理论上的了解。
AFAIK,如果我的SE(结构元素)是这个
在哪里。代表中心,我的形象(二进制)
所以扩张的结果是
根据SE,我通过在0,+ 1(上)和-1(左)方向上移动Image并采用所有这三个移位的并集来获得上述结果。
现在,我需要弄清楚如何在C,C ++中实现这一点。我不确定如何开始以及如何结合集合。我想到了通过合并获得原始图像,三个移位图像和最终图像。全部使用矩阵。
在什么地方可以得到一些示例解决方案开始或有什么想法可以进行?
谢谢。