Как использовать порог 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);

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


person U23r    schedule 17.06.2013    source источник


Ответы (3)


Следующая строка выполняет операцию определения порога 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 является обязательным флагом для выполнения пороговой обработки Otsu. Поскольку на самом деле мы хотели бы выполнить двоичное пороговое значение, поэтому мы используем CV_THRESH_BINARY (вы можете использовать любой из 5 флагов, предоставляемых opencv) в сочетании с CV_THRESH_OTSU

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

person marol    schedule 19.06.2013

В питоне это просто

import cv2

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

В Android одна строчка.

Imgproc.threshold(matGrayIn, matOtsuOut, 0, 255, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);
person JFrank    schedule 21.04.2017