2012-05-12 3 views
10

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

Update

Я попробовал предложенную функцию 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

Stack Overflow предоставляет бесплатный хостинг изображений, просто нажмите кнопку изображения на панели инструментов и наведите на изображение, размещенное локально на вашем компьютере, в другом месте в Интернете. Это фактически загружает и зеркалирует копию изображения, что гарантирует, что он всегда будет доступен, даже если внешний источник не работает. Я уже переместил изображения, которые вы разместили, но просто что-то, что нужно помнить о будущем. –

+0

Я не знаю почему, но equalizehist дает худший результат в таких случаях .. У меня тоже есть эта проблема иногда. –

ответ

18

Я обсуждал некоторые методы здесь: How can I adjust contrast in OpenCV in C?

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

1) Thresholding:

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

+1

+1 Мне очень нравятся ваши ответы, продолжайте хорошую работу. – karlphillip

+1

спасибо !!!!! –

+0

@AbidRahmanK: можете ли вы поделиться своим кодом со мной? –

5

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

EDIT

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

5

Я предлагаю использовать AdaptiveThreshold. Он работает, выполняя локальные пороговые значения для каждого пикселя изображения (это действительно очень важно, когда есть градиентные фоны, немного сильнее, чем на вашем изображении). Параметр blockSize - это размер окрестности, а значение обработанных пикселей должно быть больше среднего значения окрестности минус param1.

enter image description here

Вот как сделать это в Python (это должно быть очень легко преобразовать в):

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

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

Смежные вопросы