Comment utiliser le seuil OTSU dans opencv?

j'utilisais un seuil fixe mais il s'avère que ce n'est pas si bon pour moi. Puis, quelqu'un m'a parlé du seuil d'otsu. Comment puis-je l'utiliser dans mon code? Je l'ai lu et je ne comprends pas très bien. Quelqu'un pourrait-il m'expliquer comment l'utiliser OpenCV le seuil otsu?

<!-Voici mon code maintenant:

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

avec ceci je dois changer le seuil à n'importe quelle image que je veux convertir en binaire. J'ai trouvé ceci:

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

Est ce que le droit? Je Je ne comprends pas très bien et à cause de ça, Je ne savais pas comment m'adapter à mon code.

27
demandé sur U23r 2013-06-17 10:27:12

3 réponses

la ligne suivante fait l'opération de battage otsu:

cv::threshold(im_gray, img_bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
  • im_gray est une source d'image 8 bits,
  • img_bw
  • 0 signifie seuil de seuil qui est en fait omis parce que nous avons utilisé CV_THRESH_OTSU flag,
  • 255 est une valeur qui va être assignée respectivement aux pixels dans le résultat (à savoir, à tous les pixels dont la valeur dans la source est plus grande que le seuil calculé niveau)
  • CV_THRESH_BINARY | CV_THRESH_OTSU est un drapeau requis pour effectuer le battage Otsu. Parce qu'en fait nous aimerions effectuer le battage binaire, donc nous utilisons CV_THRESH_BINARY (vous pouvez utiliser l'une des 5 drapeaux opencv) combiné avec CV_THRESH_OTSU

lien vers la documentation: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#threshold

63
répondu marol 2013-06-19 09:42:17

en python c'est simple

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()
4
répondu ashish 2018-03-09 18:18:29

Dans Android est une ligne.

Imgproc.threshold(matGrayIn, matOtsuOut, 0, 255, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);
0
répondu JFrank 2017-04-21 07:56:43