【问题标题】:How to remove light shadow-like color from an image如何从图像中去除光影般的颜色
【发布时间】:2018-10-21 13:23:55
【问题描述】:

我正在使用 opencv 处理一些图像。我有很多像下面这样的图像。它们有一些非常浅的、类似阴影的颜色。

决定像素颜色很浅的维度是多少?我应该使用什么色彩空间来识别那些浅色像素?

【问题讨论】:

  • 你试过看HSV吗?您也可以尝试使用 Lab/Luv 颜色空间的参数。此外,如果您有很多不同颜色的图像,因此有不同的阴影,您可以训练一个 SVN/神经网络,将所有阴影变为白色(255、255、255)或旁边的颜色。
  • 那些明亮的区域用于抗锯齿。为什么要删除它们?

标签: opencv image-processing


【解决方案1】:

正如@RickM 所提到的,有多种色彩空间可用于分析您的图像。由于您专注于去除阴影/阴影,因此您需要专注于包含亮度信息的通道并将颜色通道放在一边。

在这种情况下,LAB 色彩空间被证明是有帮助的。亮度通道表达了很多关于图像亮度的信息

img = cv2.imread('4.png')
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)

cv2.imshow('Luminance', l)

然后我得到一个阈值,用原图掩蔽结果得到mask1

ret2, th = cv2.threshold(l, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
mask1 = cv2.bitwise_and(img, img, mask = th)
cv2.imshow('mask1', mask1)

但是现在背景不是你想要的那样。 我创建了一个具有相同图像尺寸(white)的白色像素的图像,并用它掩盖了反转阈值图像以获得mask2

white = np.zeros_like(img)
white = cv2.bitwise_not(white)

mask2 = cv2.bitwise_and(white, white, mask = cv2.bitwise_not(th))
cv2.imshow('mask2', mask2)

添加这两个图像后,您会得到他想要的图像:

cv2.imshow('fin_img', mask2 + mask1)

请记住,这仅适用于问题中提供的类似图片。

【讨论】:

  • 正如您所提到的,这仅适用于问题中提供的图像(或类似图像)。如果数据集有很多变化,使用 ML 将是最好的选择。
  • @RickM。 OP提到了'我有很多像下面这样的图像',我同意如果这种方法用于具有深色背景的图像,它会失败。使用 ML 就不必提供掩码了吗?
  • 不一定,您可以通过查看阴影周围的颜色并将其设置为所需的值(白色或 OP 想要的)来进行颜色收集
【解决方案2】:

这是一个相当简单的方法:

img = cv2.imread('4.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img[gray > 200] = 255

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多