我正在为一个大学项目制作文档扫描仪,我的代码对于任何均匀发光的图像都工作得很好。但是我遇到了检测背景表面甚至很少的光反射(或太多的光)的图像的问题。
我首先尝试了在网上找到的不同的简单代码,然后使用了不同的形态操作,结果现在我的代码有些混乱且不准确。 这是代码:
def scanner(img):
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
image = cv2.imread(img)
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
contrast = clahe.apply(gray)
blurred = cv2.medianBlur(contrast, 21)
canny = cv2.Canny(blurred, 0, 70)
dialated = cv2.dilate(canny, cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)), iterations = 3)
closing = cv2.morphologyEx(dialated, cv2.MORPH_CLOSE, np.ones((5,5),np.uint8),iterations = 10)
contimage, contours, hierarchy = cv2.findContours(closing, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key = cv2.contourArea, reverse = True)[:5]
target = None
for c in contours:
p = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.09 * p, True)
if len(approx) == 4:
target = approx
cv2.drawContours(image, [target], -1, (0, 255, 0), 2)
break
plt.figure(figsize = (20,20))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("final")
plt.show()
这是代码工作的示例: input1,output1,input2,output2
答案 0 :(得分:0)
看来这里的主要问题是在出现故障的图像中,纸张和放置在其上的桌子之间没有足够的对比度。可以工作的基本上是深色背景上的白色纸张,因此将纸张切开相对容易,但是当您将纸张放在浅色表面上时,纸张和背景之间的对比度不足以分辨出什么是什么。不幸的是,在图像处理中,当输入图像很差时,您只能做很多事情,因此,对此没有简单的自动修复方法,但是我可以想到一些解决方法,但是它们都需要额外的工作。 >
一个替代方法是让程序自动检测纸张在哪里,而只有一个静态框,用户必须将其放在文档中,然后以这种方式简单地捕获内容。可能是最简单的实现,但是您似乎想自动检测它,所以这可能不是您想要的。
两个将具有一些中间步骤,允许用户选择特定的阈值以应用于图像。基本上,您将要拍照,然后让用户设置一个阈值,以使纸张最终变成白色,背景变暗,然后可以将其用作模板来创建纸张的边界,然后进行分割从原始图像。这可能是最辛苦的工作,但最接近您要寻找的东西。
三个将与第一个相似,但是您无需在其中放置文档的固定区域,而是可以拍照,然后让用户手动选择拐角位置并以这种方式进行分割,这比#1更加繁琐,比#2的工作量少,但可能仍不是您想要的东西。
最后,您可以将其保留原样并使用它,知道您需要足够暗的背景才能使其正常工作。可能还有其他解决方法,但是拥有大量图像处理工具,您可能会受到图像质量的极大限制,而且并非总是能够完全满足您要做什么的软件解决方案。