在OpenCV中实现特效之浮雕,雕刻和褶皱
发布日期:2021-07-21 16:21:20
浏览次数:5
分类:技术文章
本文共 4345 字,大约阅读时间需要 14 分钟。
分类: 2011-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楼 2012-05-07 17:18发表
- 恩,我在看学习opencv中文版,也在opencv中文网上学了一些~其实我的任务是用opencv做出图像的油画效果,就像ps里的一个滤镜效果一样。我在论坛里看到有前辈说先把RBG转成HSI调整图像饱和度,再进行高斯模糊,最后分色块儿,但这好像不能像ps那样做到一键到位~我想请教一下您有什么思路或方法没有?而且我听说用opencv处理的话bmp比jpg效率高些,是这样吗?谢谢~
- Re: 2012-05-08 16:25发表
- 回复supervalerie:一个可能的输出结果: 1073.276808 10178.832561 206.926612 230.380834 可见bmp的读入明显比jpg快,而对它们进行反色处理时间却相差无几。
- Re: 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楼 2012-05-06 22:24发表
- 最近也在学opencv呢~谢谢前辈的分享~我想请教一下用opencv处理的图像有什么要求吗?什么样的图像能达到最好的效果?
- Re: 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楼 2011-05-26 23:09发表
- 写的很好,看了几篇文章,学习了很多东西!
- Re: 2011-05-27 15:07发表
- 回复 hesong_qiao:谢谢支持
转载地址:https://blog.csdn.net/love_hot_girl/article/details/7608847 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年09月06日 10时11分17秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
POJ 1661 Help Jimmy
2019-05-24
百练OJ 2755 神奇的口袋(递归+递推)
2019-05-24
HDU 1003 Max Sum
2019-05-24
Code Vs 1014 装箱
2019-05-24
循环队列,队链的实现
2019-05-24
HDU 2602 Bone Collector (01背包)
2019-05-24
POJ 1837 Blance (01背包)
2019-05-24
HDU 2456 饭卡 (01背包)
2019-05-24
HDU 1559 最大子矩阵
2019-05-24
Open Judge 4010 :2011
2019-05-24
百练OJ-2815 城堡问题【DFS】
2019-05-24
CODE[VS] 1025 选菜 【背包】
2019-05-24
POJ 1724 ROADS【DFS+剪枝】
2019-05-24
AOJ 847 整数拆段
2019-05-24
AOJ 848 分数拆分
2019-05-24
UVA 133 The Dole Queue 【约瑟夫环】
2019-05-24
XDOJ 1208 B.笑爷买房 【DFS】
2019-05-24
部门年度工作总结的内容
2019-05-24
pandas学习笔记
2019-05-24
Numpy笔记
2019-05-24