基本上,我想重新创建分水岭算法,如opencv python教程所示:https://docs.opencv.org/3.4/d3/db4/tutorial_py_watershed.html
本教程使用分水岭算法查找此图像上的等值线:
,结果为:
我用C#和EmguCV编写的代码如下:
var img = new image<Bgr,byte>("coins.png");
var mask = img.Convert<Gray, byte>().ThresholdBinary(new Gray(100), new Gray(255));
Mat distanceTransform = new Mat();
CvInvoke.DistanceTransform(mask, distanceTransform, null, Emgu.CV.CvEnum.DistType.L2, 3);
CvInvoke.Normalize(distanceTransform, distanceTransform, 0, 255, Emgu.CV.CvEnum.NormType.MinMax);
var threholded = distanceTransform.ToImage<Gray, byte>().ThresholdBinary(new Gray(200), new Gray(255));
CvInvoke.Threshold(threholded, threholded, 0, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
CvInvoke.ConnectedComponents(threholded, threholded);
var finalMarkers = threholded.Convert<Gray, Int32>();
CvInvoke.Watershed(img, finalMarkers);
Image<Gray, byte> boundaries = finalMarkers.Convert<byte>(delegate (Int32 x)
{
return (byte)(x == -1 ? 255 : 0);
});
CvInvoke.Imshow("ame", boundaries);
使用这段代码,我得到了以下结果:
在某种程度上它离预期的结果不远但显然不正确,它似乎自动填补了一些轮廓中硬币之间的空白区域。
我尝试了很多方法,但是我被卡住了。我试着添加"确定背景区域",但没有任何成功,无法改进这段代码,所以我真的不知道该怎么做。
谢谢你的帮忙!
1条答案
按热度按时间pbgvytdp1#
为了获得完全相同的结果,我们必须严格按照教程的步骤进行操作。
在Python中,教程阶段相对简单(如果你了解Python)。
使用EmguCV从Python转换到C#有点挑战性,因为我们必须找到NumPy操作的EmguCV替换。
我不介意练习一些C# EmguCV,并且严格按照教程进行操作:
我希望你能按照代码样本-有些部分是有点挑战性...
输出:
注:
教程中的颜色错误(红色和蓝色通道交换)。
以上颜色正确。