Here is a simple example showing implementation of OTSU thresholding in OpenCV.
Note: OTSU threshold available in OpenCV via the function threshold() and by using the pre-defined operand THRESH_OTSU
http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#threshold
Compatibility > OpenCV 1.0
Files:
Download from DsynFLO box folder - https://app.box.com/s/zzpm5yawbkin5fdbqutl
Source Code:
//______________________________________________________________________________________ // Program : OpenCV Otsu Thresholding // Author : Bharath Prabhuswamy //______________________________________________________________________________________ #include <cv.h> #include <highgui.h> #include <stdio.h> int main ( int argc, char **argv ) { CvCapture* capture = 0; IplImage* img = 0; capture = cvCaptureFromCAM( 0 ); if ( !capture ) // Check for Camera capture return -1; cvNamedWindow("Camera",CV_WINDOW_AUTOSIZE); cvNamedWindow("Threshold",CV_WINDOW_AUTOSIZE); IplImage* gray = 0; IplImage* thres = 0; bool init = false; // Flag to identify initialization of Image objects if(init == false) { img = cvQueryFrame( capture ); // Query for the frame if( !img ) // Exit if camera frame is not obtained return -1; // Creation of Intermediate 'Image' Objects required later gray = cvCreateImage( cvGetSize(img), 8, 1 ); // To hold Grayscale Image thres = cvCreateImage( cvGetSize(img), 8, 1 ); // To hold OTSU thresholded Image init = true; } int ihist[256]; // Array to store Histogram values float hist_val[256]; // Array to store Normalised Histogram values int pos ; // Position or pixel value of the image float prbn; // First order cumulative float meanitr; // Second order cumulative float meanglb; // Global mean level int OPT_THRESH_VAL; // Optimum threshold value float param1,param2; // Parameters required to work out OTSU threshold algorithm double param3; int h,w; // Variables to store Image Height and Width h = img->height; // Height and width of the Image w = img->width; int key = 0; while(key != 'q') { //Step : Capture Image from Camera //Info : Inbuit function from OpenCV //Note : img = cvQueryFrame( capture ); // Query for the frame //Step : Convert Image captured from Camera to GrayScale //Info : Inbuit function from OpenCV //Note : Image from Camera and Grayscale are held using seperate "IplImage" objects cvCvtColor(img,gray,CV_RGB2GRAY); // Convert RGB image to Gray //Step : Threshold the image using optimum Threshold value obtained from OTSU method //Info : //Note : memset(ihist, 0, 256); for(int j = 0; j < gray->height; ++j) // Use Histogram values from Gray image { uchar* hist = (uchar*) (gray->imageData + j * gray->widthStep); for(int i = 0; i < gray->width; i++ ) { pos = hist[i]; // Check the pixel value ihist[pos] += 1; // Use the pixel value as the position/"Weight" } } //Parameters required to calculate threshold using OTSU Method prbn = 0.0; // First order cumulative meanitr = 0.0; // Second order cumulative meanglb = 0.0; // Global mean level OPT_THRESH_VAL = 0; // Optimum threshold value param1,param2; // Parameters required to work out OTSU threshold algorithm param3 = 0.0; //Normalise histogram values and calculate global mean level for(int i = 0; i < 256; ++i) { hist_val[i] = ihist[i] / (float)(w * h); meanglb += ((float)i * hist_val[i]); } // Implementation of OTSU algorithm for (int i = 0; i < 255; i++) { prbn += (float)hist_val[i]; meanitr += ((float)i * hist_val[i]); param1 = (float)((meanglb * prbn) - meanitr); param2 = (float)(param1 * param1) /(float) ( prbn * (1.0f - prbn) ); if (param2 > param3) { param3 = param2; OPT_THRESH_VAL = i; // Update the "Weight/Value" as Optimum Threshold value } } cvThreshold(gray,thres,OPT_THRESH_VAL,255,CV_THRESH_BINARY); // Threshold the Image using the value obtained from OTSU method cvShowImage( "Camera",img); cvShowImage( "Threshold",thres); key = cvWaitKey(1); // OPENCV: wait for 1ms before accessing next frame } // End of while loop cvDestroyWindow( "Camera" ); // Release various parameters cvReleaseImage(&img); cvReleaseImage(&gray); cvReleaseImage(&thres); return 0; } // End of Main Loop //------------------------------------------------------------------------------------------------------------------------
No comments:
Post a Comment