带阈值图像的边缘检测
Edge Detection with Thresholded Image
我正在尝试正确检测经过模糊、灰度化和阈值处理的扑克牌边缘。我认为具有鲜明的黑白对比会使边缘很容易被检测到,但到目前为止还没有任何乐趣。我开始于:
并使用我编写的 Canny Edge Detector 生成这个:
索贝尔的结果基本相同。但是使用 OpenCV 的 Canny Detection 我可以产生这个:
我迫切需要在自己的代码中重新创建正确装配在一起的边框,而且我不致力于使用任何特定类型的边缘检测,我只需要找到一种算法可以提供我连接的边缘!可以找到我的 Canny 代码 here, and it is very much based from the LIRE code 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},使边变白
对于这张干净的图像,您不需要复杂的算法。几个简单的过滤器就可以解决问题。
在 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) );
我没有读过你的代码,但我观察到一个奇怪的伪影:沿着水平边缘,检测到的像素出现在孤立的 8 连接三元组中。我怀疑非最大抑制逻辑存在缺陷。 (无论如何,某处存在各向异性。)
也就是说,二值图像的边缘检测可以通过contour tracing来完成。
我正在尝试正确检测经过模糊、灰度化和阈值处理的扑克牌边缘。我认为具有鲜明的黑白对比会使边缘很容易被检测到,但到目前为止还没有任何乐趣。我开始于:
并使用我编写的 Canny Edge Detector 生成这个:
索贝尔的结果基本相同。但是使用 OpenCV 的 Canny Detection 我可以产生这个:
我迫切需要在自己的代码中重新创建正确装配在一起的边框,而且我不致力于使用任何特定类型的边缘检测,我只需要找到一种算法可以提供我连接的边缘!可以找到我的 Canny 代码 here, and it is very much based from the LIRE code 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},使边变白
对于这张干净的图像,您不需要复杂的算法。几个简单的过滤器就可以解决问题。
在 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) );
我没有读过你的代码,但我观察到一个奇怪的伪影:沿着水平边缘,检测到的像素出现在孤立的 8 连接三元组中。我怀疑非最大抑制逻辑存在缺陷。 (无论如何,某处存在各向异性。)
也就是说,二值图像的边缘检测可以通过contour tracing来完成。