数字图像处理纸牌识别课程设计Word下载.docx
- 文档编号:17290300
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:23
- 大小:355.09KB
数字图像处理纸牌识别课程设计Word下载.docx
《数字图像处理纸牌识别课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《数字图像处理纸牌识别课程设计Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
CDIBcutmask;
CDIBforcut;
CDIBmasknumber;
CDIBmasktype;
用于存放,处理和显示图片。
制作菜单每个对于图像处理功能,一个按键调用一个处理函数,也可一个按键调用多个处理函数。
菜单及其功能如下图
打开图像的代码为功能为大开所处理图像:
voidCPokeridentifyView:
:
OnOpenimage()
{
//TODO:
Addyourcommandhandlercodehere
staticcharszFilter[]="
BMP文件(*.bmp)|*.bmp||"
;
//定义过滤文件的类型
CFileDialogdlg(TRUE,"
bmp"
NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
//定义文件对话框对象
CStringfilename;
intret=dlg.DoModal();
//运行打开文件对方框
if(ret==IDOK)
{
filename=dlg.GetFileName();
//获取所选择图像的路径
m_dib.LoadFromFile(filename);
//加载图像
if(!
m_dib.m_bLoaded)//判断是否加载图像成功
{
AfxMessageBox("
图像打不开"
);
return;
}
mid_boader.LoadFromFile(filename);
mid_boader.m_bLoaded)//判断是否加载图像成功
boaer_crect.LoadFromFile(filename);
boaer_crect.m_bLoaded)//判断是否加载图像成功
cutmask.LoadFromFile("
TTcut.bmp"
cutmask.m_bLoaded)//判断是否加载图像成功
forcut.LoadFromFile(filename);
forcut.m_bLoaded)//判断是否加载图像成功
masknumber.LoadFromFile("
1.bmp"
masknumber.m_bLoaded)//判断是否加载图像成功masktype
masktype.LoadFromFile("
111.bmp"
masktype.m_bLoaded)//判断是否加载图像成功
}}
打开一图片后为:
中值滤波的代码为:
OnMidiamaskImage()
m_dib.m_bLoaded)
{
AfxMessageBox("
图像还打开,请先打开图像!
"
return;
}
//获取图像宽和高
intnw=m_dib.GetDIBWidth();
intnh=m_dib.GetDIBHeight();
inti,j;
BYTE*ptemp=(BYTE*)newBYTE[nw*nh];
memset(ptemp,0,nw*nh);
doublemid[9];
for(j=3/2;
j<
nh-3/2;
j++)
for(i=3/2;
i<
nw-3/2;
i++)
{doubleresult=0;
intk,h;
for(k=0;
k<
3;
k++)//k行h列
for(h=0;
h<
h++)
{
mid[k*3+h]=m_dib.m_pdata[(j-k)*nw+i-h];
intii,jj,tempmid;
doublesweep;
for(ii=0;
ii<
8;
ii++)
{
tempmid=ii;
for(jj=ii;
jj<
=8;
jj++)
{
if(mid[jj]<
mid[tempmid])tempmid=jj;
}
sweep=mid[ii];
mid[ii]=mid[tempmid];
mid[tempmid]=sweep;
}
result=mid[4];
if(result>
255)result=255;
if(result<
0)result=0;
ptemp[j*nw+i]=result;
memcpy(m_dib.m_pdata,ptemp,nw*nh);
m_dib.UpdateData();
memcpy(mid_boader.m_pdata,ptemp,nw*nh);
mid_boader.UpdateDatadup();
delete[]ptemp;
//刷新屏幕
Invalidate();
调用后结果为:
全局门限的代码中先计算图像的直方图,以一个点(一般去中间值)把直方图分成两份,分别计算两部分的灰度均值,m1与m2,由(m1+m2)/2得到新的阈值与灰度分割点,知道新阈值与旧的阈值相差不到。
用新的阈值进行二值化。
代码为:
OnAllthrImage()
if(!
}//获取图像宽和高
doublep[256];
//存放直方图
intthrold=200,thrnew=210,m1=0,m2=0;
//匹配时用180
for(i=0;
256;
p[i]=0;
for(j=0;
nh;
for(i=0;
nw;
p[m_dib.m_pdata[j*nw+i]]++;
//统计各像素总数
p[i]=p[i]*1.0/(nw*nh);
//直方图归一化
do
throld=thrnew;
=throld;
m1=m1+p[i]*i;
for(i=throld+1;
m2=m2+p[i]*i;
thrnew=(m1+m2)/2;
while(abs(thrnew=throld)<
5);
//对图像的第j行、第i列的象素的灰度信息进行判断,修改
if(m_dib.m_pdata[j*nw+i]>
thrnew)
m_dib.m_pdata[j*nw+i]=255;
else
m_dib.m_pdata[j*nw+i]=0;
//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果
memcpy(mid_boader.m_pdata,m_dib.m_pdata,nw*nh);
mid_boader.UpdateData();
}结果为:
对图像进行边缘检测的代码为:
OnFindborderImage()
doublemask[3][3]={-1,-1,-1,-1,8,-1,-1,-1,-1};
doubleresult=0;
intk,h;
for(k=0;
k++)
for(h=0;
result+=mask[k][h]*m_dib.m_pdata[(j-k)*nw+i-h];
if(result>
if(result<
ptemp[j*nw+i]=result;
m_dib.UpdateData();
memcpy(boaer_crect.m_pdata,ptemp,nw*nh);
boaer_crect.UpdateData();
//刷新屏幕
结果为:
对图片进行测量并平移校正的代码为:
OnAutomoveImage()
intmovedownj,moverighti;
//移动像素距离
inth,k;
inttemp;
intnwmove[7],nhmove[7];
intnwmlength[7]={600,600,600,600,600,600,600},nhmlength[7]={600,600,600,600,600,600,600};
intbnw,bnh;
7;
{nhmove[i]=nh*(i+1)/8;
nwmove[i]=nw*(i+1)/8;
for(k=0;
k++)//寻找水平距离
{for(i=0;
{if(m_dib.m_pdata[nhmove[k]*nw+i]!
=0)
{nhmlength[k]=i;
break;
}
k++)//寻找竖直距离
{for(j=nh;
j>
0;
j--)
{if(m_dib.m_pdata[j*nw+nwmove[k]]!
{nwmlength[k]=nh-j;
6;
i++)//水平测量量nhmlegnth的排列
{k=i;
for(j=i;
{if(nhmlength[j]<
nhmlength[k])k=j;
temp=nhmlength[k];
nhmlength[k]=nhmlength[i];
nhmlength[i]=temp;
bnw=nhmlength[0];
for(i=0;
i++)//竖直测量量nwmlength的排列
{k=i;
for(j=i;
{if(nwmlength[j]<
nwmlength[k])k=j;
temp=nwmlength[k];
nwmlength[k]=nwmlength[i];
nwmlength[i]=temp;
bnh=nwmlength[0];
movedownj=-bnh;
moverighti=-bnw;
j++)//进行平移
{h=j-movedownj;
k=i+moverighti;
if(h>
0&
&
nh&
k>
nw)
ptemp[h*nw+k]=m_dib.m_pdata[j*nw+i];
m_dib.UpdateData();
memcpy(boaer_crect.m_pdata,ptemp,nw*nh);
boaer_crect.UpdateDatadup();
//刷新屏幕
/***********************************/
{h=j-movedownj;
ptemp[h*nw+k]=forcut.m_pdata[j*nw+i];
memcpy(forcut.m_pdata,ptemp,nw*nh);
forcut.UpdateData();
}
OnRecreactImage()
{//TODO:
if(!
m_dib.m_bLoaded)
{AfxMessageBox("
BYTE*ptemp=(BYTE*)newBYTE[nw*nh];
intbnh;
intmoveup=500;
if(m_dib.m_pdata[j*nw+50]==255)
{moveup=j;
break;
bnh=moveup;
movedownj=bnh;
moverighti=0;
for(j=0;
h=j+movedownj;
k=i-moverighti;
ptemp[h*nw+k]=m_dib.m_pdata[j*nw+i];
平移结果为:
截取特权的代码为:
OnCrectGetfeature()
cutmask.m_bLoaded)
{AfxMessageBox("
intnw1=cutmask.GetDIBWidth();
intnh1=cutmask.GetDIBHeight();
for(j=nh-nh1;
{for(i=0;
nw1;
{cutmask.m_pdata[(j-(nh-nh1))*nw1+i]=forcut.m_pdata[j*nw+i];
cutmask.UpdateDatadup();
对特征进行处理并加载模板,进行匹配,并显示匹配结果的代码为:
OnFeatureRecognize()
intnw=cutmask.GetDIBWidth();
intnh=cutmask.GetDIBHeight();
intk,h,t;
/**************************************************************************************/
//特征增强
intthrold=200,thrnew=180,m1=0,m2=0;
{p[cutmask.m_pdata[j*nw+i]]++;
{p[i]=p[i]*1.0/(nw*nh);
{throld=thrnew;
{m1=m1+p[i]*i;
{m2=m2+p[i]*i;
{//对图像的第j行、第i列的象素的灰度信息进行判断,修改
if(cutmask.m_pdata[j*nw+i]>
ptemp[j*nw+i]=255;
ptemp[j*nw+i]=0;
memcpy(cutmask.m_pdata,ptemp,nw*nh);
cutmask.UpdateData();
//识别
intcardnumber;
floatnuberthr=0.9;
floattypethr=0.92;
CStringfilename;
/******************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 纸牌 识别 课程设计