Вопрос по c – Как я могу настроить контраст в OpenCV в C?

6

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

Исходное изображение:

enter image description here

Модифицированное изображение:

enter image description here

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

@Abid Rahman K Изображения добавлены .. edsonlp1
Их можно настроить в opencv. Но было бы более полезно, если бы вы могли добавить изображение, а затем объяснить, что вы хотите. Abid Rahman K
@Abid Rahman K Я закончил с фотошопом :). Я только исправил контраст, но я хочу сделать это с помощью opencv edsonlp1
Второе изображение, которое вы хотели получить в результате? Если да, то как ты это сделал? то же самое можно сделать в Opencv Abid Rahman K

Ваш Ответ

3   ответа
9

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

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

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

enter image description here

2) Thresholding :

Здесь я сравнил значение ввода каждого пикселя с произвольным значением (которое я взял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) If you are compulsory to get grayscale image as output, do as follows:

(код написан на 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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded edsonlp1
Error: User Rate Limit Exceeded
10

Вы также можете проверить алгоритм 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

0

Хотя этот пост немного в возрасте: Как насчет использования & quot; cvAddWeighted () & quot; ?

Что это делает:

             dst = src1*alpha + src2*beta + gamma

Что я понимаю из применения яркости и контраста, так это то, что каждый хочет сделать:

             dst = src*contrast + brightness;

так что если

             src1  = input image
             src2  = any image of same type as src1
             alpha = contrast value
             beta  = 0.0
             gamma = brightness value
             dst   = resulting Image (must be of same type as src1)

Надо в значительной степени покончить с задачей, нет?

Этот подход работает для меня, используя изображения CvMat *

C: void cvAddWeighted(const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst)Error: User Rate Limit ExceededC++ addWeighted()
Error: User Rate Limit Exceeded

Похожие вопросы