2013-06-17 9 views
23

Użyłem ustalonego progu, ale okazało się, że nie jest to dla mnie dobre. Wtedy ktoś powiedział mi o progu otsu. Jak mogę go użyć w moim kodzie? Czytam o tym i nie rozumiem zbyt dobrze. Czy ktoś mógłby mi wytłumaczyć, jak używać go w OpenCV, w progu otsu?Jak korzystać z progu OTSU w opencv?

Oto mój kod teraz:

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

Z tym muszę zmienić próg do każdego obrazu, który chcę przekonwertować do pliku binarnego. Znalazłem to:

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

Czy to prawda? Nie rozumiem bardzo dobrze iz tego powodu nie wiedziałem, jak mogę dostosować się do mojego kodu.

Odpowiedz

59

Po linia sprawia Ōtsu operacji progowej:

cv::threshold(im_gray, img_bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 
  • im_gray jest źródłem 8-bitowy obraz,
  • img_bw jest wynikiem,
  • 0 oznacza poziom progowy, który faktycznie jest pominięta ponieważ użyliśmy flagi CV_THRESH_OTSU,
  • 255 to wartość, która zostanie przypisana do odpowiedniego y piksele w wyniku (a mianowicie do wszystkich pikseli, których wartość w źródle jest większa niż obliczony poziom progowy)
  • CV_THRESH_BINARY | CV_THRESH_OTSU to flaga wymagana do wykonywania progów Otsu. Ponieważ w rzeczywistości chcielibyśmy wykonać progowanie binarny, więc używamy CV_THRESH_BINARY (można użyć dowolnego z 5 flagami OpenCV zapewnia) w połączeniu z CV_THRESH_OTSU

Link do dokumentacji: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#threshold

1

W Pythonie jest proste

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

W systemie Android to jedna linia.

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