How do I equalize contrast & brightness of images using opencv?

tofi9 picture tofi9 · May 12, 2012 · Viewed 39.7k times · Source

I've got an image that I've scanned, but the white paper is not white on the screen. Is there a way to equalize the contract/brightness to make the background whiter?

Update

I've tried the suggested Image._EqualizeHist function from EmguCv:

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

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

But get an even worse result (also when first gray scaled):

Am I missing other parameters?

Answer

Abid Rahman K picture Abid Rahman K · May 12, 2012

I have discussed some techniques here : How can I adjust contrast in OpenCV in C?

Please check it. Below are the results i got when i tried last two methods on your image

1) Thresholding:

Thresholding gives a binary image. If that is what you want you can apply threshold function

2) If grayscale image needed :

enter image description here

Additional :

Morphological closing also work good in your case

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))

(code in Python API)

Result Below:

enter image description here