如何使用opencv均衡图像的对比度和亮度?

我有一张我扫描过的图像,但白纸在屏幕上不是白色的。 有没有办法平衡合同/亮度,使背景更白?

更新

我尝试过EmguCv中建议的Image._EqualizeHist函数:

string file = @"IMG_20120512_055533.jpg"; Image originalColour = new Image(file); Image improved = originalColour.Clone(); improved._EqualizeHist(); 

但是得到更糟糕的结果(同样在第一次灰度缩放时):

我错过了其他参数吗?

我在这里讨论了一些技巧: 如何在C中调整OpenCV中的对比度?

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

1) 阈值处理

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

2) 如果需要灰度图像

在此处输入图像描述

附加:

在你的情况下, 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中的代码)

结果如下:

在此处输入图像描述

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

在此处输入图像描述

以下是如何在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) 

它被称为equalizeHist。 我不知道它在emgu中的名字,但结果应该正是你所需要的 – 更明亮的背景和更暗的文本。

编辑

要仅提取边缘(这与图像增强技术非常不同),您只需应用Canny即可。 选择两个阈值为20和60,作为开始,然后增加(或减少它们),保持它们之间的比例为3:1,直到你有一个好看的边缘图像。

要更改亮度和对比度,可以将像素值相乘,然后为它们添加一些常量。 (有关更改图像对比度和亮度的详细信息,请参阅 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以增加亮度。

请参阅以下结果:

在此处输入图像描述

直方图分别为:

在此处输入图像描述

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