opencv 数字图像处理-图像错切
2015-06-28 21:29
375 查看
图像的错切变换实际上是平面景物在投影平面上的非垂直投影效果。图像错切变换也称为图像剪切、错位或错移变换。图像错切的原理就是保持图像上各点的某一坐标不变,将另一个坐标进行线性变换,坐标不变的轴称为依赖轴,坐标变换的轴称为方向轴。图像错切一般分为两种情况:水平方向错切和垂直方向错切。
####################################################
水平方向的错切,即沿x轴方向关于y的错切,即x=x0+c*y0, y=y0
若c>0,则沿+x轴方向错切,反之,如果c<0,则沿-x轴方向错切.
#########################################################
垂直方向错切,即沿y轴方向关于x的错切。与水平错切类似变换,即x=x0, y=y0+b*x0
####################################################
水平方向的错切,即沿x轴方向关于y的错切,即x=x0+c*y0, y=y0
若c>0,则沿+x轴方向错切,反之,如果c<0,则沿-x轴方向错切.
void imageTwist(IplImage *src, IplImage *res, float ratio) { cvZero(res); int res_wid; int res_hei; unsigned char* src_data = (unsigned char*)src->imageData; unsigned char* res_data = (unsigned char*)res->imageData; for (int i=0; i<src->height; i++) { if (ratio >= 0) for (int j=0; j<src->width; j++) { res_hei=i; res_wid=j+res_hei*ratio; res_data[res_hei*res->widthStep+res_wid] = src_data[i*src->widthStep+j]; } else { int offset=ratio*src->height; for (int j=src->width-1; j>=0; j--) { res_hei=i; res_wid=j+res_hei*ratio; res_data[res_hei*res->widthStep+res_wid+offset] = src_data[i*src->widthStep+j]; } } } cvNamedWindow("src"); cvNamedWindow("res"); cvShowImage("src", src); cvShowImage("res", res); cvWaitKey(0); cvReleaseImage(&src); cvReleaseImage(&res); cvDestroyAllWindows(); } void imageCutting(void) { src=cvLoadImage("lena.jpg", 0); if (src == NULL) exit(0); float ratio; cout<<"输入水平错切比率:"<<endl; cin>>ratio; int res_wid; int res_hei; if (ratio < 0) { res_wid=src->width+src->height*ratio*(-1); } else { res_wid=src->width+src->height*ratio; } res_hei=src->height; CvSize size=cvSize(res_wid, res_hei); res=cvCreateImage(size, src->depth, src->nChannels); if (res == NULL) exit(0); imageTwist(src, res, ratio);//图像扭曲 }
#########################################################
垂直方向错切,即沿y轴方向关于x的错切。与水平错切类似变换,即x=x0, y=y0+b*x0
void imageTwistV(IplImage *src, IplImage *res, float ratio) { cvZero(res); int res_wid; int res_hei; unsigned char* src_data = (unsigned char*)src->imageData; unsigned char* res_data = (unsigned char*)res->imageData; for (int i=0; i<src->width; i++) { if (ratio >= 0) { int offset=ratio*src->width; for (int j=0; j<src->height; j++) { res_wid=i; res_hei=j+offset-res_wid*ratio; res_data[res_hei*res->widthStep+res_wid] = src_data[j*src->widthStep+i]; } } else { //int offset=ratio*src->height*(-1); for (int j=src->height-1; j>=0; j--) { res_wid=i; res_hei=j+res_wid*ratio*(-1); res_data[res_hei*res->widthStep+res_wid] = src_data[j*src->widthStep+i]; } } } cvNamedWindow("src"); cvNamedWindow("res"); cvShowImage("src", src); cvShowImage("res", res); cvWaitKey(0); cvReleaseImage(&src); cvReleaseImage(&res); cvDestroyAllWindows(); } void imageCutting(void) { src=cvLoadImage("lena.jpg", 0); if (src == NULL) exit(0); float ratio=0; cout<<"输入垂直错切比率:"<<endl; cin>>ratio; int res_wid; int res_hei; if (ratio < 0) { res_hei=src->height+src->width*ratio*(-1); //res_wid=src->width+src->height*ratio*(-1); } else { res_hei=src->height+src->width*ratio; //res_wid=src->width+src->height*ratio; } res_wid=src->width; //res_hei=src->height; CvSize size=cvSize(res_wid, res_hei); res=cvCreateImage(size, src->depth, src->nChannels); if (res == NULL) exit(0); // imageTwistH(src, res, ratio);//图像扭曲 imageTwistV(src, res, ratio); }
相关文章推荐
- Linux 手动编译PHP 5.6
- cJSON(Linux C)
- linux文件空洞
- 基于OpenCV的摄像机标定-翻译
- linux程序设计——make命令和makefile文件(第九章)
- 安全测试外包 简单搞定网站安全问题
- shell十三问(转)
- dev-ops
- Play HEVC/H.265 Videos and Embed HEVC Streams into MP4 and TS Files with openHEVC and GPAC
- spark、storm与Hadoop
- FIO是测试IOPS的 支持13种不同的I/O引擎
- CentOS 初始化时普通用户修改ROOT密码并且开启远程登录
- linux expect的简单用法及举例
- linux shell 指令 诸如-d, -f, -e之类的判断表达式
- A9.linux驱动
- 用 PHP 编写支持高并发的网站
- Linux进程间通信(一)---进程间通信概述及其种类
- Linux find 用法示例
- 项目之中的 shell脚本中变量是怎么变化的。
- Linux的系统级性能剖析工具-perf