查看OpenCV文档cvThreshold(),在二值化函数cvThreshold(const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type)中,参数threshold_type有5种类型:
-
THRESH_BINARY
-
THRESH_BINARY_INV
-
THRESH_TRUNC
-
THRESH_TOZERO
-
THRESH_TOZERO_INV
问题来了:为什么可以在threshold_type参数中使用CV_THRESH_OTSU,在哪里可以查看这种OTSU,它用的什么方法?经多次验证,二值化的效果很好,且速度很快。
已经有一些同志在使用:
例证1:例证1
例证2:例证2
例证3:例证3
我的遭遇:为了二值化一个比较大的图像(10M,3840*2748),痛苦的看了各种论文,尝试了各种的二值化方法:一维OTSU,快速迭代的一维OTSU,二维的OTSU,快速迭代的二维OTSU。但现实的残酷的!只有二维的OTSU和快速迭代的OTSU可用,但前者处理时间让人难以接受,后者也要500多个ms。 快速迭代的二维OTSU算法是根据吴一全老师的《二维最大类间方差阈值分割的快速迭代算法》(论文下载链接,提取码:fd0b)来实现的。但是令我哭笑不得的是,无意中在网上发现了一种方法threshold_type使用参数使用CV_THRESH_OTSU时,时间却大大的缩短。程序如下(
程序下载链接提取码:fd0b),图像下载 (提取码:24f3)。
/* otsu_2d:二维最大类间方差阈值分割的快速迭代算法 吴一全 */ #include <iostream> #include <cv.h> #include <highgui.h> using namespace std; double TwoDimentionOtsu(IplImage *image); int main() { IplImage* srcImage = cvLoadImage(