Как сделать контрастное растяжение в opencv или numpy?

Я пытаюсь растянуть контраст изображения opencv3/numpy.ndarray в своем приложении Python 3.

Я нашел метод нормализации, но он, кажется, делает обратное, например, от 1 до 255 в диапазоне от 10 до 11. В numpy я не нашел ничего простого, но в opencv я наткнулся на convertScaleAbs функция. я дал это

alpha=255 / (upper_boundary - lower_boundary)

как масштабирование и

beta=(- (lower_boundary * (255 / (upper_boundary - lower_boundary)))

как дельта, но это дает странные результаты, когда темные части становятся очень светлыми, несмотря на вход, например. 10 и 250.

Я не уверен, правильна ли моя математика или нет. Я также видел эту формулу newValue = 255 * (oldValue - minValue)/(maxValue - minValue) в другом вопросе, но я нельзя применить это к концепции масштаба и дельты функции convertScaleAbs, верно?

Редактировать: я также попробовал функцию normalize opencv с alpha=lower_boundary, beta=upper_boundary and norm_type=cv2.NORM_MINMAX, в результате я могу вводить числа от 0 до 255, но результирующее изображение имеет только эти значения яркости, а контраст меньше, не растягивается!

Вот минимальный полный проверяемый пример:

import cv2
image = cv2.imread("Tux.png")
cv2.normalize(image, image, alpha=20, beta=200, norm_type=cv2.NORM_MINMAX)
cv2.namedWindow("TestWindow", cv2.WINDOW_AUTOSIZE)
cv2.imshow("Test", image)
cv2.waitKey(0)

Я благодарен за любые подсказки о том, какую простую функцию я мог упустить из виду или что я мог бы использовать, чтобы сделать это проще (вручную)!


person xuiqzy    schedule 17.01.2016    source источник
comment
взгляните на cv::normalize с параметром NORM_MINMAX. Ваша последняя формула тоже в порядке.   -  person Miki    schedule 17.01.2016
comment
@Miki, спасибо, я уже пробовал это, см. мою правку для проблем.   -  person xuiqzy    schedule 17.01.2016
comment
проверьте минимальные и максимальные значения в вашем изображении. Если они не в [0,255], у вас есть проблема. Если ваши исходные значения находятся в [0, 65K], вам нужно разделить их на 256, прежде чем применять numpy.uint8(...)   -  person Miki    schedule 17.01.2016
comment
исходные значения находятся в диапазоне от 0 до 255 И формат уже uint8 ... в чем может быть проблема?   -  person xuiqzy    schedule 17.01.2016
comment
Вы должны опубликовать минимально воспроизводимый пример. Трудно сказать, не видя код, вызывающий проблему с вашим изображением.   -  person Miki    schedule 17.01.2016
comment
Извините, это правильно, конечно! Здесь и см. правку: import cv2 image = cv2.imread("Tux.png") cv2.normalize(image, image, alpha=20, beta=200) cv2.namedWindow("TestWindow", cv2.WINDOW_AUTOSIZE) cv2.imshow("Test", image) cv2.waitKey(0)   -  person xuiqzy    schedule 17.01.2016
comment
Конечно, я имел в виду с norm_type=cv2.NORM_MINMAX, в результате я могу вводить числа от 0 до 255, но результирующее изображение имеет только эти значения яркости, а контраст меньше, не растягивается   -  person xuiqzy    schedule 17.01.2016
comment
вы можете попробовать это, указанное в моем ответе. Он написан на питоне.   -  person Jeru Luke    schedule 15.12.2016