扬大电科多媒体课程设计.doc

上传人:scccc 文档编号:12465280 上传时间:2021-12-04 格式:DOC 页数:19 大小:234KB
返回 下载 相关 举报
扬大电科多媒体课程设计.doc_第1页
第1页 / 共19页
扬大电科多媒体课程设计.doc_第2页
第2页 / 共19页
扬大电科多媒体课程设计.doc_第3页
第3页 / 共19页
扬大电科多媒体课程设计.doc_第4页
第4页 / 共19页
扬大电科多媒体课程设计.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《扬大电科多媒体课程设计.doc》由会员分享,可在线阅读,更多相关《扬大电科多媒体课程设计.doc(19页珍藏版)》请在三一文库上搜索。

1、 多媒体信息处理 课 程 设 计 班级 :电科1002 姓名 :张贤慈 学号 :100703224 日期 :2013年5月19日19 / 19文档可自由编辑打印1. 完成情况(8位或24位bmp图).个人信息(姓名,学号)、.反色变换.调节图像亮度(加大,减小亮度).调节图像对比度(加大,减小对比度).提取彩色图像的RGB分量(红,绿,蓝).镜像操作(左右,上下).校正(显示对话框).图像逆时针旋转90°(仅限正方形图).图像还原功能2 程序清单及部分注释:自加宏定义等: #include "math.h" /自加头文件 #define Hui(x,y) *(m_

