You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动