背景较浅的图像的伽玛校正

时间:2018-11-01 16:03:31

标签: python opencv image-processing edge-detection

我正在尝试使用以下代码检测图像中ID卡的边界。关键是我使用的伽玛值。我使用2或3的值(假设我希望卡在背景下突出显示)。使用背景较浅或与卡片颜色本身一样浅的照片时遇到问题。请看下面的图像..第一个是深色b / g的原始物,第二个是伽玛校正的..与下一个相同。我不知所措,想尽办法处理具有较浅背景的照片。还要粘贴我用来执行伽玛校正的代码。请让我知道你们是否可以将我的脑袋对准正确的方向:)

import cv2
import numpy as np
import imutils
import math
import sys

img = cv2.imread( sys.argv[1] )
gray1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
invGamma = 3.0
table = np.array([((i / 255.0) ** invGamma) * 255
for i in np.arange(0, 256)]).astype("uint8")

gray = cv2.LUT(gray1, table)
ret,thresh1 = cv2.threshold( gray, 80, 255, cv2.THRESH_BINARY )
cv2.imwrite( 'LUT.jpg', thresh1 )
_, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

Image1

Image1-Gamma-corrected-3

Image2

Image2-Gamma-3

1 个答案:

答案 0 :(得分:1)

据我了解您的问题,您主要是在尝试检测卡的边缘吗?还是您要从图像中完全分离(即切出)卡片?

您将gamma转换为灰色后,只是改变了整个图像的表观对比度。 OpenCV拥有许多自身的边缘和对象检测例程,因为我假设您正在尝试进行预处理以提供帮助?

一个概念(非代码)答案:

单独的渠道

让我将您指向另一个方向。如果输入图像始终是彩色的,请考虑仅使用三个RGB颜色通道之一。这是一个示例:

红色频道:

RedChannelOnly

绿色频道:

BlueChannelOnly

蓝色频道:

enter image description here

请注意,蓝色通道相对于红色通道的对比度更高。根据图像内容,通常会发现一个通道与所需对象的分离效果更好。

如果您查看直方图:

Histogram

您会看到蓝色通道在右侧(所需对象)的峰与左侧峰(表上的亮点)之间的距离最大。但是红色通道的所有内容都在中间。

作为一个想法,您可以使用峰值检测/峰值位置/峰值之间的距离来以编程方式确定每个颜色通道中的相对对比度。

您还可以确定哪个颜色通道的峰值与另一个通道的同一峰值相距最远,然后进行SUBTRACT或使用DIFFERENCE或除以两个通道(在下面的“通道数学”中举例说明)。


桌布

现在使用桌布,它上面有一个非常高的对比度图案-白色(灰色)比ID卡亮,绿色比ID卡更暗。该卡主要位于两者之间。

使用图像编辑器中的曲线工具提供图形示例,您可以看到将较低和较高的电平钳位为黑色,可以隔离中档卡。

但再次注意直方图:

Histogram

尽管几乎所有内容都集中在中值范围内,但RED通道在黑色附近确实有一个小峰值。以此为指导,我们先关闭绿色和蓝色通道,然后关闭CLAMP值,低于卡值的范围。

曲线工具:

Curves

然后是仅产生的红色通道-请注意将其反转以使产生的对比度更加清晰:

Inverted Red Only


摘要

因此,这些隔离概念的重点是

  1. 检查每个颜色通道,以确定哪个具有最佳对比度。这将寻找与其他通道最不相同的峰,并且/或者在它们之间具有最大“谷”的通道中寻找峰。
  2. 钳制低值和高值以隔离所需的对象。这将使用在A中找到的带有阈值的峰来确定要钳位并渐变为所需图像的点。

仅使用一般的“伽玛”调整会出现问题,那就是您要拖动整个图像以改变明显的对比度,而实际上您想要做的就是消除(钳位)图像的某些部分。不相关。

虽然我意识到这并不是您要问的,但我希望它仍然有用。另外,如果您还没有的话,建议您在OpenCV中检查更多的检测功能。


奖金:具有频道数学的乐趣

这可能对您有用,但对色彩通道之间的乘,除,减,差,排除有时可以帮助您消除不需要的背景对象。拿掉桌布和图案。

让GREEN和BLUE通道成倍增加,并获得以下提示:

Multiply Green and Blue

现在让我们通过RED频道进行分割

Divide by Red Divide

现在调整RED通道的GAMMA以消除桌布图案(Gamma调整为1.57):

Gamma Adjusted to 1.57

使用此结果图像:

Final

既然桌布图案消失了,那当然可以进一步增强对比度。