参考:
otsu (大津算法):http://baike.baidu.com/link?url=mvcFw6K8H3ko-un4dibuDifmdU9u_skxLryut9OrHs_5V2GdIPVF5jssQe1msMhwTX78guD3P7ufhrNt4gSytq
#########################################################################
最近在做字符识别,看了很多资料,发现在对图像进行预处理过程中,对图像进行二值化是一个必不可少的方式。如何才能有效的将目标字符表现出来,OpenCV提供的阈值化方法有threshold和adaptiveThreshold,但这需要自己进行参数调整。在同学那里了解到一个很有效的方法,就是大津法(OTSU)。
OTSU算法就是一种对于图像进行二值化的高效算法。它是基于最大类间方法法原理。
百度百科上有较详细的讲解,有兴趣的可以查看一下。
我在使用过程中发现效果确实不错,能够有效的区分出前景和背景
##########################################################################
实验:使用以下照片,解析出字符
注:该图像由网上获取
C++:
- #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:
-
-
-
-
-
-
-
- __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语言:
- #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