opencv中像素重映射操作(remap函数的使用)
程序员文章站
2023-12-23 20:45:09
...
像素重映射:
简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。
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 // color
)
例程:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
Mat src, dst,map_x,map_y;
int index =0;
void update_map(void){
for(int row = 0; row < src.rows; row++)
{
for (int col = 0; col < src.cols; col++)
{
switch (index)
{
case 0/*缩小一半*/:
if(row >= src.rows*0.25 && row <= src.cols*0.75 && col >= src.cols*0.25 && col <= src.cols*0.75){
map_x.at<float>(row,col) = 2*(col-(src.cols*0.25));
map_y.at<float>(row,col) = 2*(row-(src.rows*0.25));
}
else
{
map_x.at<float>(row,col) = 0;
map_y.at<float>(row,col) = 0;
}
break;
case 1 /*x方向镜像*/:
map_x.at<float>(row,col) = src.cols-col-1;
map_y.at<float>(row,col) = row;
break;
case 2 /*y方向镜像*/:
map_x.at<float>(row,col) = col;
map_y.at<float>(row,col) = src.rows-row-1;
break;
case 3 /*中心对称*/:
map_x.at<float>(row,col) = src.cols-col-1;
map_y.at<float>(row,col) = src.rows-row-1;
break;
}
}
}
}
int main(int argc, char** argv) {
src = imread("C:\\Users\\Administrator\\Pictures\\as.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
map_x.create(src.size(),CV_32FC1);//32位1通道
map_y.create(src.size(),CV_32FC1);//32位1通道
while(true){
int c = waitKey(500);
if((char)c == 27)//ESC键
{
break;
}
index = c % 4;
update_map();
/*remap(
InputArray src,// 输入图像
OutputArray dst,// 输出图像
InputArray map1,// x 映射表 CV_32FC1/CV_32FC2
InputArray map2,// y 映射表
int interpolation,// 选择的插值方法,常见线性插值,可选择立方等
int borderMode,// BORDER_CONSTANT确定的
const Scalar borderValue// color
)
*/
remap(src,dst,map_x,map_y,INTER_LINEAR,BORDER_REFLECT);
imshow("remap image",dst);
}
return 0;
}
效果:
1.缩小一半
2.x方向对称
3.y方向对称
4.中心对称