Python OpenCV - 获取图像内元素边界的坐标

3
我知道我的问题可能有点泛泛,但我读了很多关于这个问题的博客和问题,仍然找不到接近我所尝试做的事情的解决方案。 我有附加的示例IG截图。我的目标是获取我在绿色部分中突出显示元素的坐标。 Canny边缘似乎没有用(也可以参见https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_canny/py_canny.html)。我阅读了Houg变换可以帮助(https://pysource.com/2018/03/07/lines-detection-with-hough-transform-opencv-3-4-with-python-3-tutorial-21/),但仍然没有运气。 我所需要的只是一种获取这些部分并获取它们的坐标的方法。 如果有人能简单地指出哪些技术可以帮助我,那将是有帮助的。

enter image description here


但你真的需要它吗?如果你知道页面的 URL,你可以直接解析 HTML 文档。 - Lev Zakharov
@LevZakharov 你好,Lev!我正在尝试构建一个自动化测试用例,它更多地依赖于图像识别而不是Selenium。我看到OpenCv有许多可用的技术,想知道是否有简单的方法来获取这些部分。 - Angelo
3个回答

1
假设实际数据中它们不是绿色的!

标准方法是边缘检测(Canny或自适应阈值),然后进行轮廓处理。使用approxPolyDP简化轮廓,然后搜索轮廓列表以查找正确长度和形状的边缘。

提示:使用{{link3:cv2.minAreaRect()}}检查可能是框大小/形状/对齐方式的轮廓

您可以使用概率霍夫来查找线段,但由于源图像非常干净,所以只需浏览轮廓即可更容易地找到。


非常感谢你,马丁。我会遵循你的建议并审查如何更好地应用边缘检测。如果你有任何简单的备用代码可以分享,那将是非常感激的。我也会尽快分享我的代码,一旦我离解决方案更近一步。 - Angelo

0
这种边缘检测可以使用普通的Canny边缘检测器来完成。在应用Canny之前,我们只需要将图像锐化即可。
代码如下:
import cv2
import numpy as np

image = cv2.imread('test.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Sharpen the image
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32) 
dst = cv2.filter2D(gray, -1, kernel)


#Canny Edge detection
canny = cv2.Canny(dst, 30, 200, 1)

# Find contours
cnts = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# Iterate thorugh contours and draw rectangles around contours
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
   

    cv2.rectangle(image, (x, y), (x + w, y + h), (255,0,255), 1)

#write output
cv2.imwrite('resultimage.png', image)

0

你好,我认为你可以做以下的步骤:

  1. 既然已经确定了边框矩形的颜色,你可以将该图像中的该颜色提取到另一个图像(image_green)中。

  2. 现在,一旦你有了image_green,将其二值化(image_bin),也就是说,制作一个具有两种颜色的数组,即提取的颜色和前景色。

    1. 循环遍历image_bin矩阵,并找到所有的“拐角点”,即所有满足此条件的一对像素:“image_bin [i:i + 2,j] / max(image_bin.flatten())== [1,0]”(任何j列和i行)。
    2. 存储这些坐标([i,j])。正如我之前提到的那样,这些值表示矩形的两个角落:左上角和右下角。

这种方法使用numpy数组完成,因此您需要在第3步之前将图像转换为数组。如果你仍然在处理这个问题,让我知道一声,在我有空的时候,我会发布一个可以执行此操作的代码。

祝你好运!


谢谢Pajarol,感谢您的评论。问题是,我手动绘制那些绿色矩形,因为我目前找不到一种使用OpenCv自动识别和绘制它们的方法(尽管我承认我只是几天前开始学习openCV)。 - Angelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接