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; }
以上代碼未經測試,僅供思路參考