web-dev-qa-db-fra.com

Comment utiliser le seuil OTSU en opencv?

J'utilisais un seuil fixe mais il s'avère que ce n'est pas si bon pour moi. Ensuite, quelqu'un m'a parlé du seuil otsu. Comment puis-je l'utiliser dans mon code? J'ai lu à ce sujet et je ne comprends pas très bien. Quelqu'un pourrait-il m'expliquer comment l'utiliser dans 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 cela, je dois changer le seuil pour n'importe quelle image que je veux convertir en binaire. J'ai trouvé ça:

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

Est-ce correct? Je ne comprends pas très bien et à cause de cela, je ne savais pas comment m'adapter à mon code.

35
U23r

La ligne suivante effectue l'opération de seuillage otsu:

cv::threshold(im_gray, img_bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
  • im_gray est une image source 8 bits,
  • img_bw est un résultat,
  • 0 signifie un niveau de seuil qui est réellement omis car nous avons utilisé le drapeau CV_THRESH_OTSU,
  • 255 est une valeur qui va être attribuée à respectivement des pixels dans le résultat (à savoir, à tous les pixels dont la valeur dans la source est supérieure au niveau de seuil calculé)
  • CV_THRESH_BINARY | CV_THRESH_OTSU est un indicateur requis pour effectuer le seuillage Otsu. Parce qu'en fait, nous aimerions effectuer un seuillage binaire, nous utilisons donc CV_THRESH_BINARY (vous pouvez utiliser l'un des 5 drapeaux fournis par opencv) combiné avec CV_THRESH_OTSU

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

70
marol

En python c'est simple

import cv2

img = cv2.imread('img.jpg',0)  #pass 0 to convert into gray level 
ret,thr = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)
cv2.imshow('win1', thr)
cv2.waitKey(0)  
cv2.destroyAllWindows()
8
ashish

Dans Android est une ligne.

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