нормализация освещения с использованием python opencv - PullRequest
0 голосов
/ 18 июня 2020

Я занимаюсь классификацией изображений с помощью глубокого обучения и хочу реализовать нормализацию освещения, которая представлена ​​в разделе 4.4 документа https://arxiv.org/pdf/1907.09449.pdf ,, но я не получил ожидаемых результатов.

В разделе 4.4 документа он использует фильтр Гаусса Керенла для получения фонового изображения, затем вычитает его из канала Y в цветовом пространстве YCrCb, я пытаюсь воспроизвести результат, но он не такой, как бумага на рисунке 4.

ниже мой код

image = cv2.imread(file)
cv2.imshow("origin", image)

# illumination normalize
ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)
y, cr, cb = cv2.split(ycrcb)

# get background which paper says (gaussian method using standard deviation 5 pixel)
gaussian = cv2.GaussianBlur(y, (0, 0), 5, 5)

# subtract background from Y channel which paper says
y = y - gaussian
ycrcb = cv2.merge([y, cr, cb])

output = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)
cv2.imshow("output", output)

, но изображение результата вывода (см. Ниже) не такое, как написано на бумаге (рис. 4)

исходное изображение -> нормализованное изображение освещенности

кто-нибудь знает, как это сделать? спасибо за вашу огромную помощь: -)

1 Ответ

1 голос
/ 18 июня 2020

У вас две проблемы. Во-первых, вам нужно настроить сигму для размытия по Гауссу пропорционально размеру изображения по сравнению с размером 299 пикселей, используемым в эталоне. Во-вторых, вам нужно смещать разницу к среднему серому. Отрегулируйте смещение по желанию для яркости.

Вот как я добился этого в Python / OpenCV.

Ввод:

enter image description here

import cv2
import numpy as np

# read input
image = cv2.imread('retina2.jpg')
hh, ww = image.shape[:2]
print(hh, ww)
max = max(hh, ww)

# illumination normalize
ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)

# separate channels
y, cr, cb = cv2.split(ycrcb)

# get background which paper says (gaussian blur using standard deviation 5 pixel for 300x300 size image)
# account for size of input vs 300
sigma = int(5 * max / 300)
print('sigma: ',sigma)
gaussian = cv2.GaussianBlur(y, (0, 0), sigma, sigma)

# subtract background from Y channel
y = (y - gaussian + 100)

# merge channels back
ycrcb = cv2.merge([y, cr, cb])

#convert to BGR
output = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)

# save results
cv2.imwrite('retina2_proc.jpg', output)

# show results
cv2.imshow("output", output)
cv2.waitKey(0)


Результаты:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...