一个简单的“photoshop”软件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个简单的“photoshop”软件
一、课程设计课题
做一个简单的“photoshop”软件利用VC++实现软件框架:有操作菜单、能显示某项操作前后的图像。查找相关算法,至少实现3种功能,比如:灰度增强、直方图显示、浮雕等等。
二、课程设计目的
1.进一步熟悉VC++6.0的MFC编程,熟悉利用CDIB类。进一步巩固数字图像处理的
基本概念、理论、分析方法和实现方法;
2.结合数字图像处理的理论知识,结合实际,更好培训实践技能,增强应用VC++编
写数字图像处理的应用程序及分析、解决实际问题的能力;
3.能够针对实践过程的问题,提出有效方案并予以解决,尝试将所学的内容解决实际工
程问题,培养学生的工程实践能力,提高工科学生的就业能力。
三、设计内容
步骤及分析:
1.通过网络和图书馆搜索有关图像处理的资料,并学习有关MFC图像处理的
内容
2.确定方案,开始编写实验代码和调试
3.细化代码,运行程序
确定要实现图像处理的算法,如直方图均衡化,浮雕等的算法。直方图就是在某一灰度级的象素个数占整幅图像的象素比h=nj/N,其中nj是灰度级在j的象素数,N是总象素数,扫描整幅图像得出的h的离散序列就是图像的直方图,h求和必然=1,所以直方图可以看成是象素对于灰度的概率分布函数。直方图均衡化算法分为三个步骤,第一步是统计直方图每个灰度级出现的次数,第二步是累计归一化的直方图,第三步是计算新的像素值。对于彩色的图片来说,直方图均衡化一般不能直接对R、G、B三个分量分别进行上述的操作,而要将RGB转换成HSV来对V分量进行直方图均衡化的操作。
浮雕效果就是将图像的变化部分突出显示,颜色相同部分淡化处理,使图像出现浮雕效果。实现图像浮雕效果的一般原理是,将图像上每个像素点与其对角线的像素点形成差值,使相似颜色值淡化,不同颜色值突出,从而产生纵深感,达到浮雕的效果,具体的做法是用处于对角线的2个像素值相减,再加上一个背景常数,一般为128而成。这样颜色变化大的地方色彩就明显,颜色变化小的地方因为差值几乎为零则成黑色。
主要代码分析:
直方图均衡化:
int i,j,k,max=0,min=0;
int n[256]={0};//n[i]灰度值为i的像素的个数
float p[256]={0.0};//p[i]灰度为i的像素个数的归一化
float c[256]={0.0};//c[i]灰度为i的像素个数的累积归一化
for(i=0;i { for(j=0;j { k=m_dib.m_pdata[i*nw+j]; n[k]++; } } for(i=0;i<256;i++)//归一化直方图 { p[i]=(float)n[i]/(nw*nh); } for(i=0;i<256;i++)//累积归一化直方图 for(j=0;j<=i;j++) { c[i]+=p[j]; } for(i=0;i { for(j=0;j { if(max<=m_dib.m_pdata[i*nw+j])max=m_dib.m_pdata[i*nw+j]; if(min>=m_dib.m_pdata[i*nw+j])min=m_dib.m_pdata[i*nw+j]; } } for(i=0;i { for(j=0;j { m_dib.m_pdata[i*nw+j]=c[m_dib.m_pdata[i*nw+j]]*(max-min)+min+0.5; } } m_dib.UpdateData();//将修改的m_pdata的数据赋值给m_pDIBData,显示修改的结果Invalidate();//刷新屏幕 } 浮雕: int i,j; for(i=0;i for(j=(nw-1);j>=0;j--) { m_dib.m_pdata[i*nw+j]-=m_dib.m_pdata[(i+1)*nw+j-1]; } m_dib.UpdateData();//将修改的m_pdata的数据赋值给m_pDIBData,显示修改的结果Invalidate(); //刷新屏幕 } 向上平移: int i,j; int offset=5;//偏移量 for(i=(nh-1);i>offset;i--) for(j=0;j { m_dib.m_pdata[i*nw+j]=m_dib.m_pdata[i*nw+j-offset*nw]; } for(i=offset;i>=0;i--) for(j=0;j { m_dib.m_pdata[i*nw+j]=255; } m_dib.UpdateData();//将修改的m_pdata的数据赋值给m_pDIBData,显示修改的结果//刷新屏幕 Invalidate(); } 向下平移: int i,j; int offset=5;//偏移量 for(i=0;i<(nh-offset);i++) for(j=0;j { m_dib.m_pdata[i*nw+j]=m_dib.m_pdata[i*nw+j+offset*nw]; } for(i=(nh-offset);i for(j=0;j { m_dib.m_pdata[i*nw+j]=255; } m_dib.UpdateData();//将修改的m_pdata的数据赋值给m_pDIBData,显示修改的结果Invalidate();//刷新屏幕 } 四、实验结果 原图经Photoshop浮雕处理的图像使用VC++实现浮雕的效果 原图经Photoshop均衡化效果使用VC++实现均衡化的效果实现图像浮雕效果的具体的做法是用处于对角线的2个像素值相减,再加上一个背景常数,一般为128而成。这种算法的特点是简单快捷,缺点是不能调节图像浮雕效果的角度和深度。用Photoshop实现图像浮雕效果,可以任意调节浮雕角度和深度(2个像素点的距离),还可以