社区
图形处理/算法
帖子详情
现在有图像的数据部分,如何做滤镜效果?
woshizhanhun
2009-04-29 05:19:26
现在有图像的数据部分,如何实现一些简单的滤镜效果,比如模糊滤镜,浮雕效果啥的。愿听详谈~
...全文
105
3
打赏
收藏
现在有图像的数据部分,如何做滤镜效果?
现在有图像的数据部分,如何实现一些简单的滤镜效果,比如模糊滤镜,浮雕效果啥的。愿听详谈~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
TianChong
2009-05-04
打赏
举报
回复
楼主可以买本VC进行图像处理的教程,里面有大量的解说,还有源码光盘,应该可以让你快速提高,单从网上抄一把代码也是知其然而不知所以然啊.书可以到WWW.CHINA-PUB.COM上购买.或者WWW.JOYO.COM上也可以,一般都不贵,30-40左右吧,电子版的书网上也有,但是你可能找不到源码光盘.
warsour
2009-05-03
打赏
举报
回复
一、操作位图的像素实现显示的特效
我们首先介绍直接操作图像中的像素的灰度值来实现图像显示的特效、这里我们主要介绍如何实现图像的浮雕和雕刻效果。经常看电视的朋友们不知注意到没有,有些电视连续剧在每集片头或片尾部分都有显示一些特殊效果的图像,比如前一阵子中央一套放的《长征》和《康熙王朝》,这些特效称为"图像的浮雕效果"和"图像的雕刻效果",经过这些特效处理后的图像增强了观众们的视觉效果,它们看上去仿佛是使用3D技术作的,这也许就是为什么这种技术那么流行的原因吧。其实,我们完全可以用一些简单的数字图像处理算法来实现这些看似复杂高深的显示效果。下面以一个标准的Lena灰度图像为原图,给出了处理后的效果图,同时给出了VC开发平台上的部分实现源代码。
1."浮雕"图像
"浮雕"图象效果是指图像的前景前向凸出背景。所谓的"浮雕"概念是指标绘图像上的一个像素和它左上方的那个像素之间差值的一种处理过程,为了使图像保持一定的亮度并呈现灰色,我在处理过程中为这个差值加了一个数值为128的常量。需要读者注意的是,当设置一个像素值的时候,它和它左上方的像素都要被用到,为了避免用到已经设置过的像素,应该从图像的右下方的像素开始处理,下面是实现的源代码:
void CDibView::OnFDImage() //产生"浮雕"效果图函数
{
HANDLE data1handle;//用来存放图像数据的句柄;
LPBITMAPINFOHEADER lpBi;//图像的信息头结构;
CDibDoc *pDoc=GetDocument();//得到文挡指针;
HDIB hdib;//用来存放图像数据的句柄;
unsigned char *pData;//指向原始图像数据的指针;
unsigned char *data;//指向处理后图像数据的指针;
hdib=pDoc->m_hDIB;//拷贝存放已经读取的图像文件数据句柄;
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);//获取图像信息头
pData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
//FindDIBBits是我定义的一个函数、根据图像的结构得到位图的灰度值数据、
pDoc->SetModifiedFlag(TRUE);
//设置文档修改标志为“真”、为后续的修改存盘作准备;
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight); //声明一个缓冲区用来暂存处理后的图像数据;
data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);//得到该缓冲区的指针;
AfxGetApp()->BeginWaitCursor();
int i,j,buf;
for( i=lpBi->biHeight; i>=2; i--)//从图像右下角开始对图像的各个像素进行“浮雕”处理;
for( j=lpBi->biWidth; j>=2; j--)
{
//浮雕处理
buf=*(pData+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)-*(pData+(lpBi->biHeight-i+1)*WIDTHBYTES(lpBi->biWidth*8)+j-1)+128;
if(buf>255) buf=255;
if(buf<0)buf=0; *(data+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)=(BYTE)buf;
}
for( j=0; jbiHeight; j++)
for( i=0; ibiWidth; i++)
//重新写回原始图像的数据缓冲区;
*(pData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j); AfxGetApp()->EndWaitCursor();
pDoc->m_hDIB =hdib//将处理过的图像数据写回pDoc中的图像缓冲区;
GlobalUnlock((HGLOBAL)hdib);//解锁、释放缓冲区;
GlobalUnlock((HGLOBAL)data1handle);
GlobalFree((HGLOBAL)hdib);
GlobalFree((HGLOBAL)data1handle);
Invalidate(TRUE);//显示图像
}
2."雕刻"图像
上面讲述了通过求一个像素和它左上方像素之间的差值并加上一个常数的方法生成"浮雕"效果的灰度图像,"雕刻"图像与之相反,它是通过取一个像素和它右下方的像素之间的差值并加上一个常数,这里我也取128,经过这样处理,就可以得到"雕刻"图像,这时候图像的前景凹陷进背景之中。同样需要读者注意的是为了避免重复使用处理过的图像像素,处理图像时要从图像的左上方的像素开始处理。实现代码如下:
void CDibView::OnDKImage()
{
// TOD Add your command handler code here
HANDLE data1handle;//这里的内部变量与前面的含义一致、这里不再赘述;
LPBITMAPINFOHEADER lpBi;
CDibDoc *pDoc=GetDocument();
HDIB hdib;
unsigned char *pData;
unsigned char *data;
hdib=pDoc->m_hDIB;//拷贝图像数据的句柄;
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
pData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
pDoc->SetModifiedFlag(TRUE);
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);//申请缓冲区;
data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);//得到新的缓冲去的指针; AfxGetApp()->BeginWaitCursor();
int i,j,buf;
for( i=0;i<=lpBi->biHeight-2; i++)//对图像的各个像素循环进行"雕刻"处理;
for( j=0;j<=lpBi->biWidth-2; j++)
{
buf=*(pData+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)-*(pData+(lpBi->biHeight-i-1)*WIDTHBYTES(lpBi->biWidth*8)+j+1)+128;//“雕刻”处理;
if(buf>255) buf=255;
if(buf<0)buf=0;
*(data+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)=(BYTE)buf;
}
for( j=0; jbiHeight; j++)
for( i=0; ibiWidth; i++) //重新将处理后的图像数据写入原始的图像缓冲区内; *(pData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j);
pDoc->m_hDIB =hdib//将处理过的图像数据写回pDoc中的图像缓冲区;
GlobalUnlock((HGLOBAL)hdib);//解锁、释放缓冲区;
GlobalUnlock((HGLOBAL)data1handle);
GlobalFree((HGLOBAL)hdib);
GlobalFree((HGLOBAL)data1handle);
Invalidate(TRUE);//显示图像
}
3.图像的旋转
根据图像像素的位置来调节该位置的灰度可以实现许多显示的特效,例如图像的镜像、翻转等。灰度图像旋转就是根据这一个思想实现的,它是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转。首先根据旋转的角度、图像对角线的长度计算旋转后的图像的最大宽度、高度,根据旋转后图象最大的宽度、高度生成新的缓冲区,假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x, y)绕其中心(xcenter, ycenter)逆时针旋转angle角度后,新的坐标位置(x1, y1)的计算公式为:
xcenter = (width+1)/2+left;
ycenter = (height+1)/2+top;
x1 = (x-xcenter) cosθ - (y - ycenter) sinθ+xcenter;
y1 = (x-xcenter) sinθ+ (y- ycenter) cosθ+ ycenter;
与图像的镜像变换相类似,下一步就是把原图中的(x,y)处象素的灰度值读入新缓冲区的(x1,y1)点处。注意在新缓冲区中与原图没有对应的象素点的值用白色或指定的灰度代替
laviewpbt
2009-04-29
打赏
举报
回复
直接按照你的算法修改图像数据不久可以了。
14.2 以并行方式运行的图形
效果
14.2 以并行方式运行的图形
效果
为了演示第一种技术,我们将开发需要并行处理大型数组的应用程序。一个大型数组的最简单的例子,是表示为一个二维数组的颜色的
图像
数据
。我们在第 8 章中使用过相同的示例,当时是讨论以行为为中心的应用程序,但是,这一次我们将关注不同的方面。 用户将能够打开
图像
,从列表中选择一个
滤镜
,将其应用到
图像
。首先,我们会开发几个
滤镜
,然后,如何运行一个
效果
,对
图像
的不...
opengl纹理缩放的原理
一、背景 用OpenGL处理3dlut映射的时候,lut
滤镜
数据
输入到纹理后,不经过任何处理直接输出,
图像
两边会有错误的像素点出现,如下(更换了图片,以便验证结果的一般性) 如上图,在边缘出现了模糊的颜色 二、原因 在我的测试demo中有以下代码设置纹理的属性 // 当纹理坐标超出范围时,重复当前纹理 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE
网页设计上海计算机一级教程,2017上海计算机一级8套考试题.pdf-文档在线预览...
贰零壹柒年上海市高等学校计算机等级考试试卷一级(贰零壹伍版考纲A卷)所有的样张都在“C:\样张”文件夹中,考试系统中【样张】按钮可直接打开此文件夹。注意:样张仅供参考,相关设置按题目要求完成即可。由于显示器分辨率或窗口大小的不同,网页中文字的位置可能与样张略有差异,图文混排
效果
与样张大致相同即可;由于显示器颜色差异,Office和网页等
做
出结果与样张图片中存在色差也是正常的。(一)Windows操...
CoreImage 及
滤镜
效果
做
过 iOS 开发的人,对core这个字眼一定不陌生,它总是代表着或者底层的,或者牛叉的,或者底层牛叉的Apple 自己的框架. CoreImage 让你可以简单的应用
滤镜
来处理图片,比如修改饱和度,亮度,对比度等东西(对了解 PS 的人来说,非常的亲切吧).
图像
特效
滤镜
的 MATLAB 实现
在实现
图像
特效
滤镜
之前,首先需要掌握
图像
处理的基础知识,包括
图像
的读取与显示(imread,imshow)、
图像
类型转换(灰度化、二值化等)、
图像
变换(傅里叶变换、小波变换)、
图像
增强(滤波、锐化、直方图均衡化)等。总之,
图像
特效
滤镜
的MATLAB实现是一个充满挑战与乐趣的过程,它要求用户具备扎实的
图像
处理基础、良好的编程能力以及丰富的创意思维。满足实际应用需求:设计符合特定需求的
图像
特效
滤镜
,可以应用于各种实际场景,如增强
图像
的视觉
效果
、去除
图像
中的噪声、提取
图像
中的有用信息等,提升
图像
的质量和可用性。
图形处理/算法
19,464
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章