我正在尝试创建一个程序,将检测和删除图片中的边框,目标是检测图片中的文档并清除它。。。你知道吗
这是我的密码:
import sys
import cv2
import numpy as np
import rect
image = cv2.imread('./test.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 9)
ret, gray = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
edges = cv2.Canny(gray, 10, 250)
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=True)
#x,y,w,h = cv2.boundingRect(contours[0])
#cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),0)
# get approximate contour
for c in contours:
p = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * p, True)
if len(approx) == 4:
target = approx
break
cv2.drawContours(image, [target], -1, (0, 255, 0), 2)
cv2.imwrite('./final.jpg', image)
但现在…它唯一能找到的是:
……根据要求,这是一张有效的图片:
正如在聊天中所讨论的,我建议您使用Feature Description and Matching来实现这一点。根据我的经验,它比等高线快,你应该能够绕过光线、视角等变化的问题
以下是我尝试的:
源图像:
结果:
一些注释:由于源图像不太好,单应性很好。你可以通过获得更好的图像质量来提高它的准确性——用一台像样的扫描仪扫描原稿,调整图像大小(我为此添加了一个函数)以及使用不同的颜色空间(我在这里使用LUV)。你知道吗
希望有帮助!你知道吗
如果您查看docs.opencv.org上的文档,您会发现它有许多可以提供的参数,如:
threshold1
:滞后过程的第一个阈值。你知道吗threshold2
:滞后过程的第二个阈值。你知道吗apertureSize
:Sobel操作符的孔径大小。你知道吗L2gradient
:一个标志,指示是否应该使用更精确的L2范数来计算图像梯度幅度(L2gradient=true
),或者默认的L1norm =|dI/dx|+|dI/dy|
是否足够(L2gradient=false
)。你知道吗我建议用这些来得到想要的结果。你知道吗
相关问题 更多 >
编程相关推荐