【问题标题】:How to find rectangles in a full transparent object?如何在全透明对象中找到矩形?
【发布时间】:2022-06-09 00:07:58
【问题描述】:

我有一个完全透明对象的输入图像:

我需要检测这张图片中的 42 个矩形。这是我需要的输出图像的示例(为了更好地理解,我标记了 6 个矩形):

问题是矩形看起来真的很不一样。我必须使用这个输入图像。 我怎样才能做到这一点?

编辑 1:这是 png 形式的输入图像:

【问题讨论】:

  • 优化照明和背景以获得更好和更相似的每个矩形的可见性。在给定的图像中,我建议分割矩形之间的区域,这样看起来更稳定。
  • 您是否有没有压缩伪影的更高分辨率图像(例如 png 或 pgm 图像)?
  • 我以 png 格式捕获了另一张图像。我编辑了帖子。
  • 是否总是有 42 个矩形以 6 * 7 的大小放置?
  • 是的。总有42个长方形,按6*7摆放。

标签: python opencv computer-vision transparent


【解决方案1】:

如果您计算行下和列间的方差,请使用:

import cv2
import numpy as np

im = cv2.imread('YOURIMAGE', cv2.IMREAD_GRAYSCALE)

# Calculate horizontal and vertical variance
h = np.var(im, axis=1)
v = np.var(im, axis=0)

您可以绘制它们并希望找到应该是您的对象的方差峰值:

【讨论】:

  • 一个好的起点
【解决方案2】:

Mark Setchell 的想法是开箱即用的。这是一种更传统的方法。

方法:

该图像包含其强度在较低行中逐渐消失的框。由于考虑了整个图像的强度变化,因此在这里使用全局均衡会失败。我在 OpenCV 中选择了一种局部均衡方法,可通过 CLAHE (Contrast Limited Adaptive Histogram Equalization)) 获得

使用 CLAHE:

  • 均衡应用于图像的各个区域,其大小可以预定义。
  • 为避免过度放大,应用了对比度限制(因此得名)。

让我们看看如何在我们的问题中使用它:

代码:

# read image and store green channel
green_channel = img[:,:,1]

# grid-size for CLAHE
ts = 8
# initialize CLAHE function with parameters
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(ts, ts))
# apply the function
cl = clahe.apply(green_channel)

请注意上图,下部区域的框如预期的那样显得稍微暗一些。这对我们以后有帮助。

# apply Otsu threshold
r,th_cl = cv2.threshold(cl, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# dilation performed using vertical kernels to connect disjoined boxes
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 3))
dilate = cv2.dilate(th_cl, vertical_kernel, iterations=1)
 

# find contours and draw bounding boxes
contours, hierarchy = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
img2 = img.copy()
for c in contours:
    area = cv2.contourArea(c)
    if area > 100:
        x, y, w, h = cv2.boundingRect(c)
        img2 = cv2.rectangle(img2, (x, y), (x + w, y + h), (0,255,255), 1)

(最右上角的框未正确覆盖。您需要调整各种参数以获得准确的结果)

您可以尝试的其他预处理方法:

  1. 全局均衡
  2. 对比拉伸
  3. 规范化

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 2020-11-13
    • 2016-10-05
    • 1970-01-01
    • 2014-12-01
    • 2021-04-10
    • 2012-06-20
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多