python - 如何使用OpenCV将最大的圆圈裁剪出图像(拍摄目标)

标签 python opencv image-recognition

如标题所示,我正在尝试从图像中裁剪出最大的圆圈。我在python中使用OpenCV。确切地说,它是一个始终具有相同格式的拍摄目标,但是可以在任何移动设备上和不同的光照条件下拍摄它的照片(我将在下面列举一些示例)。

我是图像识别的新手,所以我一直在尝试许多不同的方法来实现此目的,但是无法找到一种通用的解决方案,该解决方案适用于所有目标图像。

为什么我要这样做:

我的任务是计算给定目标图像上一张或多张照片的得分。我尝试了颜色分割来找到照片,但是由于照片可以位于不同的背景上,因此无法正常工作。因此,现在我尝试查看空的拍摄目标图像和已经在目标图像上拍摄的图像之间的区别。另外,我需要能够分辨出它的射击目标(有两种目标类型)。因此,我尝试仅从图像中裁剪出目标,以消除背景干扰,然后继续进行镜头识别。

到目前为止我尝试过的是:

1)使用HoughCircles找到最大的圆。我的下一步是以某种方式删除找到的圆的外部。我已经使用HoughCircles方法的配置进行了相当长的时间,但是示例图像中的其中一个始终未正确突出显示最外面的圆圈,或者未突出显示任何圆圈:/。

我的最终配置如下所示:

img = cv2.GaussianBlur(img, (3, 3), 0)
cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 2, 10000, param1=50, param2=100, minRadius=200, maxRadius=0)

似乎使用HoughCircles并不是正确的方法,因此我继续研究在互联网上找到的另一种可能的解决方案。

2)通过过滤看起来好像圆圈在图片上的“黑色”颜色范围来找到所有国家,而不是找到最大的国家。这种解决方案的问题似乎在于,有时图片中的阴影会破坏外圆,因此似乎无法对其进行裁剪。

我的代码如下所示:
# black color boundaries [B, G, R]
lower = [0, 0, 0]
upper = [150, 150, 150]

# create NumPy arrays from the boundaries
lower = np.array(lower, dtype="uint8")
upper = np.array(upper, dtype="uint8")

# find the colors within the specified boundaries and apply the mask
mask = cv2.inRange(img, lower, upper)
output = cv2.bitwise_and(img, img, mask=mask)

ret, thresh = cv2.threshold(mask, 40, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

if len(contours) != 0:
    # draw in blue the contours that were founded
    cv2.drawContours(output, contours, -1, 255, 3)

    # find the biggest countour (c) by the area
    c = max(contours, key=cv2.contourArea)
    x, y, w, h = cv2.boundingRect(c)

之后,我尝试用找到的最大轮廓(c)画一个圆,并据此裁剪。但是我已经看到绘制的圆圈不完整(可能是由于图片上的阴影所致),因此无论如何都行不通。

那些失败之后,我在这里尝试了其他问题的许多解决方案,但是没有一个解决我的问题。

图片示例:

Target example 1

Target example 2

Target to calc score 1

Target to calc score 2

老实说,我真的迷失了如何解决这个问题。我将不胜感激任何帮助,建议。

最佳答案

样本中有两种不同类型的目标。您可能需要单独处理它们,或要求用户输入输入的目标类型。基本上,您想知道目标的黑色部分有多大,覆盖了7-10或4-10。

对图像进行二值化处理。沿着X和Y建立直方图-您会发现目标黑色部分的位置为(x_left, x_right, y_top, y_bottom)。一旦知道,就可以计算中心((top+bottom)/2, (left+right)/2)。之后,您就可以轻松计算图像每个像素的分数,因为您知道其中心,黑点大小以及其中不同分数区域的数量。

关于python - 如何使用OpenCV将最大的圆圈裁剪出图像(拍摄目标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62101277/

相关文章:

c++ - 使用kinect从点云生成三角形网格的算法

iphone - 从图像中检测肤色

machine-learning - 有没有办法在网络浏览器中获取 ML Kit 的功能?

python - Python 解释器嵌入段错误的最小示例

python - 使用 pandas 为系列分配时间戳值会创建一个 int 而不是

c++ - 在 Opencv 中更改提取帧的分辨率

matlab - 在视觉文字袋中组合检测器

algorithm - matlab - 找到一个可以覆盖图像中字符的边界框

python - 传递一个关键字参数和一个保存关键字字符串的变量

python - 元组解包 - ValueError