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

时间:2012-05-12 05:02:04

标签: c# opencv image-manipulation emgucv

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

更新

我尝试过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();

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

我错过了其他参数吗?

5 个答案:

答案 0 :(得分:19)

我在这里讨论了一些技巧:How can I adjust contrast in OpenCV in 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中的代码)

结果如下:

enter image description here

答案 1 :(得分: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)

答案 2 :(得分:4)

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

修改

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

答案 3 :(得分:1)

要更改亮度和对比度,可以将像素值相乘,然后向其添加一些常数。 (有关OpenCV文档中Changing the contrast and brightness of an image的更多信息。)

使用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

答案 4 :(得分:-1)

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