OpenCV-图像处理(22、像素重映射(cv::remap))
2019-01-16 19:51
1301 查看
版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/86513649
像素重映射(cv::remap)
- 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。
API介绍cv::remap
Remap(
InputArray src,// 输入图像
OutputArray dst,// 输出图像
InputArray map1,// x 映射表 元素值的数据类型需要是CV_32FC1/CV_32FC2
InputArray map2,// y 映射表
int interpolation,// 选择的插值方法,常见线性插值,可选择立方等
int borderMode,// BORDER_CONSTANT
const Scalar borderValue// borderMode设置为BORDER_CONSTANT时才有用,填充INTER_LINEAR插值时没有计算到的像素点
)
- 缩小一半
- Y方向对调(将图像上下颠倒)
- X方向对调(从左到右反射图像)
- XY方向同时对调
程序代码
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; Mat src, dst, map_x, map_y; char* remap_window="Remap demo"; int index=0; void update_map(); int main(int argc,char** argv){ // 1. 加载图片 src=imread("E:/Experiment/OpenCV/Pictures/girl.jpg"); if(!src.data){ printf("Could not load Image ..."); return -1; } namedWindow(remap_window, CV_WINDOW_AUTOSIZE); imshow("input Image",src); // 2. 创建目标图像和两个映射矩阵(对于x和y) map_x.create(src.size(),CV_32FC1); map_y.create(src.size(),CV_32FC1); // 3. 建立一个循环。 每500毫秒我们更新我们的映射矩阵(mat_x和mat_y)并将它们应用于我们的源图像: int c = 0; while (true){ c=waitKey(500); if(c==27)//ESC键 break; index = c % 4; update_map(); //图像映射,x对应像素点列的位置,y对应行的位置,INTER_LINEAR表示线性插值 //假如map_x0第 20000 0个位置的值为1,map_y0第0个位置的值为0,那么映射的dst0 (0,0)位置的像素值为src (0,1)位置的像素值 //只有设置 BORDER_CONSTANT 时,参数 Scalar 才有效,填充插值时未计算到的像素点 remap(src,dst,map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0,255,255)); imshow(remap_window,dst); } //waitKey(0); return 0; } void update_map(){ for (int i = 0; i < src.rows; i++){ for (int j = 0; j < src.cols; j++){ switch (index){ case 0://图像映射,缩小一半,居中显示 if(i>=src.rows*0.25 && i<src.rows*0.75 && j>=src.cols*0.25 && j<src.cols*0.75){ map_x.at<float>(i,j) = 2 * (j - src.cols*0.25);//插值,宽高方向上跳一个像素取一个值 map_y.at<float>(i,j) = 2 * (i - src.rows*0.25); }else{ map_x.at<float>(i, j) = 0;//这里赋值两个0,表示原图(0,0)坐标位置的像素值,而不是表示黑色 map_y.at<float>(i, j) = 0; } break; case 1://左右镜像 map_x.at<float>(i,j)=src.cols - j - 1; map_y.at<float>(i,j)=i; break; case 2://上下镜像 map_x.at<float>(i,j)=j; map_y.at<float>(i,j)=src.rows - i - 1; break; case 3://左右上下都镜像 map_x.at<float>(i,j)=src.cols - j - 1; map_y.at<float>(i,j)=src.rows - i - 1; break; } } } }
运行结果
参考博客
相关文章推荐
- OpenCV图像处理教程C++(十七)) 像素重映射以及漫水填充
- Python-OpenCV 处理图像(三):图像像素点操作
- opencv android 图像处理错误error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(const
- Python-OpenCV 处理图像(三):图像像素点操作
- 图像处理库(fbc_cv):源自OpenCV代码提取
- 图像识别与处理之Opencv——像素值的读写
- opencv图像处理03-像素的读写操作
- Python OpenCV处理图像之图像像素点操作
- OpenCV中读取图像像素值 - [图像处理\OpenCV编程]
- OpenGL使用OpenCV处理图像进行纹理映射的使用范例
- android中opencv操作图片像素----之图像灰度处理
- Python-OpenCV 处理图像(二)(三):滤镜和图像运算 图像像素点操作
- opencv Remap 图像的映射
- 关于MFC中OpenCV图像处理使用cvFindContours引起的中断错误
- 【OpenCV】OpenCV中获取图像的像素点并处理
- 图像处理之其他杂项(三)之cvSnakeImage改进升级兼容 适用于opencv2,,在opencv3.0以上版本中测试通过
- OpenCV 数组存储图片像素值,便于后期图像处理
- vim+python+OpenCV学习三 : 对图像的像素处理
- OpenCV之imgproc 模块. 图像处理(3)霍夫线变换 霍夫圆变换 Remapping 重映射 仿射变换
- openCV图像处理之重映射 4000