我正在尝试使用EmguCV在C#中进行Skeletonization。我正在使用本页底部的示例,它是用C ++编写的,我尝试了它并且它可以工作: http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/
我已将鳕鱼转换为C#,如下所示:
Image<Gray, Byte> eroded = new Image<Gray, byte>(img2.Size);
Image<Gray, Byte> temp = new Image<Gray, byte>(img2.Size);
Image<Gray, Byte> skel = new Image<Gray, byte>(img2.Size);
skel.SetValue(0);
CvInvoke.cvThreshold(img2, img2, 127, 256, 0);
StructuringElementEx element = new StructuringElementEx(3, 3, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_CROSS);
bool done = false;
while (!done)
{
CvInvoke.cvErode(img2, eroded, element,1);
CvInvoke.cvDilate(eroded, temp, element,1);
temp = img2.Sub(temp);
skel = skel | temp;
img2 = eroded;
if (CvInvoke.cvCountNonZero(img2) == 0) done = true;
}
但这不起作用!怎么了? 在while循环开始时,它会侵蚀图像'img2'并将其保存为'eroded',然后扩展'eroded'然后将其保存为'temp'。在上面的C#代码中,这导致'temp = img2',这是有道理的。那么为什么这个在C ++代码而不是C#中工作呢?在上面的C#代码中定义'element'的方式有问题吗?
提前致谢!
答案 0 :(得分:1)
您的代码可以正常使用这样的图像:http://i.stack.imgur.com/YMA4r.jpg
我认为你使用的是图像,白色背景而不是黑色。
简单的方法是颠倒你的形象。
Image<Gray, Byte> invert_img = (new Image<Gray, byte>(img_old.Width, img_old.Height, new Gray(255))).Sub(img_old);
然后你可以将其反转。
skel = (new Image<Gray, byte>(img_old.Width, img_old.Height, new Gray(255))).Sub(skel);
答案 1 :(得分:1)
Aforge Library提供骨架化功能
http://www.aforgenet.com/framework/docs/html/c0cc0715-0e71-cf63-e1cd-922786f5786e.htm