数 字 图 像 处 理 — 一 个 简 单 的
“photoshop”软件
设计分析:
Photoshop 的处理图像的基本功能有:锐化、模糊、亮
度、对比度、gamma 调整、去色、RGB 色调调整、缩放、
旋转、裁剪等。
现通过 MFC 编程实现 photoshop 功能,设计中实现了
垂直镜像、雾化、浮雕、直方图均衡化的效果功能。
设计过程与结果:
1、 垂直镜像
是指把定义好的图像区域上下翻转地显示在屏幕
上。分析图像垂直镜像的过程,可发现每行的图像信息都保
持不变,而只是改变了行的顺序,将第一行与最后的第 n 行
相互交换,第二行与第 n - 1 行交换……,依此类推,从而
实现了图像的垂直镜像。只需采用按行交换的方式,即可方
便地修改缓冲区内容,实现图像的垂直镜像。
主要实现代码:
void CTestView::Onreverse() //垂直镜像
{
if(!m_dib.m_bLoaded)
//判断图像是否打开,没打开,则弹
出提示框并退出函数
{
}
AfxMessageBox("图像还打开,请先打开图像!");
return;
int nw=m_dib.GetDIBWidth();
//获取图像宽和高
int nh=m_dib.GetDIBHeight();
int i,j;
//i 表示列,j 表示行
byte *ptemp=(byte *)new byte[nw*nh];//开辟一个新的缓冲区
memset(ptemp,0,nw*nh);
//设置为 0,清缓冲区
for(j=0;j
2、雾化
在图像中引入一定的随机值,打乱图像中的像素值
实现代码:
void CTestView::Onatomization() //雾化
{
if(!m_dib.m_bLoaded)
则弹出提示框并退出函数
//判断图像是否打开,没打开,
{
}
AfxMessageBox("图像还打开,请先打开图像!");
return;
int nw=m_dib.GetDIBWidth();
int nh=m_dib.GetDIBHeight();
//获取图像宽和高
//i 表示列,j 表行
int i,j,k,dat;
byte *ptemp=(byte *)new byte[nw*nh];
memset(ptemp,0,nw*nh);
for(j=0;j=nw*nh)
dat=nw*nh-1;
ptemp[j*nw+i]=m_dib.m_pdata[dat];
}
memcpy(m_dib.m_pdata,ptemp,nw*nh);
m_dib.UpdateData();
Invalidate();
//刷新屏幕
}
效果图:
3、浮雕
浮雕"图象效果是指图像的前景前向凸出背景。所谓的"浮雕"
概念是指标绘图像上的一个像素和它左上方的那个像素之间差值的
一种处理过程,为了使图像保持一定的亮度并呈现灰色,我在处理过
程中为这个差值加了一个数值为 128 的常量。这样颜色变化大的
地方色彩就明显,颜色变化小的地方因为差值几乎为零则成
黑色。需要注意的是,当设置一个像素值的时候,它和它左上方的
像素都要被用到,为了避免用到已经设置过的像素,应该从图像的右
下方的像素开始处理。
实现代码:
void CTestView::Onembossment() //浮雕
{
if(!m_dib.m_bLoaded)
//判断图像是否打开,没打开,则弹出提示框并退出
函数
{ AfxMessageBox("图像还打开,请先打开图像!");return;
//获取图像宽和高
}
int nw=m_dib.GetDIBWidth();
int nh=m_dib.GetDIBHeight();
int i,j,temp;
byte *ptemp=(byte *)new byte[nw*nh];
memset(ptemp,0,nw*nh);
for(j=nh-1;j>0;j--)
//i 表示列,j 表示行
//设置为 0
for(i=nw-1;i>0;i--)
{
temp=m_dib.m_pdata[j*nw+i]-m_dib.m_pdata[(j-1)*nw+i-1]+128;
if(temp>255)
temp=255;
if(temp<0)
temp=0;
ptemp[j*nw+i]=temp;
}
memcpy(m_dib.m_pdata,ptemp,nw*nh);
m_dib.UpdateData();
Invalidate();
}
//刷新屏幕
效果图: