对背景较浅的图像进行伽马校正

Vik*_*thy 1 python opencv image-processing edge-detection

我正在尝试使用下面的代码检测图像中身份证的边界。关键是我使用的 gamma 值。我使用 2 或 3 的值(假设我希望卡片在背景中脱颖而出)。我在使用背景较浅或与卡片颜色本身一样浅的照片时遇到问题。请看看下面的图片..第一个是带有深色b/g的原稿,第二个是带有伽玛校正的..与接下来的2个相同。我在我的智慧尽头试图弄清楚我该怎么做处理背景较浅的图片。还粘贴我用来执行伽马校正的代码。请让我知道你们是否可以将我的粗头指向正确的方向:)

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)
Run Code Online (Sandbox Code Playgroud)

图片1

Image1-Gamma-corrected-3

图片2

Image2-Gamma-3

Myn*_*dex 9

我理解你的问题,你主要是想检测卡片的边缘?或者您是否试图将卡片与图像完全分开(即切出)?

在将整个图像转换为灰色后,您对伽马的使用只是改变了整个图像的明显对比度。OpenCV 有很多自己的边缘和对象检测例程,因为我假设您正在尝试进行预处理以提供帮助?

一个概念(不是代码)答案:

独立通道

让我给你指出一个不同的方向。如果输入图像始终是彩色的,请考虑仅使用三个 RGB 颜色通道之一。下面是一个例子:

红色通道:

仅红色频道

绿色通道:

仅蓝色频道

蓝色通道:

在此处输入图片说明

注意蓝色通道相对于红色通道的对比度有多大。根据图像内容,您通常会发现一个通道对所需对象具有更好的分离度。

如果您查看直方图:

直方图

您可以看到蓝色通道在右侧峰(所需对象)和左侧峰(桌子上的亮点)之间的距离最大。但是红色通道将所有东西都聚集在中间。

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

您还可以确定哪个颜色通道的峰值与另一个通道中的同一峰值最远,然后减去或使用 DIFFERENCE 或 DIVIDE 两个通道(以下“通道数学”中的示例)。


桌布

现在使用桌布,它上面有一个非常高对比度的图案——比身份证浅的白色(灰色)和比卡片深的绿色。该卡主要介于两者之间。

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

但同样,请注意直方图:

直方图

虽然几乎所有东西都集中在中频值中,但红色通道确实有一个接近黑色的小峰值。以此为指导,我们关闭绿色和蓝色通道,然后关闭低于卡值范围的 CLAMP 值和高于卡值范围的值。

曲线工具:

曲线

然后仅生成红色通道 - 请注意,这是反转的,以使生成的对比度更清晰:

仅反转红色


概括

所以这些隔离概念的要点是

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

仅使用一般的“伽马”调整的问题在于,当您真正想做的是消除(钳制)图像中不相关的部分时,您将拖动整个图像来改变明显的对比度.

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


奖励:通道数学的乐趣

这对您来说可能有用也可能没有用,但是颜色通道之间的乘法、除法、减法、差异、排除有时可以帮助摆脱不需要的背景对象。拿桌布和图案。

让我们乘以绿色和蓝色通道并得到这个:

乘以绿色和蓝色

现在让我们通过 RED 通道进行 DIVIDE

按红色划分 划分

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

Gamma 调整为 1.57

有了这个结果图像:

最终的

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