参考:
#########################################################################
最近在做字符识别,看了很多资料,发现在对图像进行预处理过程中,对图像进行二值化是一个必不可少的方式。如何才能有效的将目标字符表现出来,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:
#!/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语言:
#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;
}