像素重映射的简单变换知识:
备注:
**1.**在上图a中,缩小一半放在中心可理解为;在一个4X4的矩阵中,只在中间两格区域内填像素,并且,中间部分像素采用隔一个格子取一个像素,既如果原来图片像素坐标取为(1,1)(1,2)(1,3)…dst的像素则变成(1,1)(1,3)(1,5)…(1,2n+1)…。
2.很多网上例程说a后面加0.5或者-1等,我的例程不加也没有影响,应该是和每个人选取的图片大小格式等有关。
相关程序
#include “stdafx.h”
//本节讲述 图像处理之 像素重映射;
#include <opencv2/opencv.hpp>
#include
#include <math.h>
using namespace std;
using namespace cv;
Mat src, dst,map_x,map_y, gray_src;
int index = 0;
void update_map(void);
const char*output_title = “canny双阈值处理”;
char input_title[] = “原图”;
int main(int argc, char**argv)
{
src = imread(“C:/Users/Rubison.DELL/Desktop\杂物/壁纸/小白2.jpg”); //存放自己图像的路径
if (!src.data)
{
printf(“could not load image…\r\n”);
return -1;
}
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
map_x.create(src.size(),CV_32FC1); 代表目标图像的某像素的x坐标
map_y.create(src.size(), CV_32FC1); //代表目标图像的某像素的y坐标
int c = 0;
while (true)
{
c = waitKey(500);
if ((char)c == 27)
{
break;
}
index = c % 4;
update_map();
remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 255));
imshow("结果图", dst);
}
index = c % 4;
update_map();
remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 255));
imshow("结果图", dst);
waitKey(0);
destroyAllWindows();
return 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 (col > src.cols0.25 && col < src.cols0.75 && row > src.rows0.25 && row < src.rows0.75)
{
map_x.at(row, col) = 2 * (col - src.cols0.25) + 0.5;
map_y.at(row, col) = 2 * (row - src.rows0.25) + 0.5;
/* map_x.at(row, col) = 2 * (col - src.cols0.25);
map_y.at(row, col) = 2 * (row - src.rows0.25);*/
}
else
{
map_x.at(row, col) = 0;
map_y.at(row, col) = 0;
}
break;
case 1:
map_x.at(row, col) = src.cols-col-1;
map_y.at(row, col) = row;
break;
case 2:
map_x.at(row, col) = col;
map_y.at(row, col) = src.rows - row - 1;
break;
case 3:
map_x.at(row, col) = src.cols - col - 1;
map_y.at(row, col) = src.rows - row - 1;
break;
}
}
}
}
结果验证