Как настроить контраст в OpenCV в C?

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

оригинальное изображение:

enter image description here

изменен изображения:

enter image description here

спасибо заранее!

2 ответов


Я думаю, что вы можете регулировать контрастность двумя способами:

1) Выравнивание Гистограммы :

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

enter image description here

2) порог :

здесь я сравнил каждое значение пикселя ввода с произвольным значением (которое я взял 127). Ниже приведена логика, которая имеет встроенную функцию в opencv. But remember, output is Binary image, not grayscale as you did.

If (input pixel value >= 127):
    ouput pixel value = 255
else:
    output pixel value = 0

и ниже результат, который я получил:

enter image description here

для этого вы можете использовать пороговая функция или сравнить функции

3) если вы обязаны получить изображение в оттенках серого в качестве вывода, сделайте следующее:

(код находится в OpenCV-Python, но для каждой функции соответствующие функции C доступны в opencv.itseez.com)

for each pixel in image:
   if pixel value >= 127: add 'x' to pixel value.
   else : subtract 'x' from pixel value. 

('x' - произвольное значение.) Таким образом, увеличивается разница между светлыми и темными пикселями.

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

bigmask = cv2.compare(img,np.uint8([127]),cv2.CMP_GE)
smallmask = cv2.bitwise_not(bigmask)

x = np.uint8([90])
big = cv2.add(img,x,mask = bigmask)
small = cv2.subtract(img,x,mask = smallmask)
res = cv2.add(big,small)

и ниже получен результат:

enter image description here


вы также можете проверить алгоритм OpenCV CLAHE. Вместо того чтобы выравнивать гистограмму глобально, она разбивает изображение на плитки и выравнивает их локально, а затем сшивает их вместе. Это может дать гораздо лучший результат.

С вашим изображением в OpenCV 3.0.0:

import cv2
inp = cv2.imread('inp.jpg',0)
clahe = cv2.createCLAHE(clipLimit=4.0, tileGridSize=(8,8))
res = clahe.apply(inp)
cv2.imwrite('res.jpg', res)

дает что-то очень приятное

After CLAHE

подробнее об этом здесь, хотя это не супер полезный: http://docs.opencv.org/3.1.0/d5/daf/tutorial_py_histogram_equalization.html#gsc.tab=0