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

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

обновление

Я пробовал предложенное изображение._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();

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

Я отсутствуют другие параметры?

5 ответов


Я обсудил некоторые методы здесь:как я могу настроить контраст в OpenCV в C?

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

1) порог:

Thresholding дает двоичное изображение. Если это то, что вы хотите, вы можете применить 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


Я предлагаю использовать AdaptiveThreshold. Он работает, делая локальный порог соседства для каждого пикселя на изображении (это действительно важно, когда есть градиентные фоны, немного сильнее, чем на вашем изображении). The 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)

Это называется 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 (на самом деле это 172, если вы используете img.max()). Таким образом, вы можете умножить свой образ 255/172 = 1.48 увеличить яркость.

см. результаты ниже:

enter image description here

и гистограммы, соответственно:

enter image description here


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