How to use the OTSU Threshold in opencv?

U23r picture U23r · Jun 17, 2013 · Viewed 89.6k times · Source

I was using a fixed threshold but turns out that it's not so good for me. Then, someone told me about the otsu threshold. How can I use it in my code? I read about it and I don't understand very well. Could someone explain to me how to use it in OpenCV the otsu threshold?

Here is my code now:

#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;
}  

With this I have to change the threshold to any image that I want to convert to binary. I found this:

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

Is that right? I don't understand very well and because of that, didn't know how I could adapt to my code.

Answer

marol picture marol · Jun 19, 2013

Following line makes otsu thresholding operation:

cv::threshold(im_gray, img_bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
  • im_gray is a source 8-bit image,
  • img_bw is a result,
  • 0 means threshold level which actually is omitted because we used CV_THRESH_OTSU flag,
  • 255 is a value that is going to be assigned to respectively pixels in the result (namely, to all pixels which value in the source is greater then computed threshold level)
  • CV_THRESH_BINARY | CV_THRESH_OTSU is a required flag to perform Otsu thresholding. Because in fact we would like to perform binary thresholding, so we use CV_THRESH_BINARY (you can use any of 5 flags opencv provides) combined with CV_THRESH_OTSU

Link to documentation: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#threshold