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

以上代碼未經測試,僅供思路參考

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM