http://www.cnblogs.com/wonderchief/p/6656915.html
OpenCV是跨平台的强大的计算机视觉识别和图像处理的开源库,可以利用他来实现:模式识别、构建神经网络、深度学习,总之用途多多,入门级就先做一下图像处理吧!
基本的图像处理算法(图像灰阶化、二值化、仿射变换、缩放变换以及各种插值方法)在百度或者谷歌上就能随便找到算法,但是我想找到一种可以进行局部球状或者弧形状梯级式变形,找了很久没有,嗯。。。。关键问题还是得靠自己
问题分析:
如果我要实现想现实中如下的变形,应该怎么办?(本人文化很低,不懂得这种叫什么现象,暂且叫:弧形变形吧)
嗯,通过观察一下,这个形状有点像2次函数,也像sin函数,经过对比,还是sin会接近一些
于是打开octive手动画一下:
通过观察可知,调整sin函数的系数可以调整震幅,那么,我们假设:
v(i,j)是矩阵任意一点
v(i,j)=v(i - sin(j/H/PI),j)进行变换
那么就可以对图像进行sin函数扭曲
如果要实现可变振幅,还要进一步处理:
v(i,j)=v(i - (i/W)*sin(j/H/PI),j)
如果要实现四边都是完美过度,还要进行调整:
具体代码如下:
//image longitudinal warping changeable amplitudes int xWarp(cv::Mat mat, int dst) { int w = mat.cols; int h = mat.rows; cv::Mat t = mat.clone(); //cols for (int i = 0; i < w; i++) { //rows for (int j = 0; j < h; j++) { double delta; if (i < (w / 2)) delta = (double)i / (double)w * dst * sin(((double)j / (double)h) * pi); else delta = (1 - (double)i / (double)w) * dst * sin(((double)j / (double)h) * pi); mat.at(j, i) = t.at(j, i - delta); } } return 0; }