【问题标题】:How can I detect uniform color rectangles in an image using OpenCV?如何使用 OpenCV 检测图像中颜色均匀的矩形?
【发布时间】:2019-08-28 22:03:15
【问题描述】:

我想使用 OpenCV 来检测图像中哪些矩形的大部分像素接近给定颜色。

这是一个图像示例,我想使用它来识别主要包含灰色像素(可能是道路)的矩形区域:

更准确地说,给定:

  • 尺寸h x w(候选矩形的高度和重量)
  • 颜色的距离函数dist(例如,颜色向量之间的向量差范数,可以是RGB或任何其他表示)
  • 一个颜色向量C
  • 颜色距离C的最大距离d
  • 给定矩形中像素的最小百分比 r 与感兴趣的矩形 C 的距离 d 以内,

如果大小为 h x w 的矩形,则返回一个掩码 M,其中每个像素 P 为 1当用 P 测量时,左角由 P 包含至少 r % 的像素在距离 C 的距离 d 内em>dist.

在伪代码中,掩码中的像素 P 为 1 当且仅当:

def rectangle_left_cornered_at_P_is_of_interest(P):
    n_pixels_near_C = size([P' for P' in rectangle(P, P + (h,w)) if dist(P',C) < d])
    return n_pixels_near_C / (h * w) > r

我想在 OpenCV 中可能已经存在一个过滤器/内核可以做到这一点(或可以用来做到这一点),但我仍在学习它并且无法通过查看文档来识别它。有这种事吗?

【问题讨论】:

  • 这是一个非常广泛的问题。你试过什么?它不起作用怎么办?您对颜色之间的“距离”的定义是什么?你在什么色彩空间工作,RGB,HSV等?发布一些代码,我们也许可以提供帮助。
  • 谢谢。我还没有尝试过任何东西。这就是重点:我试图找出 OpenCV 在这方面提供了什么,所以我可以尝试一些东西。我现在以更完整和更精确的数学方式定义了这个问题。
  • 你能提供一个示例图像吗?
  • @Andy_101,我刚刚添加了一个示例图像。谢谢。

标签: opencv image-segmentation


【解决方案1】:

您可以为此使用 HSV。您可能需要稍微调整一下掩码的值,但它会完成工作。

img = cv2.imread(img)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_gray = np.array([0, 5, 50], np.uint8)
upper_gray = np.array([350, 50, 255], np.uint8)

mask = cv2.inRange(hsv, lower_gray, upper_gray)
img_res = cv2.bitwise_and(img, img, mask = mask)
cv2.imwrite('gray.png',img_res)

您还应该参考this 的帖子。这是一篇关于使用 HSV 的好帖子。

基本上你需要做这份工作的将是: HSV 口罩, 大津阈值,模糊,可能是腐蚀和膨胀。

以最符合您要求的组合方式使用它们。

【讨论】:

  • 谢谢。这有助于检测灰色,但无助于确定哪些具有特定高度和宽度的矩形具有最小百分比的灰色像素。为此,我必须编写一个遍历所有像素的循环和另一个嵌套循环来分析相应矩形中的所有相邻像素,但这在 Python 中太慢了,所以我希望有某种 OpenCV在 C 级别上运行的过滤器或内核。
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 2022-01-07
  • 2013-03-23
  • 2019-07-04
  • 1970-01-01
  • 2014-09-16
  • 2019-11-29
  • 2012-05-21
相关资源
最近更新 更多