资源简介
基于Opencv实现的图像纠偏算法,使用的是边缘检测。先进行图像二值化,在进行黑边裁剪,最后进行纠偏旋转
代码利用改进hough变换实现图像旋转纠偏
代码片段和文件信息
//注:坐标按(第x行,第y列)考虑
//所做处理即为填充颜色
//aveGray为填充颜色的灰度值,即图片背景灰度值
#include “cvBillPreprocess.h“
IplImage* cvEdgeRemoveED(IplImage* src) //采用腐蚀膨胀算法实现黑边去除
{
IplImage* pic = cvCloneImage(src);
IplImage* dst = cvCloneImage(src);
int i=0j=0;
int al=0;
int cc=0;
//用图像中间区域的平均灰度值作为阈值对图像进行二值化
for (i=pic->height/4;iheight*3/4;i++)
{
for (j=pic->widthStep/4;jwidthStep*3/4;j++)
{
cc++;
al = al + (int)((uchar*)(pic->imageData+pic->widthStep*i))[j];
}
}
int ave = al/cc;
int th=ave-20;
cvThreshold(picpicth255CV_THRESH_BINARY);
//先膨胀后腐蚀处理图片
cvDilate(picpicNULL10);
cvErode(picpicNULL10);
//对黑色区域进行处理
division(picdstave);
//cvSmooth(dstdst);
cvReleaseImage(&pic);
return dst;
}
IplImage* cvDeleteLines(IplImage* src) //除去图片中的线条
{
IplImage* pic=cvCloneImage(src);
IplImage* dst = NULL;
if (pic->depth!=8)
{
printf_s(“只处理灰度图片!\n“);
exit(-1);
}
dst = cvCloneImage(pic);
int i=0j=0width=pic->widthheight = pic->heightave = 0;
int xsize=0ysize=0size=95count=0;
double al=0rr=0gg=0bb=0;
int cc=0th=0;
//以平均灰度值为自适应阈值对图像进行二值化处理
for (i=0;iheight;i++)
{
for (j=0;jwidth;j++)
{
cc++;
al = al + (double)((uchar*)(pic->imageData+pic->widthStep*i))[j];
}
}
ave = (int)(al/cc);
th=ave-10;
cvThreshold(picpicth255CV_THRESH_BINARY);
//先处理水平线
xsize = 1;ysize = size;count=0;
for (i=0;i {
for (j=4;j {
if(getGValue(picij)<150) //对黑点处理
{
if(count>size/2){ //之前已经有了很多黑点
if (getScale(picijxsizeysize/2+10.95)) //之后也有很多黑边点,说明这些点应该为一条直线上的点
{
//将之前所有的点都进行处理,并稍稍扩张线条长度
go2Head(dstcountijave);
getHead(picdstij-countave);
go2End(dstysize/2ijave);
j = getEnd(picdstij+ysize/2ave); //之后所有的黑点全部涂白
}
count=0; //接下来的点必然是白点
}
else //之前的黑点还不够多,没有用模板检查的必要
{
count++;
}
}
else //不是黑点
{
if (count!=0) //该白点之前有黑点
{
if (getScale(picij-4190.6)) //判断该白点是不是线条上的断点
{
count++; //如果是,则继续搜索下一个黑点
}
else count = 0; //不是断点则是白色区域的开始,说明刚才的线条太短,重新开始计数以检测下一条直线
}
}
}
count=0;
}
//列操作与行操作完全对称
xsize = size;ysize = 1;count=0;
for (j=0;j {
for (i=4;i {
if(getGValue(picij)<150)
{
if(count>size/2)
{
if (getScale(picijxsize/2+1ysize0.95))
{
go2UpHead(dstcountijave);
getUpHead(picdsti-countjave);
go2LowEnd(dstxsize/2ijave);
i = getLowEnd(picdsti+xsize/2jave);
}
count = 0;
}
else
{
count++;
}
}
else
{
if (count!=0)
{
if (getScale(pici-4j910.6))
{
count++;
}
else count=0;
}
}
}
count=0;
}
cvReleaseImage(&pic);
return dst;
}
IplImage* cvEdgeRemove(IplImage* src)
{
IplImage* pic = cvClon
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 16227 2010-07-20 15:19 改进Hough变换实现图像纠偏\cvBillPreprocess.cpp
文件 1988 2010-07-20 15:19 改进Hough变换实现图像纠偏\cvBillPreprocess.h
文件 215 2010-07-21 09:36 改进Hough变换实现图像纠偏\stdafx.cpp
文件 233 2010-07-21 09:36 改进Hough变换实现图像纠偏\stdafx.h
文件 502991 2010-07-09 09:07 改进Hough变换实现图像纠偏\用改进的Hough变换检测交通标志图像的直线特征.pdf
目录 0 2011-05-14 09:27 改进Hough变换实现图像纠偏
----------- --------- ---------- ----- ----
521654 6
评论
共有 条评论