像素重映射:
简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。
API:
代码展示:
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int mode = 0;
void Remap_demo(int, void*);
void updateMap(int index);
Mat src,map_x, map_y, dst;
int main()
{
src = imread("F:\\visual studio\\Image\\women2.jpg");
if (src.empty())
{
cout << "Can't load the image" << endl;
return -1;
}
imshow("src", src);
map_x.create(src.size(), CV_32FC1);
map_y.create(src.size(), CV_32FC1);
namedWindow("dst", WINDOW_AUTOSIZE);
createTrackbar("mode", "dst", &mode, 3, Remap_demo);
Remap_demo(mode, 0);
waitKey(0);
}
void Remap_demo(int pos, void* userdata)
{
updateMap(pos);
remap(src, dst, map_x, map_y, INTER_LINEAR,0, 0);
imshow("dst", dst);
}
void updateMap(int index)
{
for (int row = 0; row < src.rows; row++)
{
for (int col = 0; col < src.cols; col++)
{
switch (index)
{
case 0:
//将图片缩小
if (col > (src.cols*0.25) && col<=(src.cols*0.75) && row> (src.rows*0.25) && row <= (src.rows*0.75))
{
map_x.at<float>(row, col) = 2 * (col - src.cols*0.25 ) -1;
map_y.at<float>(row, col) = 2 * (row - src.rows*0.25 ) -1;
}
else
{
//其余部分的像素等于源图像(0,0)处的像素
map_x.at<float>(row, col) = 0;
map_y.at<float>(row, col) = 0;
}
break;
case 1:
//左右翻转
map_x.at<float>(row, col) = src.cols - col - 1;
map_y.at<float>(row, col) = row;
break;
case 2:
//上下翻转
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;
}
}
}
}
效果如下: