使用 Python OpenCV 检测图案背景上填充的黑色矩形

问题描述 投票:0回答:1

我正在尝试使用 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()

阈值

开幕

结果

如您所见,在打开的图像中,白色矩形与黑色矩形连接在一起,但我想要它们分开。然后在结果中,它只检测整个页面周围的轮廓。

python opencv image-processing computer-vision
1个回答
0
投票

我正在尝试检测这些填充的黑色矩形的位置 使用 OpenCV。

问题可以解决。

图片的质量分辨率非常低。图像周围有声音。最好拥有高分辨率相机。

我无法超越算法。

观察,我利用轮廓切片来获得最大的黑色矩形。

x,y,w,h = cv2.boundingRect(cnt[:9])

片段:

import cv2

# Load the image
img = cv2.imread('p1.jpg')

dst = cv2.fastNlMeansDenoisingColored(img, 5, None,  15, 14,  19)

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

edged = cv2.Canny(gray, 127, 255)
 
thresh = cv2.adaptiveThreshold(edged, 255, 1, 1, 37, 15)
thresh_color = cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR)


thresh = cv2.dilate(thresh, None, iterations=14)
thresh = cv2.erode(thresh, None, iterations=14)


contours,hierarchy = cv2.findContours(thresh,
                                      cv2.RETR_TREE,
                                      cv2.CHAIN_APPROX_SIMPLE)


for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt[:9])
    cv2.rectangle(img,
                  (x,y),(x+w,y+h),
                  (0,255,0),
                  -1)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

截图:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.