在之前的操作中,如加入椒鹽噪聲或是對圖像進行銳化操作,都讀取和修改了圖像的像素值。圖像的重映射是通過移動像素修改圖像的外觀。這個過程不會修改圖像值,而是把每個像素的位置重新映射到新的位置。可以用來創建圖像特效,或者修正因鏡片等原因導致的圖像扭曲。
使用OPENCV的remap函數,首先,定義在重映射處理中使用的映射參數,然後把映射參數應用到輸入圖像。以下定義一個轉換函數,在圖像上創建波浪形的效果。
代碼如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//重映射圖像,創建波浪形效果
void wave(const Mat &image,Mat &result)
{
//映射參數
Mat srcX(image.rows,image.cols,CV_32F);//x方向
Mat srcY(image.rows,image.cols,CV_32F);//y方向
//創建映射參數
for(int i=0;i<image.rows;i++)
{
for(int j=0;j<image.cols;j++)
{
//(i,j)像素的新位置
srcX.at<float>(i,j)=j;//
//原來在第j行的元素,現在根據一個正弦曲線移動
srcY.at<float>(i,j)=i+4*sin(j/10.0);
}
}
//應用映射參數
remap(image, result, srcX, srcY, INTER_LINEAR);
}
int main( )
{
Mat image=imread("/Users/zhangxiaoyu/Desktop/2.png");
if(image.empty())
{
cout<<"Error!cannot be read...../n";
return -1;
}
Mat result;
wave(image, result);
namedWindow("result");
imshow("result", result);
waitKey(0);
}
結果顯示如下:
原始圖片如下所示: