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

tof*_*fi9 13 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();
Run Code Online (Sandbox Code Playgroud)

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

我错过了其他参数吗?

Abi*_*n K 20

我在这里讨论了一些技巧:如何在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))
Run Code Online (Sandbox Code Playgroud)

(Python API中的代码)

结果如下:

在此输入图像描述


Gus*_*eto 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)
Run Code Online (Sandbox Code Playgroud)

您也可以只使用:

res = cv.convertScaleAbs(img, alpha = alpha, beta = beta)
Run Code Online (Sandbox Code Playgroud)

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

请参阅下面的结果:

在此输入图像描述

和直方图分别:

在此输入图像描述


fra*_*xel 6

我建议使用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)
Run Code Online (Sandbox Code Playgroud)