Могу ли я добавить смещение к порогу Otsu в OpenCV? - PullRequest
1 голос
/ 16 января 2020

Вот мой пример. Слева направо:

  1. исходное изображение
  2. оттенки серого + (3,3) размытие по Гауссу
  3. Определение порогового значения Otsu + инвертирование пикселей

enter image description here

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

Возможно ли это из коробки? Или мне нужно сделать что-то ручное?

Ответы [ 3 ]

3 голосов
/ 16 января 2020

У меня есть ответ, предоставленный феноменом резиновой утки.

th, th_img = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

0-й индекс возвращаемого кортежа (th) - это пороговое значение, которое выбрал алгоритм бинаризации Оцу. Я могу отказаться от th_img и применить любое смещение, которое мне нравится, к th, прежде чем использовать его в обычном бинарном пороге.

desired_th = th*1.2
_, th_img = cv2.threshold(blur, desired_th, 255, cv2.THRESH_BINARY)

Вот что я получаю. Очистив ненужные спеклы, которые могут появиться снаружи, я получу то, что искал.

enter image description here

2 голосов
/ 17 января 2020

Альтернативой смещенному порогу Оцу является создание порогового значения на основе региона, что-то вроде этого:

thr = .8
blur_hor = cv2.filter2D(img[:, :, 0], cv2.CV_32F, kernel=np.ones((11,1,1), np.float32)/11.0, borderType=cv2.BORDER_CONSTANT)
blur_vert = cv2.filter2D(img[:, :, 0], cv2.CV_32F, kernel=np.ones((1,11,1), np.float32)/11.0, borderType=cv2.BORDER_CONSTANT)
output = ((img[:,:,0]<blur_hor*thr) | (img[:,:,0]<blur_vert*thr)).astype(np.uint8)*255
0 голосов
/ 17 января 2020

В C ++ я часто "настраиваю" пороговое значение, возвращаемое функцией порога (otsu), умножая его на коэффициент и передавая обратно (фиксированной) функции порога:

//get the threshold computed by otsu:
double otsuThresh = cv::threshold( inputImage, otsuBinary, 0, 255,cv::THRESH_OTSU );

//tune the threshold value:
otsuThresh = 0.5 * otsuThresh;

//threshold the input image with the new value:
cv::threshold( inputImage, binaryFixed, otsuThresh, 255, cv::THRESH_BINARY );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...