前言
在使用caffe训练好的模型测试手写字符图片的时候,发现测试集图片和训练集图片在样式上不太一致,导致测试准确率很低。所以在测试之前需要对图片预处理使其规整。
基本思路
读入一幅图片-》将其转换为灰度图-》将其进行自适应二值化-》将图片进行黑白反转,以保持与训练集一致-》查找图片中的最大连通域-》在原图上框出最大连通域的外接矩形-》取出感兴趣的字符区域-》采用三种方式将取出的字符区域图片变换成原来的大小。
代码实现
运行环境:vs2010+opencv2.4.10
采用的主要函数汇总:
cvtColor();颜色空间转换;
adaptiveThreshold();自适应二值化
findContours();提取轮廓
contourArea();计算轮廓面积
boundingRect();计算轮廓的垂直边界最小矩形
rectangle();画矩形
resize();图像缩放
具体代码如下:
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
Mat img=imread("1.png");
//判断图片是否正确读入
if(img.empty())
{
std::cout<<"read error!"<<std::endl;
return -1;
}
namedWindow("原图");
imshow("原图", img);
//将彩色图转换成灰度图
Mat sample;
cvtColor(img, sample, COLOR_BGR2GRAY);
//将图片进行自适应二值化
int threshold_type=CV_THRESH_BINARY;
int adaptive_method=CV_ADAPTIVE_THRESH_GAUSSIAN_C;
int blocksize=31;
double offset=15;
Ma