Я пытаюсь растянуть контраст изображения 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)
Я благодарен за любые подсказки о том, какую простую функцию я мог упустить из виду или что я мог бы использовать, чтобы сделать это проще (вручную)!
cv::normalize
с параметромNORM_MINMAX
. Ваша последняя формула тоже в порядке. - person Miki   schedule 17.01.2016numpy.uint8(...)
- person Miki   schedule 17.01.2016import 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