web-dev-qa-db-ja.com

opencvでOTSUしきい値を使用する方法は?

固定のしきい値を使用していましたが、私にはあまり良くないことがわかりました。次に、誰かが大津の敷居について教えてくれました。コードでどのように使用できますか?私はそれについて読んだのですが、よくわかりません。誰かがOpenCVで大津のしきい値を使用する方法を説明できますか?

ここに私のコードがあります:

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

これを使用して、バイナリに変換する任意の画像のしきい値を変更する必要があります。私はこれを見つけました:

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

そうですか?私はあまりよく理解しておらず、そのために、どのようにコードに適応できるのか分かりませんでした。

35
U23r

次の行は、大津しきい値操作を行います:

cv::threshold(im_gray, img_bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
  • im_grayはソースの8ビット画像です。
  • img_bwは結果です。
  • 0は、CV_THRESH_OTSUフラグを使用したため実際に省略されたしきい値レベルを意味します。
  • 255は、結果の各ピクセル(つまり、ソースの値が計算されたしきい値レベルよりも大きいすべてのピクセル)に割り当てられる値です
  • CV_THRESH_BINARY | CV_THRESH_OTSUは、大津しきい値処理を実行するために必要なフラグです。実際、バイナリしきい値処理を実行したいので、CV_THRESH_BINARY(opencvが提供する5つのフラグのいずれかを使用できます)とCV_THRESH_OTSU

ドキュメントへのリンク: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#threshold

70
marol

pythonそれは簡単です

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

In Androidは1行です。

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