在OpenCV中实现特效之浮雕,雕刻和褶皱

来源:互联网 发布:淘宝代购绿色标 编辑:程序博客网 时间:2024/04/28 06:44
 

在OpenCV中实现特效之浮雕,雕刻和褶皱

分类: OpenCV 501人阅读 评论(7) 收藏 举报

下面代码的基础是对图像像素的访问。

实现浮雕和雕刻的代码是统一的,如下

[c-sharp] view plaincopy
  1. #include <cv.h>  
  2. #include <highgui.h>  
  3. #pragma comment( lib, "cv.lib" )  
  4. #pragma comment( lib, "cxcore.lib" )  
  5. #pragma comment( lib, "highgui.lib" )  
  6. int main()  
  7. {  
  8.     IplImage *org=cvLoadImage("1.jpg",1);  
  9.     IplImage *image=cvCloneImage(org);  
  10.     int width=image->width;  
  11.     int height=image->height;  
  12.     int step=image->widthStep;  
  13.     int channel=image->nChannels;  
  14.     uchar* data=(uchar *)image->imageData;  
  15.     for(int i=0;i<width-1;i++)  
  16.     {  
  17.         for(int j=0;j<height-1;j++)  
  18.         {  
  19.             for(int k=0;k<channel;k++)  
  20.             {  
  21.                 int temp = data[(j+1)*step+(i+1)*channel+k]-data[j*step+i*channel+k]+128;//浮雕  
  22.                 //int temp = data[j*step+i*channel+k]-data[(j+1)*step+(i+1)*channel+k]+128;//雕刻  
  23.                 if(temp>255)  
  24.                 {  
  25.                     data[j*step+i*channel+k]=255;  
  26.                 }  
  27.                 else if(temp<0)  
  28.                 {  
  29.                     data[j*step+i*channel+k]=0;  
  30.                 }  
  31.                 else  
  32.                 {  
  33.                     data[j*step+i*channel+k]=temp;  
  34.                 }  
  35.             }  
  36.         }  
  37.     }  
  38.     cvNamedWindow("original",1);  
  39.     cvShowImage("original",org);  
  40.     cvNamedWindow("image",1);  
  41.     cvShowImage("image",image);  
  42.     cvWaitKey(0);   
  43.     cvDestroyAllWindows();  
  44.     cvReleaseImage(&image);  
  45.     cvReleaseImage(&org);  
  46.     return 0;  
  47. }  

原图为

 

 

浮雕效果图如下

 

 

雕刻效果图如下

 

 

下面是实现图像褶皱的代码,效果不是太好,结构过渡不平滑,以后再改进一下。希望能做到波浪化。

[c-sharp] view plaincopy
  1. #include <cv.h>  
  2. #include <highgui.h>  
  3. #pragma comment( lib, "cv.lib" )  
  4. #pragma comment( lib, "cxcore.lib" )  
  5. #pragma comment( lib, "highgui.lib" )  
  6. int main()  
  7. {  
  8.     IplImage *org=cvLoadImage("lena.jpg",1);  
  9.     IplImage *image=cvCloneImage(org);  
  10.     int width=image->width;  
  11.     int height=image->height;  
  12.     int step=image->widthStep;  
  13.     int channel=image->nChannels;  
  14.     uchar* data=(uchar *)image->imageData;  
  15.     int sign=-1;  
  16.     for(int i=0;i<height;i++)  
  17.     {     
  18.         int cycle=10;  
  19.         int margin=(i%cycle);  
  20.         if((i/cycle)%2==0)  
  21.         {  
  22.             sign=-1;  
  23.         }  
  24.         else  
  25.         {  
  26.             sign=1;  
  27.         }  
  28.         if(sign==-1)  
  29.         {     
  30.             margin=cycle-margin;  
  31.             for(int j=0;j<width-margin;j++)  
  32.             {             
  33.                 for(int k=0;k<channel;k++)  
  34.                 {  
  35.                     data[i*step+j*channel+k]=data[i*step+(j+margin)*channel+k];  
  36.                 }  
  37.             }  
  38.         }  
  39.         else if(sign==1)  
  40.         {         
  41.             for(int j=0;j<width-margin;j++)  
  42.             {  
  43.                 for(int k=0;k<channel;k++)  
  44.                 {  
  45.                     data[i*step+j*channel+k]=data[i*step+(j+margin)*channel+k];  
  46.                 }  
  47.             }  
  48.         }     
  49.     }  
  50.     cvNamedWindow("original",1);  
  51.     cvShowImage("original",org);  
  52.     cvNamedWindow("image",1);  
  53.     cvShowImage("image",image);  
  54.     cvSaveImage("image.jpg",image);  
  55.     cvWaitKey(0);   
  56.     cvDestroyAllWindows();  
  57.     cvReleaseImage(&image);  
  58.     cvReleaseImage(&org);  
  59.     return 0;  
  60. }  

测试图是标准的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表示,之后的处理都是对其的操作,格式已无所谓了。你可以试试下面的代码:
[cpp] view plaincopy
  1. #include <cv.h>  
  2. #include <highgui.h>  
  3. #include <stdio.h>  
  4. int main()  
  5. {  
  6.     int64 tick=-1;  
  7.     double duration=0.0;  
  8.     tick=cvGetTickCount();  
  9.     IplImage *bmp=cvLoadImage("lena.bmp",1);  
  10.     tick=cvGetTickCount()-tick;  
  11.     duration=tick/cvGetTickFrequency();  
  12.     printf("%lf\n",duration);  
  13.     tick=cvGetTickCount();  
  14.     IplImage *jpg=cvLoadImage("lena.jpg",1);  
  15.     tick=cvGetTickCount()-tick;  
  16.     duration=tick/cvGetTickFrequency();  
  17.     printf("%lf\n",duration);  
  18.     tick=cvGetTickCount();  
  19.     cvNot( bmp, bmp);  
  20.     tick=cvGetTickCount()-tick;  
  21.     duration=tick/cvGetTickFrequency();  
  22.     printf("%lf\n",duration);  
  23.     tick=cvGetTickCount();  
  24.     cvNot( jpg, jpg);  
  25.     tick=cvGetTickCount()-tick;  
  26.     duration=tick/cvGetTickFrequency();  
  27.     printf("%lf\n",duration);  
  28.     cvReleaseImage(&bmp);  
  29.     cvReleaseImage(&jpg);  
  30.     return 0;  
  31. }  
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:谢谢支持