如何使用Python OpenCV检测带图案背景上的填充黑色矩形
如何使用Python OpenCV检测带图案背景上的填充黑色矩形
我正尝试用OpenCV检测纸张上这些填充的黑色矩形的位置,但遇到了几个棘手的问题:
- 背景的线条也会被误检测成目标对象
- 部分矩形边角互相接触时,会被识别成一个整体,而我需要单独获取每个矩形的位置
下面是我尝试过的代码,以及对应的输出结果:
import numpy as np import cv2 image = cv2.imread("page.jpg") result = image.copy() gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,51,9) cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(thresh, [c], -1, (255,255,255), -1) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=4) cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: x,y,w,h = cv2.boundingRect(c) cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3) cv2.imshow('thresh', thresh) cv2.imshow('opening', opening) cv2.imshow('image', image) cv2.waitKey()
运行代码后得到的结果并不理想:
- 阈值处理(thresh)后的图像:背景线条和黑色矩形没有被有效区分,干扰信息过多
- 开运算(opening)后的图像:白色区域和黑色矩形区域连在了一起,无法单独定位每个黑色矩形
- 最终检测结果:只识别出了整个页面的轮廓,完全没有检测到单个的黑色矩形
备注:内容来源于stack exchange,提问作者Robin Aerts




