锐化图像以检测标记的边缘/线条" X"在纸上的对象

时间:2015-11-11 00:18:59

标签: python python-2.7 opencv numpy image-processing

我正在使用python& OpenCV的。我的目标是检测" X"用树莓pi相机拍摄的图像中的形状的碎片。该项目是我们有预先印制的井字板,每次将新件放在板上(带有油墨印章)时,必须对板进行成像。然后输出说明什么类型的件,如果有的话,在tic-tac-toe板的哪个部分。

在这里,我在图像中检测到的绿线:

正如您所看到的," X"似乎不容易检测到形状的碎片。某些邮票上只有一行可以看到。"

这里是过滤器后边缘检测的样子:

我检测" X"的方法成形件是在每个部分检查任何具有非水平/垂直斜率的线。我的问题是" X"形状的邮票不是完美的线条;因此,我的代码很难接受。

我尝试过应用非锐化滤镜,使用直方图均衡,只使用灰度进行边缘检测。这些都没有检测到任何" X"形状的一块。

大致我在做什么:

#sharpen image using blur and unsharp method
gaussian_1 = cv2.GaussianBlur(image, (9,9), 10.0)
unsharp_image = cv2.addWeighted(image, 1.5, gaussian_1, -0.5, 0, image)
#apply filter to find stamp pieces, histogram equalization on greyscale
hist_eq = cv2.equalizeHist(unsharp_image)
#edge detection (input,threshold1,threshold2,size_for_sobel_operator)
edges = cv2.Canny(hist_eq,50,150,apertureSize = 3)
#find lines (edges,min_pixels,min_degrees,min_intersections,lineLength,LineGap)
lines = cv2.HoughLinesP(edges,1,np.pi/180,50,minLineLength,maxLineGap)

只有我将这个单独应用于电路板的9个部分中的每个部分,但这并不重要。

TLDR: 如何制作我的图像,以便我的线条清晰"又尖锐?我想知道我可以用什么来制作一个标记的" X"看起来像几行。

2 个答案:

答案 0 :(得分:4)

您可以使用Otsu's robust method for determining the dual threshold value尝试Canny边缘检测器。

im = cv2.imread('9WJTNaZ.jpg', 0)
th, bw = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
edges = cv2.Canny(im, th/2, th)

然后你可以使用

  • 轮廓凸起缺陷

  • 填充轮廓的区域到轮廓边界框的区域

区分十字标记与圆圈。

这是我将Canny应用于您的图像时所得到的。

edges

答案 1 :(得分:0)

由于你正在使用墨水印章,实施边缘检测方法,然后某种字符识别方法(?)是一个艰难的方法。

您是否尝试过使用简单的连接组件算法?即使您的图像中出现照明变化,使用一些标准二值化技术进行一些修补也应该会产生合理的结果。

http://docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gsc.tab=0

一旦有了组件,就会有关于力矩,周长等的数据,这些数据会引导您快速进行计算以区分这两种标记。

无论使用何种技术,都应考虑先缩小图像大小,以便处理较少的像素。您可能会注意到创建较小图像的其他一些好处。

如果可以,请为相机添加一个小漫射光。这应该使您的编程任务更容易,检测更加健壮。