it-swarm.com.ru

Увеличьте яркость изображения без переполнения

У меня возникла проблема при попытке увеличить яркость изображения.

Вот изображение происхождения:

 enter image description here

Изображение, которое я хотел получить, выглядит так:

 enter image description here

Теперь увеличим яркость с помощью следующего кода:

    image = cv2.imread("/home/wni/vbshare/tmp/a4_index2.png",0)

    if sum(image[0])/len(image[0])<200:
        new = np.where((255-image)<image,255,image*2)
    else:
        new = image
    return new

И я получил следующее изображение:

 enter image description here

Итак, кажется, яркость некоторых точек переполнилась.

И я попытался изменить пороговое значение с 200 на другое число, например 125, 100, 140 .etc Однако яркость изображения остается почти такой же темной или переполняется.

Env:

Python: 2.7.10

Opencv: 3.2.0

Любое предложение для этого приветствуется.

Благодарю.

10
Wesley

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

NB: Показанный код должен работать как с ветками 2.4.x, так и 3.x OpenCV.

Шаг 0

Загрузите входное изображение в градациях серого.

img = cv2.imread('paper.jpg',0)

Шаг 1

Расширьте изображение, чтобы избавиться от текста .... Этот шаг несколько помогает сохранить штрих-код.

dilated_img = cv2.dilate(img, np.ones((7,7), np.uint8)) 

 Dilated

Шаг 2

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

Это должно дать нам довольно хорошее фоновое изображение, которое содержит все тени и/или изменение цвета.

bg_img = cv2.medianBlur(dilated_img, 21)

 Blurred

Шаг 3

Рассчитайте разницу между оригиналом и фоном, который мы только что получили. Биты, которые идентичны, будут черными (близкая к 0 разница), текст будет белым (большая разница).

Так как мы хотим черного на белом, мы инвертируем результат.

diff_img = 255 - cv2.absdiff(img, bg_img)

 Inverted Difference

Шаг 4

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

norm_img = diff_img.copy() # Needed for 3.x compatibility
cv2.normalize(diff_img, norm_img, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)

 Normalized

Шаг 5

На данный момент у нас все еще есть бумага несколько серого цвета. Мы можем обрезать это и повторно нормализовать изображение.

_, thr_img = cv2.threshold(norm_img, 230, 0, cv2.THRESH_TRUNC)
cv2.normalize(thr_img, thr_img, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)

 Gray Trimmed

Готово...

Ну, по крайней мере для меня;) Вы, вероятно, захотите обрезать его и сделать любую другую постобработку, какую пожелаете.


Примечание. Возможно, стоит получить более высокую точность (16+ бит int или float) после получения разностного изображения, чтобы минимизировать накопление ошибок округления при повторяющихся нормализациях.

20
Dan Mašek

Что вам нужно, это порог . Это позволит вам установить все, что не очень темное, на чистый белый, а очень темное - на прямой черный (или любые другие цвета). Это должно помочь вам начать:

cutoff_val = 100 # everything above this is set to set_color
set_color = 255 
ret,thresh_img = cv2.threshold(image,cutoff_val,set_color,cv2.THRESH_BINARY)

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

Смотрите это отличное руководство делайте в основном то, что вы хотите --- и бонус, оно включает в себя руководство по деформации, чтобы получить прямоугольную область для бумаги!

Правка: Я получил довольно хорошие результаты с вашим изображением, сочетающим порог и затем адаптивный порог.

cutoff_val = 150 # everything above this is set to the cutoff val
set_color = 255 # if 
ret,thresh_img = cv2.threshold(image,cutoff_val,set_color,cv2.THRESH_TRUNC)
window_sz = 3
thresh_img2 = cv2.adaptiveThreshold(thresh_img,set_color,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
            cv2.THRESH_BINARY,window_sz,2)
2
Alexander Reynolds