Как выравнивать контрастность и яркость изображений с помощью opencv?

У меня есть изображение, которое я просмотрел, но белая бумага не является белой на экране. Есть ли способ уравнять контракт/яркость, чтобы сделать фоном более белым?

Обновление

Я пробовал предложенную функцию Image._EqualizeHist из EmguCv:

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

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

Но получайте еще худший результат (также при первом сером масштабировании):

Мне не хватает других параметров?

Ответ 1

Я обсудил некоторые методы здесь: Как настроить контрастность в 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))

(код в API Python)

Результат ниже:

enter image description here

Ответ 2

Он называется equalizeHist. Я не знаю его имени в emgu, но результат должен быть именно тем, что вам нужно - ярким фоном и более темным текстом.

ИЗМЕНИТЬ

Чтобы извлечь только края (которые сильно отличаются от методов улучшения изображения), вы можете просто применить Canny. Выберите два порога как 20 и 60 для начала, а затем увеличьте (или уменьшите их), сохраняя между ними соотношение 3: 1, пока не получите красивое изображение.

Ответ 3

Я предлагаю использовать 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

В любом случае вы также можете проверить каждый пиксель. Установите значение 0, если значение меньше заданного значения, и установите значение 255, если оно превышает значение параметра.