在之前的操作中,如加入椒盐噪声或是对图像进行锐化操作,都读取和修改了图像的像素值。图像的重映射是通过移动像素修改图像的外观。这个过程不会修改图像值,而是把每个像素的位置重新映射到新的位置。可以用来创建图像特效,或者修正因镜片等原因导致的图像扭曲。
使用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); }结果显示如下:
原始图片如下所示:
新闻热点
疑难解答