在OpenCV中实现特效之浮雕,雕刻和褶皱
来源:互联网 发布:淘宝代购绿色标 编辑:程序博客网 时间:2024/04/28 06:44
在OpenCV中实现特效之浮雕,雕刻和褶皱
分类: OpenCV2011-05-24 17:18 501人阅读 评论(7) 收藏 举报
下面代码的基础是对图像像素的访问。
实现浮雕和雕刻的代码是统一的,如下
- #include <cv.h>
- #include <highgui.h>
- #pragma comment( lib, "cv.lib" )
- #pragma comment( lib, "cxcore.lib" )
- #pragma comment( lib, "highgui.lib" )
- int main()
- {
- IplImage *org=cvLoadImage("1.jpg",1);
- IplImage *image=cvCloneImage(org);
- int width=image->width;
- int height=image->height;
- int step=image->widthStep;
- int channel=image->nChannels;
- uchar* data=(uchar *)image->imageData;
- for(int i=0;i<width-1;i++)
- {
- for(int j=0;j<height-1;j++)
- {
- for(int k=0;k<channel;k++)
- {
- int temp = data[(j+1)*step+(i+1)*channel+k]-data[j*step+i*channel+k]+128;//浮雕
- //int temp = data[j*step+i*channel+k]-data[(j+1)*step+(i+1)*channel+k]+128;//雕刻
- if(temp>255)
- {
- data[j*step+i*channel+k]=255;
- }
- else if(temp<0)
- {
- data[j*step+i*channel+k]=0;
- }
- else
- {
- data[j*step+i*channel+k]=temp;
- }
- }
- }
- }
- cvNamedWindow("original",1);
- cvShowImage("original",org);
- cvNamedWindow("image",1);
- cvShowImage("image",image);
- cvWaitKey(0);
- cvDestroyAllWindows();
- cvReleaseImage(&image);
- cvReleaseImage(&org);
- return 0;
- }
原图为
浮雕效果图如下
雕刻效果图如下
下面是实现图像褶皱的代码,效果不是太好,结构过渡不平滑,以后再改进一下。希望能做到波浪化。
- #include <cv.h>
- #include <highgui.h>
- #pragma comment( lib, "cv.lib" )
- #pragma comment( lib, "cxcore.lib" )
- #pragma comment( lib, "highgui.lib" )
- int main()
- {
- IplImage *org=cvLoadImage("lena.jpg",1);
- IplImage *image=cvCloneImage(org);
- int width=image->width;
- int height=image->height;
- int step=image->widthStep;
- int channel=image->nChannels;
- uchar* data=(uchar *)image->imageData;
- int sign=-1;
- for(int i=0;i<height;i++)
- {
- int cycle=10;
- int margin=(i%cycle);
- if((i/cycle)%2==0)
- {
- sign=-1;
- }
- else
- {
- sign=1;
- }
- if(sign==-1)
- {
- margin=cycle-margin;
- for(int j=0;j<width-margin;j++)
- {
- for(int k=0;k<channel;k++)
- {
- data[i*step+j*channel+k]=data[i*step+(j+margin)*channel+k];
- }
- }
- }
- else if(sign==1)
- {
- for(int j=0;j<width-margin;j++)
- {
- for(int k=0;k<channel;k++)
- {
- data[i*step+j*channel+k]=data[i*step+(j+margin)*channel+k];
- }
- }
- }
- }
- cvNamedWindow("original",1);
- cvShowImage("original",org);
- cvNamedWindow("image",1);
- cvShowImage("image",image);
- cvSaveImage("image.jpg",image);
- cvWaitKey(0);
- cvDestroyAllWindows();
- cvReleaseImage(&image);
- cvReleaseImage(&org);
- return 0;
- }
测试图是标准的lena图,效果图如下
查看评论
- 3楼 supervalerie 2012-05-07 17:18发表 [回复]
- 恩,我在看学习opencv中文版,也在opencv中文网上学了一些~其实我的任务是用opencv做出图像的油画效果,就像ps里的一个滤镜效果一样。我在论坛里看到有前辈说先把RBG转成HSI调整图像饱和度,再进行高斯模糊,最后分色块儿,但这好像不能像ps那样做到一键到位~我想请教一下您有什么思路或方法没有?而且我听说用opencv处理的话bmp比jpg效率高些,是这样吗?谢谢~
- Re: quarryman 2012-05-08 16:25发表 [回复]
- 回复supervalerie:一个可能的输出结果:
1073.276808
10178.832561
206.926612
230.380834
可见bmp的读入明显比jpg快,而对它们进行反色处理时间却相差无几。
- Re: quarryman 2012-05-08 16:22发表 [回复]
- 你好,你说的好像是非真实感绘制(Non-Photorealistic Rendering , NPR),你可以依它为关键词查找论文。一键到位是相对的,你也可以自己写一个函数实现油画化啊。没错的,bmp比jpg效率高些,但只是因为前者的读写速度快(后者压缩的缘故),读入后,不管什么格式都是用IplImage或Mat表示,之后的处理都是对其的操作,格式已无所谓了。你可以试试下面的代码:
- #include <cv.h>
- #include <highgui.h>
- #include <stdio.h>
- int main()
- {
- int64 tick=-1;
- double duration=0.0;
- tick=cvGetTickCount();
- IplImage *bmp=cvLoadImage("lena.bmp",1);
- tick=cvGetTickCount()-tick;
- duration=tick/cvGetTickFrequency();
- printf("%lf\n",duration);
- tick=cvGetTickCount();
- IplImage *jpg=cvLoadImage("lena.jpg",1);
- tick=cvGetTickCount()-tick;
- duration=tick/cvGetTickFrequency();
- printf("%lf\n",duration);
- tick=cvGetTickCount();
- cvNot( bmp, bmp);
- tick=cvGetTickCount()-tick;
- duration=tick/cvGetTickFrequency();
- printf("%lf\n",duration);
- tick=cvGetTickCount();
- cvNot( jpg, jpg);
- tick=cvGetTickCount()-tick;
- duration=tick/cvGetTickFrequency();
- printf("%lf\n",duration);
- cvReleaseImage(&bmp);
- cvReleaseImage(&jpg);
- return 0;
- }
- 2楼 supervalerie 2012-05-06 22:24发表 [回复]
- 最近也在学opencv呢~谢谢前辈的分享~我想请教一下用opencv处理的图像有什么要求吗?什么样的图像能达到最好的效果?
- Re: quarryman 2012-05-07 12:49发表 [回复]
- 回复supervalerie:呵呵,我算不上前辈,只是先学而已。据我所知,OpenCV支持许多格式,对图像的要求并不苛刻。OpenCV的优势在于提供了许多现成的图像处理和分析的算法,而且效率很高。至于“什么样的图像能达到最好的效果”,我想这不在于你采用什么图像库吧,而在于你采用的算法。你是初学,最好看书。下面是我总结的书目,可作参考:
Learning OpenCV
http://www.amazon.com/Learning-OpenCV-Computer-Vision-Library/dp/0596516134
OpenCV 2 Computer Vision Application Programming Cookbook
http://www.amazon.com/OpenCV-Computer-Application-Programming-Cookbook/dp/1849513244
学习OpenCV(中文版)
http://product.dangdang.com/product.aspx?product_id=20699366
OpenCV教程:基础篇
http://product.dangdang.com/product.aspx?product_id=20280521
基于OpenCV的计算机视觉技术实现
http://product.dangdang.com/product.aspx?product_id=20239693
- 1楼 hesong_qiao 2011-05-26 23:09发表 [回复]
- 写的很好,看了几篇文章,学习了很多东西!
- Re: quarryman 2011-05-27 15:07发表 [回复]
- 回复 hesong_qiao:谢谢支持
- 在OpenCV中实现特效之浮雕,雕刻和褶皱
- 实现图像特效之浮雕与雕刻
- opencv特效编辑之雕刻效果
- 图像特效之浮雕(OpenCV)
- 浮雕,雕刻,木刻,灯光,油画滤镜的原理及实现 opencv+vs
- 学习OpenCV:滤镜系列(1)—— 雕刻&浮雕
- 学习OpenCV:滤镜系列(1)—— 雕刻&浮雕
- Opencv之图像浮雕
- java 图像特效之黑白 浮雕和底片
- 能进行调整的文字浮雕和雕刻效果
- 图像滤镜特效(反色、浮雕、雕刻、怀旧、冰冻、暗调)(一)
- 雕刻效果的实现【OpenCV+QT】
- 【安卓笔记】图片特效之浮雕效果
- opencv 雕刻操作
- opencv 浮雕操作
- 基于opencv的相机之特效功能实现(八)
- 怎么实现ZBrush中头部模型的快速雕刻
- 在OpenCV中实现YUV420sp2RGB
- Android 调试桥(adb)
- Delphi判断文件夹下子文件夹是否为空,及删除子文件夹,遍历文件夹及子文件夹的文件
- SQL Server 作业监控
- 信息安全导论课后的几个小问题
- MyEclipse8.5 svn插件安装
- 在OpenCV中实现特效之浮雕,雕刻和褶皱
- Fitts’ Law(费茨法则)在交互设计中的应用
- liunx下syntax error: unexpected end of file错误提示
- 关于Asp.net超时,延长读取sql server数据库的超时时间!(已解决)
- PHP编码规范
- 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片、店名、活动详情、地址、电话和距离等。
- 比较两个对象相等
- java泛型,原始类型,桥接方法
- UNIX经典书(收集) zz