我试图正确地检测已经模糊,灰度化然后设定阈值的扑克牌的边缘。我认为具有鲜明的黑白对比度会使边缘很容易被发现,但到目前为止还没有快乐。我从:
开始使用Canny Edge Detector我写了这个:
索贝尔的结果基本相同。但是,使用OpenCV的Canny Detection我可以产生这个:
边框正确安装在一起是我迫切需要在我自己的代码中重新创建的,并且我没有承诺使用任何特定类型的边缘检测,我只需要找到一个算法,会给我连接的优势!我可以找到我的Canny代码here,它非常基于LIRE代码here.如果有人可以帮助我从第一张图片到第三张图片我会非常感激!任何边缘检测欢迎!
编辑:NMS代码:
//main program
for(int x = 1; x < width-1; x++)
{
for(int y = 1; y < height-1; y++)
{
if(src.getRaster().getPixel(x, y, tmp)[0] >= 250)
{
trackWeakOnes(x, y, src);
}
}
}
private static void trackWeakOnes(int x, int y, BufferedImage src)
{
for (int a = x - 1; a <= x + 1; a++)
{
for (int b = y - 1; b <= y + 1; b++)
{
if (checkWeak(a, b, src))
{
src.getRaster().setPixel(x, y, tmpMax);
trackWeakOnes(a, b, src);
}
}
}
}
private static boolean checkWeak(int x, int y, BufferedImage src)
{
return ((src.getRaster().getPixel(x, y, tmpPix)[0] > 0) &&
(src.getRaster().getPixel(x, y, tmpPix)[0] < 255));
}
tmpPix是一个要填充的空数组,tmpMax是一个数组{255,255,255},使边缘变白。
答案 0 :(得分:1)
对于这个干净的图像,您不需要复杂的算法。一些简单的过滤器可以解决问题。
在matlab中,代码如下:
O=abs(filter2([-1 0 1],I))+abs(filter2([-1;0;1],I));
表示对于每个像素(x,y),您执行:
output(x,y) = abs( I(x+1,y)-I(x-1,y) ) + abs( I(x,y+1) - I(x,y-1) );
答案 1 :(得分:1)
我没有读过您的代码,但我观察到一个奇怪的神器:沿着水平边缘,检测到的像素进入隔离的8连接三元组。我怀疑非最大抑制逻辑中存在缺陷。 (在任何情况下,某处都存在各向异性。)
这就是说,二进制图像的边缘检测可以通过contour tracing完成。