Уменьшение отражения изображения

Проблемы с освещением являются общими и сложными. Как обнаружить и уменьшить отражение света, чтобы сохранить больше информации с изображения? Я попытался несколько методов с OpenCV и Python без удачи.

(Изображение с отражением)

image with light reflection

(Изображение без отражения)

image without light reflection

Я попытался преобразовать в цветовое пространство HSV и применить выравнивание гистограммы к каналу V с выравниванием Clahe :

import cv2
import numpy as np

image = cv2.imread('glare.png')

hsv_image = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
h, s, v = cv2.split(hsv_image)

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
v = clahe.apply(v)

hsv_image = cv2.merge([h, s, v])
hsv_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB)

cv2.imwrite('clahe_h.png', hsv_image)

результаты:

image after clahe equalization

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

import cv2
import numpy as np

image = cv2.imread('glare.png')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)[1]

dst_TELEA = cv2.inpaint(image,thresh,3,cv2.INPAINT_TELEA)
cv2.imwrite('after_INPAINT.png',dst_TELEA)

результаты: (после порога) after threshold

after inpainting

Ответ 1

Нет общего метода для эффективного удаления бликов.

HSV + CLAHE - хорошее и распространенное начало, но отраслевые методы "обманывают", предполагая некоторую информацию о предмете (человеческое лицо, фрукты на конвейерной ленте, сетчатка через офтальмоскоп), а иногда и информацию об освещении (белый потолочный светильник с очень острые края, для изображений в этом вопросе).