如何在 OpenCV、Python 中获取使用 mask 找到的形状的 (x,y) 坐标?

laz*_*rea 2 python opencv image-processing

我正在尝试在图像上找到某些项目。简化形式的图像如下所示: 在此输入图像描述

我想获取第二个矩形顶部的粗体黑色文本以及三个彩色矩形的 (x,y) 坐标。

我已经准备好了面具,除了我无法弄清楚的黑色文本的面具。但是,文本始终位于矩形的顶部,因此如果我能够找出底部大矩形的位置,我也会得到文本的位置。

这些是我得到的输出: 在此输入图像描述

我尝试根据此评论使用 ConnectedComponents 函数使用 ConnectedComponents 函数,但除了对各种对象进行着色和分组之外,我无法继续前进,因此我没有在下面包含该代码片段以使事情尽可能清晰。

到目前为止,这是我的代码:

import cv2
import numpy as np
import imutils

PATH = "stackoverflow.png"
img = cv2.imread(PATH)
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

mask_border = cv2.inRange(imgHSV,np.array([0,0,170]),np.array([0,0,175]))
mask_green  = cv2.inRange(imgHSV,np.array([76,221,167]),np.array([76,221,167]))
mask_pink   = cv2.inRange(imgHSV,np.array([168,41,245]),np.array([172,41,252]))
mask_red    = cv2.inRange(imgHSV,np.array([4,207,251]),np.array([4,207,251]))
#mask_black  = ???

all_masks = cv2.bitwise_or(mask_border, mask_green)
all_masks = cv2.bitwise_or(all_masks, mask_pink)
all_masks = cv2.bitwise_or(all_masks, mask_red)

cv2.imshow("Masks", all_masks)

imgResult = cv2.bitwise_and(img,img,mask=all_masks)

cv2.imshow("Output", imgResult)

cv2.waitKey(0)

Run Code Online (Sandbox Code Playgroud)

Sre*_*ran 5

您可以对图像进行二值化,然后应用一些形态学操作来获得正确的连接组件。这是一种方法。您可以对其进行微调以获得正确的输出。

import numpy as np
import cv2
import os
image=cv2.imread('path/to/image.jpg')
###binarising
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret2,th2 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

###applying morphological operations to dilate the image
kernel=np.ones((3,3),np.uint8)
dilated=cv2.dilate(th2,kernel,iterations=3)

### finding contours, can use connectedcomponents aswell
_,contours,_ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

### converting to bounding boxes from polygon
contours=[cv2.boundingRect(cnt) for cnt in contours]
### drawing rectangle for each contour for visualising
for cnt in contours:
    x,y,w,h=cnt
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
Run Code Online (Sandbox Code Playgroud)

普通二值图像

二值图像

放大图像

膨胀图像

带有检测到的边界框的输出 带有检测到的边界框的输出