扬大电科多媒体课程设计.docx
- 文档编号:11582739
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:20
- 大小:46.34KB
扬大电科多媒体课程设计.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;i for(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;i for(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;j for(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;j for(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;i for(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;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));//亮度计算公式 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;i for(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;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));//先变到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;i for(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;i for(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;i for(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;i for(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;i for(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;i for(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;i for(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;i for(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;i for(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;i for(j=0;j { Y[i][j][0]=int(Hui(i,j));//取出位图数据保存Y数组 } for(i=0;i for(j=0;j { (Hui(i,j))=(BYTE)Y[B-j][i][0];//把取出的位图数据按照旋转的对应关系存回灰度 } } elseif(bih.biBitCount==24)//24位灰度图 { for(i=0;i for(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;i for(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];//把取出的位
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 扬大电科 多媒体 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)