OpenCV官方文档学习记录(19)
2014-12-17 23:33
549 查看
重映射(remapping)
主要涉及函数 remap
因为重映射函数所做的就是通过相应的矩阵参数,将原图像对应的像素点按照参数表达式重新排列到目标矩阵,所以通过不同的算法的描写可以形成许多操作:
1.保持原样:
结果:
2.图像水平翻转:
结果:
3.垂直翻转
结果:
4.缩小显示
结果:
还有其他的有趣操作,可以自行研究算法自己实现。
以上。
主要涉及函数 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; }
结果:
还有其他的有趣操作,可以自行研究算法自己实现。
以上。
相关文章推荐
- OpenCV官方文档学习记录(1)
- OpenCV官方文档学习记录(6)
- OpenCV官方文档学习记录(18)
- OpenCV官方文档学习记录(2)
- OpenCV官方文档学习记录(14)
- OpenCV官方文档学习记录(20)
- OpenCV官方文档学习记录(16)
- OpenCV官方文档学习记录(4)
- OpenCV官方文档学习记录(12)
- OpenCV官方文档学习记录(8)
- OpenCV官方文档学习记录(5)
- OpenCV官方文档学习记录(10)
- OpenCV官方文档学习记录(11)
- OpenCV官方文档学习记录(17)
- OpenCV官方文档学习记录(15)
- OpenCV官方文档学习记录(9)
- OpenCV官方文档学习记录(7)
- OpenCV官方文档学习记录(3)
- OpenCV官方文档学习记录(13)
- OpenCV基础入门 基于官方文档解读(4)--core模块学习