opencv学习笔记十六:像素重映射

像素重映射主要有水平方向映射和竖直方向映射,水平方向map_ j = cols - j,左右两边像素对调,相当于水平镜像。竖直方向map_i = rows - i,上下两边像素对调,相当于竖直镜像。

重映射API函数:remap(src, dst, map_x, map_y, INTER_LINEAR, 0, Scalar(0, 255, 255));

参数解释:原图像,目标图像,x方向映射表,y方向映射表,插值方法,边界填充方法,颜色。

#include<opencv2/opencv.hpp>
using namespace cv;

void update_map(void);
Mat src, dst, map_x, map_y;
int index;
int main(int arc, char** argv)
{

	src = imread("1.png");
	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src);

	map_x.create(src.size(), CV_32FC1);
	map_y.create(src.size(), CV_32FC1);
	while (true) {		
		int c = waitKey(500);
		if ((char)c == 27) { break; }
		index = c % 3;
		update_map();
		remap(src, dst, map_x, map_y, INTER_LINEAR, 0, Scalar(0, 255, 255));
		imshow("output", dst);
	}	
	waitKey(0);
	return 0;
}

void update_map(void) {
	for(int i=0;i<src.rows;i++)
		for (int j = 0; j < src.cols; j++) {
			switch (index) {
			case 0:
				map_x.at<float>(i, j) = src.cols - j;
				map_y.at<float>(i, j) = i;
				break;
			case 1:
				map_x.at<float>(i, j) = j;
				map_y.at<float>(i, j) = src.rows - i;
				break;
			case 2:
				map_x.at<float>(i, j) = src.cols - j;
				map_y.at<float>(i, j) = src.rows - i;
				break;
			}
			
		}
}

按0时即水平翻转,运行结果如下:

按1时即竖直翻转,运行结果如下:

按2时即水平竖直翻转,运行结果如下: 

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82494997
今日推荐