zoukankan      html  css  js  c++  java
  • OpenCV局部变形算法探究

    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;
    }
    复制代码
  • 相关阅读:
    1571:【例 3】凸多边形的划分
    1570:【例 2】能量项链
    2.25
    2.24 T2 牧场 by greens 1s 128M (pasture.cpp)
    2.24 T1 P3515 [POI2011]Lightning Conductor
    白嫖视频的方法
    2.24 T3 P1912 [NOI2009] 诗人小G
    2.24
    斜率优化
    windy数的补充——数位dp中如何求[a,b]区间内的方案数
  • 原文地址:https://www.cnblogs.com/jukan/p/7444790.html
Copyright © 2011-2022 走看看