您的位置:首页 > 运维架构

有关opencv的学习(5)—图像的重映射

2017-03-04 22:14 267 查看
在之前的操作中,如加入椒盐噪声或是对图像进行锐化操作,都读取和修改了图像的像素值。图像的重映射是通过移动像素修改图像的外观。这个过程不会修改图像值,而是把每个像素的位置重新映射到新的位置。可以用来创建图像特效,或者修正因镜片等原因导致的图像扭曲。

使用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);

}


结果显示如下:



原始图片如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: