如何使用OpenCV平衡图像的对比度和亮度?

18
我有一张扫描过的图片,但屏幕上的白色纸张不够白。有没有一种方法可以通过调整对比度/亮度来使背景更白?

更新:

我已经尝试了EmguCv中建议的Image._EqualizeHist函数:

string file = @"IMG_20120512_055533.jpg";
Image<Bgr, byte> originalColour = new Image<Bgr, byte>(file);

Image<Bgr, byte> improved = originalColour.Clone();
improved._EqualizeHist();

但是即使先将图片转为灰度图像,结果还是更加糟糕:

我是否漏掉了其他参数?


1
Stack Overflow 提供免费的图像托管服务,只需在工具栏中点击图像按钮并将其指向您在本地计算机或其他网络上托管的图像即可。这实际上会上传并镜像图像的副本,确保它始终可用,即使外部源出现故障。我已经转移了您发布的图像,但请记住这一点以备将来之需。 - Cody Gray
我不知道为什么,但在这种情况下,equalizehist的结果更糟糕。我也有时会遇到这个问题。 - Abid Rahman K
5个回答

23

我讨论了一些技术:如何在OpenCV中使用C调整对比度?

请查看。下面是我在您的图像上尝试最后两种方法时得到的结果

1)阈值处理

阈值处理会产生二进制图像。如果这是您想要的,可以应用threshold function

2)如果需要灰度图像

enter image description here

另外:

Morphological closing 在您的情况下也很有效

img = cv2.imread('home.jpg',0)
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
close = cv2.morphologyEx(gray,cv2.MORPH_CLOSE,kernel1)
div = np.float32(gray)/(close)
res = np.uint8(cv2.normalize(div,div,0,255,cv2.NORM_MINMAX))

(Python API中的代码)

下面是结果:

在此输入图片描述


7

要改变亮度和对比度,可以将像素值乘以某个系数并加上一个常量。 (更多信息请参见OpenCV文档中的更改图像的对比度和亮度。)

使用Python和NumPy:

import cv2 as cv
import numpy as np

img = cv.imread('b.jpg',0) # loads in grayscale

alpha = 1
beta = 0
res = cv.multiply(img, alpha)
res = cv.add(res, beta)

您也可以直接使用:

res = cv.convertScaleAbs(img, alpha = alpha, beta = beta)

在您的图像中,您可以在直方图中检查到最大值约为170(实际上,如果使用img.max(),则为172)。因此,您可以将图像乘以255/172 = 1.48来增加亮度。
请参见下面的结果:

enter image description here

分别是以下两个直方图:

enter image description here


6

我建议使用AdaptiveThreshold。它通过对图像中每个像素进行局部邻域阈值处理来工作 (当图像的渐变背景比您的图像强时,这确实是一个大问题)。blockSize参数是邻域的大小,而处理后的像素值必须大于平均邻域值减去param1

enter image description here

以下是在python中执行此操作的方法(将其转换为c应该非常容易):

import cv
im = cv.LoadImage("9jU1Um.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
cv.AdaptiveThreshold(im, im, 255, cv.CV_ADAPTIVE_THRESH_MEAN_C, 
                                  cv.CV_THRESH_BINARY, blockSize=31, param1=15)
cv.ShowImage('image', im)
cv.WaitKey(0)

4
它被称为equalizeHist。我不知道它在emgu中的名称,但结果应该正是您所需的 - 更亮的背景和更暗的文本。
编辑
要仅提取边缘(这与图像增强技术非常不同),您可以简单地应用Canny。选择两个阈值作为20和60,然后增加(或减少)它们,保持它们之间的比例为3:1,直到您获得一个好看的边缘图像。

0
无论哪种方式,您都可以检查每个像素。如果小于定义的值,则将其设置为0,如果超过定义的值,则将其设置为255。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接