OpenCV局部变形算法探究

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

以上代码未经测试,仅供思路参考

原文地址:https://www.cnblogs.com/wonderchief/p/6656915.html