【问题标题】:Python OpenCV Fill in circle outlined by redPython OpenCV 填充红色勾勒的圆圈
【发布时间】:2020-01-28 08:32:58
【问题描述】:

我有上面的图片,我只是希望能够获得红色勾勒出的形状,并将该形状中的所有内容涂成白色。我下面的代码 sn-p 读取图像,使用 HSV 值尝试获取仅包含红色像素值的掩码,但由于某种原因它无法正常工作。我最终没有得到一个完整的圆圈,而只是在附近得到一堆点。我是否使用了错误的 HSV 值?

im = cv2.imread(img, cv2.IMREAD_UNCHANGED)
hsv_im = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
lower_red = np.array([0, 80, 80], np.uint8)
upper_red = np.array([20, 255, 255], np.uint8)
frame_threshold_red = cv2.inRange(hsv_im, lower_red, upper_red)

为了获得我的 HSV 值,我这样做:

red = np.uint8([[[0, 0, 224]]])
hsv_red = cv2.cvtColor(red,  cv2.COLOR_BGR2HSV) # 0, 255, 224

224 是红色像素的值。我通过查看实际矩阵值进行了检查。

有人对我如何解决这个问题有任何建议吗?我应该修改 HSV 值还是使用完全不同的方式?谢谢!

我目前得到这样的东西:

【问题讨论】:

  • 我认为你需要一个白色的"floodfill",从红色圆圈内的一点开始...docs.opencv.org/2.4/modules/imgproc/doc/…
  • @MarkSetchell 感谢您的回复!但这需要我手动选择点
  • 如果是圆形,你可以找到红色像素的质心,或者最左边和最右边红色像素的平均值以及最顶部和最底部红色像素的平均值为你的洪水填充的种子。如果它可能不是循环的,我们可能需要更加努力地思考。
  • 我的回答解决了你的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。 meta.stackexchange.com/questions/5234/…
  • @MarkSetchell 抱歉耽搁了,但非常感谢您的帮助!

标签: python opencv hsv


【解决方案1】:

这应该可以让您按照我的评论开始:

#!/usr/bin/env python3

import cv2
import numpy as np

# Load image and convert to HSV
im = cv2.imread("blob.png", cv2.IMREAD_UNCHANGED)
HSV = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)

# Define lower and upper limits of "red"
redlo = np.array([0, 80, 80], np.uint8)
redhi = np.array([20, 255, 255], np.uint8)

# Mask red pixels
R = cv2.inRange(HSV, redlo, redhi)

# Calculate x,y coordinate of centre of red pixels
M = cv2.moments(R) 
cX = int(M["m10"] / M["m00"]) 
cY = int(M["m01"] / M["m00"]) 

# Flood fill with white starting from centroid
_, res, _, _ = cv2.floodFill(im,mask=None,seedPoint=(cX,cY),newVal=(255,255,255))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-23
    • 2013-09-24
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2017-12-15
    • 1970-01-01
    相关资源
    最近更新 更多