• 20 OpenCV像素重映


    像素重映

    • 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。
      在这里插入图片描述
      在这里插入图片描述
      g(x,y)是重映射之后的图像,h(x,y)是功能函数,f是源图像
      在这里插入图片描述

    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 
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    代码示例

    #include 
    #include 
    #include 
    
    using namespace cv;
    Mat src, dst, map_x, map_y;
    const char* OUTPUT_TITLE = "remap demo";
    int index = 0;
    void update_map(void);
    int main(int argc, char** argv) {
    	src = imread("D:/vcprojects/images/test.png");
    	if (!src.data) {
    		printf("could not load image...\n");
    		return -1;
    	}
    	char input_win[] = "input image";
    	namedWindow(input_win);
    	namedWindow(OUTPUT_TITLE);
    	imshow(input_win, src);
    
    	map_x.create(src.size(), CV_32FC1);
    	map_y.create(src.size(), CV_32FC1);
    
    	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(OUTPUT_TITLE, dst);
    	}
    
    	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.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));
    					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:
    				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;
    			}
    
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
  • 相关阅读:
    产品测试方案:视频接入平台并发性能测试方案和报告(即150路视频并发流媒体服务器模块的性能测试方案和报告)
    React基础之Context
    人工智能与智能系统3-> 机器人学3 | 移动机器人平台
    element表格实现单选框
    uniapp 结构
    汇集YOLO系列经典和前沿算法,实现高精度实时检测!
    前端知识案例学习1-css实现滚动贴合
    Antd React UMI 配置优化 - 优化打包体积,提高打包速度
    安装JDK8绿色版
    【CSS】全局声明引入自定义字体
  • 原文地址:https://blog.csdn.net/weixin_45672157/article/details/136751686