2、pDIBData+(x)*GetBmpRealWidth()+y) /指向灰度图色彩矩阵 int Y150015003; /定义数组 int A150015003; float value;按键响应:(举一例)void CPicture224View:OnFanse() /反色变换的按键程序/ TODO: Add your command handler code here if(m_dib.m_pBMI=NULL|m_dib.m_pDIBData=NULL)AfxMessageBox("没有图像资源"); return; if(m_dib.FANSE() Invalida

3、te(TRUE); /按键有效则转至反色变换处理程序1. 个人信息; 使用AfxMessageBox()函数:void CPicture224View:Onmymessage() /个人信息的按键程序/ TODO: Add your command handler code hereAfxMessageBox("电科10n100703224n张贤慈");/弹出该信息窗口return;2.反色: BOOL DIB:FanSe()/反色变换处理程序 int i,j,R,G,B;/定义变量if(bih.biBitCount=24)/判断是不是24位彩图for(i=0;i<G

4、etDIBHeight();i+)for(j=0;j<GetDIBWidth();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;else if(bih.biBitCount=8)/判断是不是8位图for(i=0;i<GetDIBHeight();i+)for(j=0;j<Ge

5、tDIBWidth();j+) R=int(255-Hui(i,j);/取数据并进行反色 Hui(i,j)=(BYTE)R;/把反色量赋回该点else AfxMessageBox("原图既不是24位真彩图也不是8位灰度图"); /弹出此窗 return false;return true;/返回true 3. 调节图像亮度: .加大图像亮度 BOOL DIB:zengdaliangdu()/增加亮度处理程序 int i,j,k;double t=0; if(bih.biBitCount=24)/判断24位真彩图 for(i=0;i<GetDIBHeight();i+)

6、 for(j=0;j<GetDIBWidth();j+) for(k=0;k<3;k+) t=1.1*Cnumber(i,j,k);/颜色分量增加10% if(t<255) Cnumber(i,j,k)=(unsigned char)t; /若增加后的值小于255,则赋回给颜色分量 else Cnumber(i,j,k)=255;/若大于255,则全赋为255 else/如果8位灰度图 for(i=0;i<GetDIBHeight();i+) for(j=0;j<GetDIBWidth();j+) t=1.1*Hui(i,j);/颜色分量增加10% if(t<

7、;255) Hui(i,j)=(unsigned char)t;/若增加后的值小于255,则赋回给灰度分量 else Hui(i,j)=255;/若大于255,则全赋为255 return true; .减小图像亮度: BOOL DIB:jianxiao() int i,j,k;double t=0; if(bih.biBitCount=24)/判断24位真彩图 for(i=0;i<GetDIBHeight();i+) for(j=0;j<GetDIBWidth();j+) for(k=0;k<3;k+) t=0.9*Cnumber(i,j,k);/颜色分量减小10% Cnu

8、mber(i,j,k)=(unsigned char)t; /将改变后的值赋回颜色分量 else/如果8位灰度图 for(i=0;i<GetDIBHeight();i+) for(j=0;j<GetDIBWidth();j+) t=0.9*Hdu(i,j);/颜色分量减小10% Hdu(i,j)=(unsigned char)t;/将改变后的值赋回灰度分量 return true; 4. 调节图像对比度: .增大对比度: BOOL DIB:zengda()/增加对比度处理程序 int i,j,Y,Cb,Cr,R,G,B,t; /定义Y,t分别为亮度和平均亮度long int X=0

9、;if(bih.biBitCount=8)/灰度图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+)Y=int(Hui(i,j);/亮度值X=X+Y;/求图像的总亮度 t=int(X/(i*j);/图像平均亮度for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+) Y=int(Hui(i,j);/取亮度值 if(Y>t)Y=Y+10;/若大于平均亮度,则亮度增加;否则亮度减小 else Y=Y-10; if(Y<0)Y=0;/判断Y值是否超出范

10、围 if(Y>255)Y=255; Hui(i,j)=(BYTE)Y;/保存改变后的亮度else if(bih.biBitCount=24)/彩色图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();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<GetDIBHeight();i+)for(

11、j=0;j<GetDIBWidth();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;else Y=Y-10;

12、/是否大于阀值,若大于,则亮度增加;否则亮度减小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,

13、j,1)=(BYTE)G; Cnumber(i,j,0)=(BYTE)B;/保存改变后的RGBelseAfxMessageBox("原图既不是24位真彩图也不是8位灰度图"); return false;return true; .减小对比度:(与增加对比度类似) BOOL DIB:tiaoxiao() int i,j,Y,Cb,Cr,R,G,B,t;long int X=0;if(bih.biBitCount=8)for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+)Y=int(Hui(i,j);X=X+

14、Y; t=int(X/(i*j);for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+) Y=int(Hui(i,j); if(Y>127)Y=Y-10;/判断是否大于平均亮度,若大于,则亮度减小;否则亮度增加 else Y=Y+10; if(Y<0)Y=0; if(Y>255)Y=255; Hui(i,j)=(BYTE)Y;/把改变后亮度存回else if(bih.biBitCount=24)for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();

15、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<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();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

16、*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;else Y=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&g

17、t;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;/保存改变后的RGBelseAfxMessageBox("原图既不是24位真彩图也不是8位灰度图"); return false;return true;5. 提取彩色图像RGB分量: .红: BOOL DIB:hong()/提取红色分量处理程序 int i,j; if(bih.biBitCount!=24)/判断是不是24位彩色图 Afx

18、MessageBox("原图不是24位真彩图"); return false; for(i=0;i<GetDIBHeight();i+) for(j=0;j<GetDIBWidth();j+) Cnumber(i,j,0)=0; /提取绿色分量和蓝色分量 Cnumber(i,j,1)=0; return true; .绿: BOOL DIB:lv()/提取绿色分量处理程序 int i,j; if(bih.biBitCount!=24)/判断是不是24位彩色图 AfxMessageBox("原图不是24位真彩图"); return false;

19、 for(i=0;i<GetDIBHeight();i+) for(j=0;j<GetDIBWidth();j+) Cnumber(i,j,0)=0;/提取蓝色分量和红色分量 Cnumber(i,j,2)=0; return true; .蓝: BOOL DIB:lan()/提取绿色分量处理程序 int i,j; if(bih.biBitCount!=24)/判断是不是24位彩色图 AfxMessageBox("原图不是24位真彩图"); return false; for(i=0;i<GetDIBHeight();i+) for(j=0;j<Get

20、DIBWidth();j+) Cnumber(i,j,1)=0; /提取绿色分量和红色分量 Cnumber(i,j,2)=0; return true; 6. 图像的镜像操作: .水平镜像: BOOL DIB:shuipingmiror()/水平镜像 int i,j,k;int temp4;if(bih.biBitCount=8)/判断是否是8位灰度图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth()/2;j+) temp0=int(Hui(i,j);Hui(i,j)=Hui(i,GetDIBWidth()-1-j); Hui(i

21、,GetDIBWidth()-1-j)=(BYTE)temp0;else /24位真彩图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth()/2;j+) for(k=0;k<3;k+)tempk=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)tempk;/从保存的数组中提取右半部分的颜色分

22、量赋值 return true; .垂直镜像: BOOL DIB:chuizhimiror()/垂直镜像 int i,j,k;int temp4;if(bih.biBitCount=8)/判断是否是8位灰度图for(i=0;i<GetDIBWidth();i+)for(j=0;j<GetDIBHeight()/2;j+) temp0=int(Hui(j,i);Hui(j,i)=Hui(GetDIBHeight()-1-j,i); Hui(GetDIBHeight()-1-j,i)=(BYTE)temp0;else for(i=0;i<GetDIBWidth();i+)for(

23、j=0;j<GetDIBHeight()/2;j+) for(k=0;k<3;k+)tempk=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)tempk;/从保存的数组中提取上半部分的颜色分量赋值 return true; 7. 图像的校正: BOOL DIB:JiaoZh()/矫正mydialog dlg;/定义类型为mydia

24、log的变量dlg.m_value=NULL;if (dlg.DoModal() != IDOK)return false;value=dlg.m_value;/把mydialog类中的m_value赋给DIB类中变量valuedelete dlg;/释放dlgint i,j,Y,Cb,Cr;if(bih.biBitCount=8)/判断灰度图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+) Y=int(255*pow(Hui(i,j)/255.0,value);/对亮度进行校正 Hui(i,j)=(BYTE)Y;/把校

25、正后的亮度赋回else if(bih.biBitCount=24)/24位彩色图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();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)C

26、b; Cnumber(i,j,0)=(BYTE)Cr; elseAfxMessageBox("原图既不是24位真彩图也不是8位灰度图"); return false;return true;8. 图像逆时针旋转90° BOOL DIB:XuanZ()/旋转90度(正方形) int i,j,B;B=GetDIBHeight()-1;if(bih.biBitCount=8)/8位灰度图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+) Yij0=int(Hui(i,j);/取出位图数据保存Y数组f

27、or(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+) (Hui(i,j)=(BYTE)YB-ji0;/把取出的位图数据按照旋转的对应关系存回灰度else if(bih.biBitCount=24)/24位灰度图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+) Yij2=int(Cnumber(i,j,2); Yij1=int(Cnumber(i,j,1); Yij0=int(Cnumber(i,j,0);/取出位图数据保存Y数组for(i=0;i<

28、GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+) Cnumber(i,j,2)=(BYTE)YB-ji2;Cnumber(i,j,1)=(BYTE)YB-ji1; Cnumber(i,j,0)=(BYTE)YB-ji0;/把取出的位图数据按照旋转的对应关系存回elseAfxMessageBox("原图既不是24位真彩图也不是8位灰度图");/将刚打开始时保存的数据重新存回 return false; return true; 10. 还原功能: 加载图像时备份的程序: int i,j; if(bih.biBitCount=24

29、)/彩色图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+)int k=0;for(k;k!=3;k+)Aijk=int(Cnumber(i,j,k);/定义数组A,在打开图的时候对颜色分量进行保存,由还原功能调用if(bih.biBitCount=8)/灰度图:for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+)Aij0=int(Hdu(i,j);/定义数组A,在打开图的时候对颜色分量进行保存,由还原功能调用return TRUE;BOOL DIB:h

30、uanyuan()/还原 int i,j;if(bih.biBitCount=8)/灰度图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+) Hdu(i,j)=(BYTE)Aij0;/打开该图时保存的数据重新赋回else if(bih.biBitCount=24)/24位彩色图for(i=0;i<GetDIBHeight();i+)for(j=0;j<GetDIBWidth();j+)int k; for(k=0;k!=3;k+) Cnumber(i,j,k)=(BYTE)Aijk;/将刚打开始时保存的数据重新

31、存回位图数据中 elseAfxMessageBox("原图既不是24位真彩图也不是8位灰度图");/两者都不是弹出该窗 return false;return true;三程序运行结果截图: 1.个人信息 2.反色 ) (8位灰度图) (反色)3.调节图像亮度:(亮度打印看不出来,增加亮度10%,减小亮度10%)4.调节图像对比度: .增加对比度:(24位bmp) . 减小对比度: .增加对比度(8位灰度图) .减小对比度: 5.提取图像的RGB: (注明:提取红显示全红,绿显示全绿,蓝显示全蓝。) (灰度图时显示)6.图像的镜像操作: 24位彩色图: .镜像:(8位灰度图

32、) 7.校正: 8位灰度图: 8位灰度图: 8. 图像旋转90°: (正方形图) (逆时针旋转90°) 8位灰度图(正方形): 9.还原功能: 以上操作都可以还原。3 遇到的问题和解决办法:.当打开彩色图时,操作调试完,可以打开8位灰度图,而当打开8位灰度图,做任意操作后,即打不开别的图,显示 。解决办法:程序代码中没有判断24位彩色图和8位灰度图,修改代码后就可以了。.指数函数pow()要使用头文件#include "math.h".要正确传输Cnumber的值必须把有关变量定义成单字节并且无符号,否则容易出现错误.校正时弹出对话框的参数转移,赋值,数

33、据类型等出现问题 解决方法:将输入参数的类型设为float型,在实现函数中添加float型的参量。.图像镜像(左右,上下操作)后在中间有一条浅浅竖线。解决办法:变量减1后在操作,左右上下镜像就正常了。4 小结: 在实验过程中发现概念模糊(例如:对比度和亮度)等理论知识的薄弱,做任何事不能眼高手低,要脚踏实地。通过本次多媒体课程设计,加深了对多媒体基本概念的了解。通过使用VC+,将理论应用于实际,巩固了学习成果,提高了实际动手能力。在设计过程中遇到不少问题,通过对程序的修改调试以及同学的帮助,发现了问题,从而解决了问题,最终顺利的完成了课程设计内容。通过设计使我更加了解C+的多文档编程,为我以后的编程打下一定的基础。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1