扬大电科多媒体课程设计.docx
《扬大电科多媒体课程设计.docx》由会员分享,可在线阅读,更多相关《扬大电科多媒体课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
扬大电科多媒体课程设计
《多媒体信息处理》
课
程
设
计
班级:
电科1002
姓名:
张贤慈
学号:
4
日期:
2013年5月19日
1.完成情况(8位或24位bmp图)
①.个人信息(姓名,学号)、
②.反色变换
③.调节图像亮度(加大,减小亮度)
④.调节图像对比度(加大,减小对比度)
⑤.提取彩色图像的RGB分量(红,绿,蓝)
⑥.镜像操作(左右,上下)
⑦.γ校正(显示对话框)
⑧.图像逆时针旋转90°(仅限正方形图)
⑩.图像还原功能
2.程序清单及部分注释:
自加宏定义等:
#include"math.h"//自加头文件
#defineHui(x,y)*(m_pDIBData+(x)*GetBmpRealWidth()+y)//指向灰度图色彩矩阵
intY[1500][1500][3];//定义数组
intA[1500][1500][3];
floatvalue;
按键响应:
(举一例)
voidCPicture224View:
:
OnFanse()//反色变换的按键程序
{//TODO:
Addyourcommandhandlercodehere
if(m_dib.m_pBMI==NULL||m_dib.m_pDIBData==NULL)
{AfxMessageBox("没有图像资源");
return;
}
if(m_dib.FANSE())
Invalidate(TRUE);//按键有效则转至反色变换处理程序
}
1.个人信息;
使用AfxMessageBox()函数:
voidCPicture224View:
:
Onmymessage()//个人信息的按键程序
{
//TODO:
Addyourcommandhandlercodehere
AfxMessageBox("电科10\n4\n张贤慈");//弹出该信息窗口
return;
}
2.反色:
BOOLDIB:
:
FanSe()//反色变换处理程序
{
inti,j,R,G,B;//定义变量
if(bih.biBitCount==24)//判断是不是24位彩图
{
for(i=0;ifor(j=0;j{
R=int(255-Cnumber(i,j,2));//将各个颜色分量取反赋值
G=int(255-Cnumber(i,j,1));
B=int(255-Cnumber(i,j,0));
Cnumber(i,j,2)=(BYTE)R;//把所求反色量存回个点
Cnumber(i,j,1)=(BYTE)G;
Cnumber(i,j,0)=(BYTE)B;
}
}
elseif(bih.biBitCount==8)//判断是不是8位图
{
for(i=0;ifor(j=0;j{
R=int(255-Hui(i,j));//取数据并进行反色
Hui(i,j)=(BYTE)R;//把反色量赋回该点
}
}
else
{
AfxMessageBox("原图既不是24位真彩图也不是8位灰度图");//弹出此窗
returnfalse;
}
returntrue;//返回true
}
3.调节图像亮度:
①.加大图像亮度
BOOLDIB:
:
zengdaliangdu()////增加亮度处理程序
{
inti,j,k;
doublet=0;
if(bih.biBitCount==24)//判断24位真彩图
for(i=0;i{
for(j=0;jfor(k=0;k<3;k++)
{
t=1.1*Cnumber(i,j,k);//颜色分量增加10%
if(t<255)
Cnumber(i,j,k)=(unsignedchar)t;//若增加后的值小于255,则赋回给颜色分量
else
Cnumber(i,j,k)=255;//若大于255,则全赋为255
}
}
else//如果8位灰度图
for(i=0;i{
for(j=0;j{
t=1.1*Hui(i,j);//颜色分量增加10%
if(t<255)
Hui(i,j)=(unsignedchar)t;//若增加后的值小于255,则赋回给灰度分量
else
Hui(i,j)=255;//若大于255,则全赋为255
}
}
returntrue;
}
②.减小图像亮度:
BOOLDIB:
:
jianxiao()
{
inti,j,k;
doublet=0;
if(bih.biBitCount==24)//判断24位真彩图
for(i=0;i{
for(j=0;jfor(k=0;k<3;k++)
{
t=0.9*Cnumber(i,j,k);//颜色分量减小10%
Cnumber(i,j,k)=(unsignedchar)t;//将改变后的值赋回颜色分量
}
}
else//如果8位灰度图
for(i=0;i{
for(j=0;j{
t=0.9*Hdu(i,j);//颜色分量减小10%
Hdu(i,j)=(unsignedchar)t;//将改变后的值赋回灰度分量
}
}
returntrue;
}
4.调节图像对比度:
①.增大对比度:
BOOLDIB:
:
zengda()//增加对比度处理程序
{
inti,j,Y,Cb,Cr,R,G,B,t;//定义Y,t分别为亮度和平均亮度
longintX=0;
if(bih.biBitCount==8)//灰度图
{
for(i=0;i{for(j=0;j{
Y=int(Hui(i,j));//亮度值
X=X+Y;//求图像的总亮度
}
}
t=int(X/(i*j));//图像平均亮度
for(i=0;ifor(j=0;j{Y=int(Hui(i,j));//取亮度值
if(Y>t)Y=Y+10;//若大于平均亮度,则亮度增加;否则亮度减小
elseY=Y-10;
if(Y<0){Y=0;}//判断Y值是否超出范围
if(Y>255){Y=255;}
Hui(i,j)=(BYTE)Y;//保存改变后的亮度
}
}
elseif(bih.biBitCount==24)//彩色图
{
for(i=0;i{for(j=0;j{
Y=int(0.2999f*Cnumber(i,j,2)+0.587f*Cnumber(i,j,1)+0.114f*Cnumber(i,j,0));//亮度计算公式
X=X+Y;//计算总量度
}
}
t=int(X/(i*j));//计算24位图像亮度平均值也是比较阀值
for(i=0;ifor(j=0;jY=int(0.2999f*Cnumber(i,j,2)+0.587f*Cnumber(i,j,1)+0.114f*Cnumber(i,j,0));//亮度计算公式
Cb=int(-0.169f*Cnumber(i,j,2)-0.331f*Cnumber(i,j,1)+0.5f*Cnumber(i,j,0));
Cr=int(0.5f*Cnumber(i,j,2)-0.419f*Cnumber(i,j,1)-0.081f*Cnumber(i,j,0));//先变到YCbCr空间,只对亮度Y进行操作
if(Y>t)Y=Y+10;
elseY=Y-10;//是否大于阀值,若大于,则亮度增加;否则亮度减小
if(Y<0){Y=0;}
if(Y>255){Y=255;}//判断Y值是否超出范围
R=int(Y+1.403f*Cr);
G=int(Y-0.344f*Cb-0.714f*Cr);
B=int(Y+1.773*Cb);//再变回RGB空间
if(R<0){R=0;}
if(R>255){R=255;}
if(G<0){G=0;}
if(G>255){G=255;}
if(B<0){B=0;}
if(B>255){B=255;}//判断R,G,B是否超出范围并进行取舍
Cnumber(i,j,2)=(BYTE)R;
Cnumber(i,j,1)=(BYTE)G;
Cnumber(i,j,0)=(BYTE)B;//保存改变后的RGB
}
}
else
{
AfxMessageBox("原图既不是24位真彩图也不是8位灰度图");
returnfalse;
}
returntrue;
}
②.减小对比度:
(与增加对比度类似)
BOOLDIB:
:
tiaoxiao()
{
inti,j,Y,Cb,Cr,R,G,B,t;
longintX=0;
if(bih.biBitCount==8)
{
for(i=0;i{for(j=0;j{
Y=int(Hui(i,j));
X=X+Y;
}
}
t=int(X/(i*j));
for(i=0;ifor(j=0;j{Y=int(Hui(i,j));
if(Y>127)Y=Y-10;//判断是否大于平均亮度,若大于,则亮度减小;否则亮度增加
elseY=Y+10;
if(Y<0){Y=0;}
if(Y>255){Y=255;}
Hui(i,j)=(BYTE)Y;//把改变后亮度存回
}
}
elseif(bih.biBitCount==24)
{
for(i=0;i{for(j=0;j{
Y=int(0.2999f*Cnumber(i,j,2)+0.587f*Cnumber(i,j,1)+0.114f*Cnumber(i,j,0));
X=X+Y;
}
}
t=int(X/(i*j));//24位图像亮度平均值
for(i=0;ifor(j=0;j{
Y=int(0.2999f*Cnumber(i,j,2)+0.587f*Cnumber(i,j,1)+0.114f*Cnumber(i,j,0));//先变到YCbCr空间,只对亮度Y进行操作
Cb=int(-0.169f*Cnumber(i,j,2)-0.331f*Cnumber(i,j,1)+0.5f*Cnumber(i,j,0));
Cr=int(0.5f*Cnumber(i,j,2)-0.419f*Cnumber(i,j,1)-0.081f*Cnumber(i,j,0));
if(Y>t)Y=Y-10;
elseY=Y+10;
if(Y<0){Y=0;}
if(Y>255){Y=255;}
R=int(Y+1.403f*Cr);
G=int(Y-0.344f*Cb-0.714f*Cr);
B=int(Y+1.773*Cb);//再变回RGB空间
if(R<0){R=0;}
if(R>255){R=255;}
if(G<0){G=0;}
if(G>255){G=255;}
if(B<0){B=0;}
if(B>255){B=255;}
Cnumber(i,j,2)=(BYTE)R;
Cnumber(i,j,1)=(BYTE)G;
Cnumber(i,j,0)=(BYTE)B;//保存改变后的RGB
}
}
else
{
AfxMessageBox("原图既不是24位真彩图也不是8位灰度图");
returnfalse;
}
returntrue;
}
5.提取彩色图像RGB分量:
①.红:
BOOLDIB:
:
hong()//提取红色分量处理程序
{
inti,j;
if(bih.biBitCount!
=24)//判断是不是24位彩色图
{
AfxMessageBox("原图不是24位真彩图");
returnfalse;
}
for(i=0;ifor(j=0;j{
Cnumber(i,j,0)=0;//提取绿色分量和蓝色分量
Cnumber(i,j,1)=0;
}
returntrue;
}
②.绿:
BOOLDIB:
:
lv()//提取绿色分量处理程序
{
inti,j;
if(bih.biBitCount!
=24)//判断是不是24位彩色图
{
AfxMessageBox("原图不是24位真彩图");
returnfalse;
}
for(i=0;ifor(j=0;j{
Cnumber(i,j,0)=0;//提取蓝色分量和红色分量
Cnumber(i,j,2)=0;
}
returntrue;
}
③.蓝:
BOOLDIB:
:
lan()//提取绿色分量处理程序
{
inti,j;
if(bih.biBitCount!
=24)//判断是不是24位彩色图
{
AfxMessageBox("原图不是24位真彩图");
returnfalse;
}
for(i=0;ifor(j=0;j{
Cnumber(i,j,1)=0;//提取绿色分量和红色分量
Cnumber(i,j,2)=0;
}
returntrue;
}
6.图像的镜像操作:
①.水平镜像:
BOOLDIB:
:
shuipingmiror()//水平镜像
{
inti,j,k;
inttemp[4];
if(bih.biBitCount==8)//判断是否是8位灰度图
{
for(i=0;ifor(j=0;j{
temp[0]=int(Hui(i,j));
Hui(i,j)=Hui(i,GetDIBWidth()-1-j);
Hui(i,GetDIBWidth()-1-j)=(BYTE)temp[0];
}
}
else//24位真彩图
{
for(i=0;ifor(j=0;j{
for(k=0;k<3;k++)
{
temp[k]=int(Cnumber(i,j,k));//将第i行,j列的第k个颜色分量进行保存Cnumber(i,j,k)=Cnumber(i,GetDIBWidth()-1-j,k);//将第i行,j列的第k个颜色分量进行保存
Cnumber(i,GetDIBWidth()-1-j,k)=(BYTE)temp[k];/从保存的数组中提取右半部分的颜色分量赋值
}
}
}
returntrue;
}
②.垂直镜像:
BOOLDIB:
:
chuizhimiror()//垂直镜像
{
inti,j,k;
inttemp[4];
if(bih.biBitCount==8)//判断是否是8位灰度图
{
for(i=0;ifor(j=0;j{
temp[0]=int(Hui(j,i));
Hui(j,i)=Hui(GetDIBHeight()-1-j,i);
Hui(GetDIBHeight()-1-j,i)=(BYTE)temp[0];
}
}
else
{
for(i=0;ifor(j=0;j{
for(k=0;k<3;k++)
{temp[k]=int(Cnumber(j,i,k));//将第i行,j列的第k个颜色分量进行保存
Cnumber(j,i,k)=Cnumber(GetDIBHeight()-1-j,i,k);//将上半部分的颜色分量赋给与之对应的下半部分的点
Cnumber(GetDIBHeight()-1-j,i,k)=(BYTE)temp[k];//从保存的数组中提取上半部分的颜色分量赋值
}
}
}
returntrue;
}
7.图像的γ校正:
BOOLDIB:
:
JiaoZh()//γ矫正
{
mydialogdlg;//定义类型为mydialog的变量
dlg.m_value=NULL;
if(dlg.DoModal()!
=IDOK)
{
returnfalse;
}
value=dlg.m_value;//把mydialog类中的m_value赋给DIB类中变量value
deletedlg;//释放dlg
inti,j,Y,Cb,Cr;
if(bih.biBitCount==8)//判断灰度图
{
for(i=0;ifor(j=0;j{
Y=int(255*pow(Hui(i,j)/255.0,value));//对亮度进行校正
Hui(i,j)=(BYTE)Y;//把校正后的亮度赋回
}
}
elseif(bih.biBitCount==24)//24位彩色图
{
for(i=0;ifor(j=0;j{
Y=int(255*pow(Cnumber(i,j,2)/255.0,value));//校正三个颜色分量
Cb=int(255*pow(Cnumber(i,j,1)/255.0,value));
Cr=int(255*pow(Cnumber(i,j,0)/255.0,value));
Cnumber(i,j,2)=(BYTE)Y;//保存校正后的三个颜色分量
Cnumber(i,j,1)=(BYTE)Cb;
Cnumber(i,j,0)=(BYTE)Cr;
}
}
else
{
AfxMessageBox("原图既不是24位真彩图也不是8位灰度图");
returnfalse;
}
returntrue;
}
8.图像逆时针旋转90°
BOOLDIB:
:
XuanZ()//旋转90度(正方形)
{
inti,j,B;
B=GetDIBHeight()-1;
if(bih.biBitCount==8)//8位灰度图
{
for(i=0;ifor(j=0;j{
Y[i][j][0]=int(Hui(i,j));//取出位图数据保存Y数组
}
for(i=0;ifor(j=0;j{
(Hui(i,j))=(BYTE)Y[B-j][i][0];//把取出的位图数据按照旋转的对应关系存回灰度
}
}
elseif(bih.biBitCount==24)//24位灰度图
{
for(i=0;ifor(j=0;j{
Y[i][j][2]=int(Cnumber(i,j,2));
Y[i][j][1]=int(Cnumber(i,j,1));
Y[i][j][0]=int(Cnumber(i,j,0));//取出位图数据保存Y数组
}
for(i=0;ifor(j=0;j{
Cnumber(i,j,2)=(BYTE)Y[B-j][i][2];
Cnumber(i,j,1)=(BYTE)Y[B-j][i][1];
Cnumber(i,j,0)=(BYTE)Y[B-j][i][0];//把取出的位