歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 在OpenCV中實現特效之浮雕,雕刻和褶皺

在OpenCV中實現特效之浮雕,雕刻和褶皺

日期:2017/3/1 10:10:32   编辑:Linux編程

下面代碼的基礎是對圖像像素的訪問。實現浮雕和雕刻的代碼是統一的,如下

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

Copyright © Linux教程網 All Rights Reserved