gpt4 book ai didi

opencv - 使用 OpenCV 识别具有嘈杂背景的不完美形状

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:02 25 4
gpt4 key购买 nike

我想在嘈杂的环境中识别水下的矩形。我实现了 Canny 来查找边缘,并使用 cv2.circle 绘制找到的边缘。从这里开始,我试图识别图像中不完美的矩形(覆盖框架顶部的长矩形下方的黑色矩形)

rectangle

我尝试了多种解决方案,包括阈值、模糊和调整图像大小以检测矩形。下面是仅绘制已识别边缘的准系统代码。

import numpy as np
import cv2
import imutils

img_text = 'img5.png'
img = cv2.imread(img_text)
original = img.copy()

min_value = 50
max_value = 100

# draw image and return coordinates of drawn pixels
image = cv2.Canny(img, min_value, max_value)
indices = np.where(image != 0)
coordinates = zip(indices[1], indices[0])

for point in coordinates:
cv2.circle(original, point, 1, (0, 0, 255), -1)

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

输出显示的地方:

output

从这里我希望能够单独检测矩形并在输出顶部以绿色绘制另一个矩形,但我一直无法找到一种方法来自行检测原始矩形。

最佳答案

对于您的特定图像,我通过对蓝色 channel 进行简单的阈值处理获得了相当不错的结果。

image = cv2.imread("test.png")
t, img = cv2.threshold(image[:,:,0], 80, 255, cv2.THRESH_BINARY)

enter image description here


为了调整阈值,我提出了一种简单的方法来改变阈值,直到您获得一个组件。我还实现了矩形绘图:

def find_square(image):

markers = 0
threshold = 10

while np.amax(markers) == 0:
threshold += 5
t, img = cv2.threshold(image[:,:,0], threshold, 255, cv2.THRESH_BINARY_INV)
_, markers = cv2.connectedComponents(img)

kernel = np.ones((5,5),np.uint8)

img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
img = cv2.morphologyEx(img, cv2.MORPH_DILATE, kernel)

nonzero = cv2.findNonZero(img)
x, y, w, h = cv2.boundingRect(nonzero)
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imshow("image", image)

以及所提供示例图像的结果:

enter image description here enter image description here enter image description here

这种方法背后的想法是基于大多数信息都在蓝色 channel 中的观察结果。如果将 channel 中的图像分开,您会看到在蓝色 channel 中,深色方 block 具有最佳对比度。它也是该 channel 上最暗的区域,这就是阈值起作用的原因。问题仍然是阈值设置。基于以上直觉,我们正在寻找最低的阈值,它会带来一些东西(并希望它是正方形)。我所做的只是简单地逐渐增加阈值,直到出现某些东西。

然后,我应用了一些形态学操作来消除阈值处理后可能出现的其他小点,并使正方形看起来更大一点(正方形的边缘更亮,因此没有捕获到整个正方形)。然后是绘制矩形的问题。

通过对直方图进行一些统计分析,可以使代码更好(也更高效)。只需计算阈值,使 5%(或某个百分比)的像素更暗。您可能需要进行连通分量分析以保留最大的 blob。

此外,我对 connectedComponents 的使用非常糟糕且效率低下。同样,匆忙编写代码来证明这个概念。

关于opencv - 使用 OpenCV 识别具有嘈杂背景的不完美形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com