参考:
otsu (大津算法):http://baike.baidu.com/link?url=mvcFw6K8H3ko-un4dibuDifmdU9u_skxLryut9OrHs_5V2GdIPVF5jssQe1msMhwTX78guD3P7ufhrNt4gSytq
#########################################################################
最近在做字符识别,看了很多资料,发现在对图像进行预处理过程中,对图像进行二值化是一个必不可少的方式。如何才能有效的将目标字符表现出来,OpenCV提供的阈值化方法有threshold和adaptiveThreshold,但这需要自己进行参数调整。在同学那里了解到一个很有效的方法,就是大津法(OTSU)。
OTSU算法就是一种对于图像进行二值化的高效算法。它是基于最大类间方法法原理。
百度百科上有较详细的讲解,有兴趣的可以查看一下。
我在使用过程中发现效果确实不错,能够有效的区分出前景和背景
##########################################################################
实验:使用以下照片,解析出字符
注:该图像由网上获取
C++:
[cpp] view plain copy #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat img = imread(argv[1], -1); if (img.empty()) { cout <<"Error: Could not load image" <<endl; return 0; } Mat gray; cvtColor(img, gray, CV_BGR2GRAY); Mat dst; threshold(gray, dst, 0, 255, CV_THRESH_OTSU); imshow("src", img); imshow("gray", gray); imshow("dst", dst); waitKey(0); return 0; }
Python:
[python] view plain copy #!/usr/bin/env python #-*- coding: utf-8 -*- """ 实现大津法 """ __author__ = 'zj' import cv2 import os import time if __name__ == '__main__': img = cv2.imread("te.png", -1) if img == None: print "Error: Could not load image" os._exit(0) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) time0 = time.time() retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) time1 = time.time() total = (time1 - time0) print "otsu need time: %.3f s"%total cv2.imshow("src", img) cv2.imshow("gray", gray) cv2.imshow("dst", dst) cv2.waitKey(0)
有人写了一个Python模块Mahotas,同样可以实现OTSU算法
mahotas介绍:
http://www.open-open.com/news/view/6c916f
http://www.oschina.NET/p/mahotas/
C语言:
[cpp] view plain copy #include <cv.h> #include <highgui.h> #include <stdio.h> int main(int argc, char* argv[]) { IplImage *img = cvLoadImage("te.png", -1); if (img == NULL) { printf("Error: Could not load image\n"); return 0; } IplImage *gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); cvCvtColor(img, gray, CV_BGR2GRAY); IplImage *dst = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); cvThreshold(gray, dst, 0, 255, CV_THRESH_OTSU); cvNamedWindow("src"); cvNamedWindow("gray"); cvNamedWindow("dst"); cvShowImage("src", img); cvShowImage("gray", gray); cvShowImage("dst", dst); cvWaitKey(0); return 0; }
另参:http://blog.csdn.net/augusdi/article/details/9012043