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.
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 doncCV_THRESH_BINARY
(vous pouvez utiliser l'un des 5 drapeaux fournis par opencv) combiné avecCV_THRESH_OTSU
Lien vers la documentation: http://docs.opencv.org/modules/imgproc/doc/miscivers_transformations.html#threshold
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()
Dans Android est une ligne.
Imgproc.threshold(matGrayIn, matOtsuOut, 0, 255, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);