python-正方形检测,边缘有像差,一个缺失的角
作者:互联网
这是关于正方形检测的similar questions的后续版本,其中karlphillip、mevatron和abid-rahman-k提供了一些很酷的方法.
我正在尝试设计一种鲁棒的正方形检测算法,以帮助将收据的图片与图像的其余部分隔离开.我的代码是基于先前问题的凸包方法构建的,但是它在图像上令人cho目结舌,其中的点之一不在图像中,并且收据的边缘由于左侧的笔筒而出现了像差.
我如何检测此收据上的角落?
这是图片:
这是我的代码:
import cv2
import numpy as np
img = cv2.imread('taco.jpg')
img = cv2.resize(img,(1944,2592))
img = cv2.medianBlur(img,31)
img = cv2.GaussianBlur(img,(0,0),3)
grayscale = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
thresh = cv2.Canny(grayscale, 10, 20)
thresh = cv2.dilate(thresh,None)
contours,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
if cv2.contourArea(cnt)>250: # remove small areas like noise etc
hull = cv2.convexHull(cnt) # find the convex hull of contour
hull = cv2.approxPolyDP(hull,0.1*cv2.arcLength(hull,True),True)
if len(hull)==4:
cv2.drawContours(img,[hull],0,(0,255,0),2)
cv2.namedWindow('output',cv2.cv.CV_WINDOW_NORMAL)
cv2.imshow('output',img)
cv2.cv.ResizeWindow('output',960,640)
cv2.waitKey()
cv2.destroyAllWindows()
有任何想法吗?
解决方法:
Mathematica中的解决方案:
导入图像:
i = Import@"http://i.imgur.com/RrYKJ.jpg";
检测到比收据中的字母更细的光栅尺边缘(参数)
i1 = EdgeDetect[i, 10]
删除小于收据周长比例的行(一个参数)
i2 = DeleteSmallComponents[i1, 1000]
查找形态成分
(mc = MorphologicalComponents[Erosion[ColorNegate@i2, 1]]) // Colorize
查找具有更多边界邻接的变形组件(将其从蒙版中删除)
com = Commonest[Join[mc[[1]], mc[[-1]], Transpose[mc][[1]], Transpose[mc][[-1]]]]
形成面具
mc1 = Unitize[mc /. com[[1]] -> 0];
将蒙版乘以原始图像
ImageMultiply[Image@mc1, i]
标签:opencv,image-processing,computer-vision,python 来源: https://codeday.me/bug/20191127/2076178.html