我使用的是一个固定的门槛,但事实证明这对我来说并不是那么好。然后,有人告诉我关于otsu门槛的事。如何在我的代码中使用它? 我读到了它,我不太了解。有人可以向我解释如何在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);
是吗? 我不太了解,因此,我不知道如何适应我的代码。
答案 0 :(得分:69)
以下行进行otsu阈值操作:
cv::threshold(im_gray, img_bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
im_gray
是源8位图像,img_bw
是结果,CV_THRESH_BINARY | CV_THRESH_OTSU
是执行Otsu阈值处理所必需的标志。因为事实上我们想要执行二进制阈值处理,所以我们使用CV_THRESH_BINARY
(你可以使用opencv提供的5个标志中的任何一个)和CV_THRESH_OTSU
文档链接:http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#threshold
答案 1 :(得分:5)
在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()
答案 2 :(得分:0)
在Android中是一行。
Imgproc.threshold(matGrayIn, matOtsuOut, 0, 255, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY);