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

OpenCV官方文档学习记录(19)

2014-12-17 23:33 549 查看
重映射(remapping)

主要涉及函数 remap

因为重映射函数所做的就是通过相应的矩阵参数,将原图像对应的像素点按照参数表达式重新排列到目标矩阵,所以通过不同的算法的描写可以形成许多操作:

1.保持原样:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

using namespace std;
using namespace cv;

void showImg(const string &win_name, const Mat &img)
{
namedWindow(win_name, CV_WINDOW_AUTOSIZE);
imshow(win_name, img);
}

int main(void)
{
Mat src = imread("lena.jpg");
if (src.empty())
return -1;
showImg("Src", src);

Mat dst;
Mat map_x;
Mat map_y;
dst.create(src.size(), src.type());//目标图像与原图像大小类型均需相同
map_x.create(src.size(), CV_32FC1);//映射的变换矩阵与原图像大小相同,类型固定
map_y.create(src.size(), CV_32FC1);

for (int i = 0; i < src.rows; ++i)//对每一行
{
for (int j = 0; j < src.rows; ++j)//对每一列
{
/*
因为在map_x保存的是此行的每一行的列变换信息,所以其等于j(列号),标识保持此行上的列信息位置不变
map_y同理;
因此此用用法是图像映射后不变
*/
map_x.at<float>(i, j) = j;//保存每行上的列变换
map_y.at<float>(i, j) = i;//保存对列上的行变换
}
}
remap(src, dst, map_x,map_y,CV_INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));

showImg("dst", dst);
waitKey();
return 0;
}


结果:



2.图像水平翻转:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

using namespace std;
using namespace cv;

void showImg(const string &win_name, const Mat &img)
{
namedWindow(win_name, CV_WINDOW_AUTOSIZE);
imshow(win_name, img);
}

int main(void)
{
Mat src = imread("lena.jpg");
if (src.empty())
return -1;
showImg("Src", src);

Mat dst;
Mat map_x;
Mat map_y;
dst.create(src.size(), src.type());//目标图像与原图像大小类型均需相同
map_x.create(src.size(), CV_32FC1);//映射的变换矩阵与原图像大小相同,类型固定
map_y.create(src.size(), CV_32FC1);

for (int i = 0; i < src.rows; ++i)//对每一行
{
for (int j = 0; j < src.rows; ++j)//对每一列
{
map_x.at<float>(i, j) = src.cols - j;//对于每行的每一列像素都用相应的翻转像素填充--水平翻转
map_y.at<float>(i, j) = i;//保持
}
}
remap(src, dst, map_x,map_y,CV_INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));

showImg("dst", dst);
waitKey();
return 0;
}


结果:



3.垂直翻转

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

using namespace std;
using namespace cv;

void showImg(const string &win_name, const Mat &img)
{
namedWindow(win_name, CV_WINDOW_AUTOSIZE);
imshow(win_name, img);
}

int main(void)
{
Mat src = imread("lena.jpg");
if (src.empty())
return -1;
showImg("Src", src);

Mat dst;
Mat map_x;
Mat map_y;
dst.create(src.size(), src.type());//目标图像与原图像大小类型均需相同
map_x.create(src.size(), CV_32FC1);//映射的变换矩阵与原图像大小相同,类型固定
map_y.create(src.size(), CV_32FC1);

for (int i = 0; i < src.rows; ++i)//对每一行
{
for (int j = 0; j < src.rows; ++j)//对每一列
{
map_x.at<float>(i, j) = j;//保持
map_y.at<float>(i, j) =src.rows - i;//对于每列的每一行像素都用相应的翻转像素填充--垂直翻转
}
}
remap(src, dst, map_x,map_y,CV_INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));

showImg("dst", dst);
waitKey();
return 0;
}


结果:



4.缩小显示

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

using namespace std;
using namespace cv;

void showImg(const string &win_name, const Mat &img)
{
namedWindow(win_name, CV_WINDOW_AUTOSIZE);
imshow(win_name, img);
}

int main(void)
{
Mat src = imread("lena.jpg");
if (src.empty())
return -1;
showImg("Src", src);

Mat dst;
Mat map_x;
Mat map_y;
dst.create(src.size(), src.type());//目标图像与原图像大小类型均需相同
map_x.create(src.size(), CV_32FC1);//映射的变换矩阵与原图像大小相同,类型固定
map_y.create(src.size(), CV_32FC1);

for (int i = 0; i < src.rows; ++i)//对每一行
{
for (int j = 0; j < src.rows; ++j)//对每一列
{
//横竖缩放到原来的一半
if (j > src.cols*0.25 && j < src.cols*0.75 && i > src.rows*0.25 && i < src.rows*0.75)
{
map_x.at<float>(i, j) = 2 * (j - src.cols*0.25) + 0.5;//采样
map_y.at<float>(i, j) = 2 * (i - src.rows*0.25) + 0.5;
}
else
{
map_x.at<float>(i, j) = 0;//被0位置处的元素填充
map_y.at<float>(i, j) = 0;
}
}
}
remap(src, dst, map_x,map_y,CV_INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));

showImg("dst", dst);
waitKey();
return 0;
}


结果:



还有其他的有趣操作,可以自行研究算法自己实现。

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