那里有大量的示例实现..Google http://www.google.com/search?q=erosion+morph+filetype:c是你的朋友 :)
EDIT
以下是该过程的伪代码(与二维卷积非常相似)。我确信有更聪明的方法可以做到这一点:
// 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;
}
}
}
上面的代码是基于这个tutorial http://www.pages.drexel.edu/~weg22/edge.html(查看页面末尾的源代码)。
EDIT2:
list.add( inImage(X+I-sz, Y+J-sz) );
我们的想法是,我们想要将以 sz(掩模大小的一半)为中心的内核掩模(大小为 nxn)叠加到位于 (X,Y) 的当前图像像素上,然后获取掩模所在像素的强度值是一(我们将它们添加到列表中)。提取该像素的所有邻居后,我们将输出图像像素设置为该列表的最大值(最大强度)以进行膨胀,并将最小值设置为腐蚀(当然,这仅适用于灰度图像和二元掩模)
上述语句中的 X/Y 和 I/J 的索引都假设从 0 开始。
如果您愿意,您可以随时以掩码大小的一半(从 -sz 到 +sz)重写 I/J 的索引,并进行一些小的更改(我链接到的教程使用的方式)...
Example:
考虑这个放置在像素 (X,Y) 上并以像素 (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) );
| | | |
--------------------