Как использовать порог OTSU в opencv?

Я использовал фиксированный порог, но оказалось, что это не так хорошо для меня. Затем кто-то рассказал мне о пороге отсу. Как я могу использовать его в своем коде? Я читал об этом, и я не очень хорошо понимаю. Может кто-нибудь объяснить мне, как использовать его в OpenCV порог otsu?

Вот мой код сейчас:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main ( int argc, char **argv )
{
   Mat im_gray = imread("img3.jpg",CV_LOAD_IMAGE_GRAYSCALE);

   Mat im_rgb  = imread("img3.jpg");
   cvtColor(im_rgb,im_gray,CV_RGB2GRAY);

   Mat img_bw = im_gray > 115;

   imwrite("img_bw3.jpg", img_bw);

   return 0;
}  

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

cvThreshold(scr, dst, 128, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

Это правильно? Я не очень хорошо понимаю и из-за этого не знал, как я могу адаптироваться к моему коду.

Ответ 1

Следующая строка делает операцию порога otsu:

cv::threshold(im_gray, img_bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
  • im_gray является исходным 8-битным изображением,
  • img_bw - результат,
  • 0 означает пороговый уровень, который фактически опускается, поскольку мы использовали флаг CV_THRESH_OTSU,
  • 255 - значение, которое будет назначаться соответственно пикселям в результате (а именно, ко всем пикселям, значение которых в источнике больше, чем вычисленный пороговый уровень)
  • CV_THRESH_BINARY | CV_THRESH_OTSU CV_THRESH_BINARY | CV_THRESH_OTSU является обязательным флагом для выполнения порога Otsu. Поскольку на самом деле мы хотели бы выполнить двоичное пороговое значение, поэтому мы используем CV_THRESH_BINARY (вы можете использовать любой из 5 флагов opencv) в сочетании с CV_THRESH_OTSU

Ссылка на документацию: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#threshold

Ответ 2

В python это просто

import cv2
a = imread('img.jpg',0)  #pass 0 to convert into gray level 
ret,thr = cv2.threshold(a, 0, 255, cv2.THRESH_OTSU)
cv2.imshow('win1', thr)
cv2.waitKey(0)  
cv2.destroyAllWindows()

Ответ 3

В Android есть одна строка.

Imgproc.threshold(matGrayIn, matOtsuOut, 0, 255, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);