Как использовать порог OTSU в opencv?
Я использовал фиксированный порог, но оказалось, что это не так хорошо для меня. Затем кто-то рассказал мне о пороге отсу. Как я могу использовать его в своем коде? Я читал об этом, и я не очень хорошо понимаю. Может кто-нибудь объяснить мне, как использовать его в OpenCV порог otsu?
Вот мой код сейчас:
#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);
Это правильно? Я не очень хорошо понимаю и из-за этого не знал, как я могу адаптироваться к моему коду.
Ответы
Ответ 1
Следующая строка делает операцию порога otsu:
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 | CV_THRESH_OTSU
является обязательным флагом для выполнения порога Otsu. Поскольку на самом деле мы хотели бы выполнить двоичное пороговое значение, поэтому мы используем CV_THRESH_BINARY
(вы можете использовать любой из 5 флагов opencv) в сочетании с CV_THRESH_OTSU
Ссылка на документацию: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#threshold
Ответ 2
В python это просто
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()
Ответ 3
В Android есть одна строка.
Imgproc.threshold(matGrayIn, matOtsuOut, 0, 255, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);