2013-06-17 4 views
23

Ich benutzte eine feste Schwelle, aber stellt sich heraus, dass es nicht so gut für mich ist. Dann erzählte mir jemand von der Otsu-Schwelle. Wie kann ich es in meinem Code verwenden? Ich lese darüber und verstehe nicht sehr gut. Könnte mir jemand erklären, wie man in OpenCV die Otsu-Schwelle benutzt?Wie wird der OTSU-Schwellenwert in opencv verwendet?

Hier ist mein Code jetzt:

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

Damit habe ich die Schwelle zu jedem Bild, das ich in das Binärformat konvertieren ändern möchten. Ich fand das:

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

Ist das richtig? Ich verstehe das nicht sehr gut und wusste deshalb nicht, wie ich mich an meinen Code anpassen könnte.

Antwort

59

folgende Zeile macht Otsu Schwellwertoperation:

cv::threshold(im_gray, img_bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 
  • im_gray ist eine Quelle 8-Bit-Bild,
  • img_bw ist ein Ergebnis,
  • 0 bedeutet Schwellwertpegel, die tatsächlich weggelassen Weil wir das Flag CV_THRESH_OTSU verwendet haben, ist
  • 255 ein Wert, der dem jeweiligen Wert zugewiesen wird y Pixel im Ergebnis (dh an alle Pixel, deren Wert in der Quelle größer als der berechnete Schwellenwert ist)
  • CV_THRESH_BINARY | CV_THRESH_OTSU ist ein erforderliches Flag für die Otsu-Schwellenwertbildung. Denn in der Tat möchten wir binäre Thresholding auszuführen, also verwenden wir CV_THRESH_BINARY (können Sie alle 5-Flags verwenden opencv bietet) mit kombinierten CV_THRESH_OTSU

Link zur Dokumentation: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#threshold

1

In Python ist es einfach

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() 
0

In Android ist eine Zeile.

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