資源簡介
基于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
評論
共有 條評論