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


下面代码的基础是对图像像素的访问。实现浮雕和雕刻的代码是统一的,如下

  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. }  

原图为

 

浮雕效果图如下

 

雕刻效果图如下

 

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

  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图,效果图如下

相关内容