thu*_*olt 5 python opencv numpy image-processing python-2.7
我正在使用python&opencv。我的目标是在用树莓派相机拍摄的图像中检测“ X”形碎片。该项目是我们已经预先印制了井字棋盘,并且每次将新棋子放置在棋盘上(带有墨水戳记)时,都必须为该棋盘成像。然后输出显示井字棋盘的哪个部分中的棋子类型(如果有)。
在这里,我以绿色显示了在图像中检测到的线条:
如您所见,“ X”形的碎片似乎不容易被检测到。在某些邮票上只有一条线被“看见”。
滤镜之后的边缘检测如下:
我检测“ X”形件的方法是在每个部分中检查是否有非水平/垂直斜率的线。我的问题是“ X”形邮票不是完美的线条;因此,我的代码几乎无法理解。
我试过应用不清晰的滤镜,使用直方图均衡化以及仅将灰度用于边缘检测。这些都没有检测到任何“ X”形块中超过1条线。
大概我在做什么:
#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)
Run Code Online (Sandbox Code Playgroud)
只有我将其分别应用于开发板的9个部分中,但这并不是很重要。
TLDR:如何制作图像,使线条“清晰”且清晰?我想知道如何使带有标记的“ X”看起来像几行。
您可以尝试使用Otsu的鲁棒方法确定 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)
Run Code Online (Sandbox Code Playgroud)
那你可以用
要么
区别十字标记和圆形。
这就是我将Canny应用于您的图像时得到的。
由于您使用的是墨水印章,因此实施边缘检测方法,然后再实施某种字符识别方法(?)是一条艰难的路。
您是否尝试过使用简单的连通分量算法?即使图像中存在光照变化,对一些标准二值化技术进行一些修改也应该会产生合理的结果。
http://docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gsc.tab=0
获得组件后,您将获得有关力矩、周长等的数据,这些数据将引导您快速进行计算以区分这两种标记。
无论您使用什么技术,请首先考虑减小图像尺寸,以便需要处理的像素更少。您可能会注意到创建较小图像的一些其他好处。
如果可以的话,给你的相机添加一个小的漫射光。这应该使您的编程任务更容易并且检测更稳健。