精华内容
下载资源
问答
  • 像素映射

    2021-04-06 22:57:28
    像素映射 1、像素映射 像素映射:将输入图像的像素按照一定规则映射到另外一张图像的对应位置上,形成一张新的图像。 api: 2、代码实现 #include <opencv2/opencv.hpp> #include <iostream> using ...

    像素映射

    1、像素映射

    像素映射:将输入图像的像素按照一定规则映射到另外一张图像的对应位置上,形成一张新的图像。
    在这里插入图片描述
    api:
    在这里插入图片描述

    2、代码实现
    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    
    Mat img,dst, map_x, map_y;
    int index;
    void PicMap(void);
    int main(int argc, char** argv)
    {
    	img = imread("G:/testpic/img.png");
    	if (img.empty())
    	{
    		printf("cannot load the image");
    		return -1;
    	}
    	namedWinodw("input", WINDOW_AUTOSIZE);
    	imshow("input", img);
    
    	map_x.create(img.size(), CV_32FC1);
    	map_y.create(img.size(), CV_32FC1);
    
    	int c = 0;
    	while(true)
    	{
    		c = waitKey(500);
    		if ((char) c == 27)
    		{
    			break;
    		}
    		index = c % 4;
    		PicMap();
    		remap(img, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(127,127,127));
    		imshow("output", dst);
    	}
    
    	waitKey(0);
    	return 0;
    }
    
    void PicMap(void)
    {
    	for (int row = 0; row < img.rows; row++)
    	{
    		for (int col = 0; col < img.cols; col++)
    		{
    			switch (index)
    			{
    			//宽高缩放2倍
    			case 0:
    				if (row > img.rows * 025 && row < img.rows * 0.75 && col > img.cols * 0.25 && col > img.cols * 0.75)
    				{
    					map_x.at<float>(row, col) = 2 * (col - img.cols * 0.25 - 0.5);
    					map_y.at<float>(row, col) = 2 * (row - img.rows * 0.25 - 0.5)
    				}
    				else
    				{
    					map_x.at<float>(row, col) = 0;
    					mao_y.at<float>(row, col) = 0;
    				}
    				break;
    			//x镜像
    			case 1:
    				map_x.at<float>(row, col) = img.cols - col;
    				map_y.at<float>(row, col) = row;
    				break;
    			//y镜像
    			case 2:
    				map_x.at<float>(row, col) = col;
    				map_y.at<float>(row, col) = img.rows - row;
    				break;
    			//xy镜像
    			case 3:
    				map_x.at<float>(row, col) = img.cols - col;
    				mao_y.at<float>(row, col) = img.rows - row;
    				break;
    			}			
    		}
    	}
    }
    

    在这里插入图片描述
    xy缩小2倍:
    在这里插入图片描述
    x镜像:
    在这里插入图片描述
    y镜像:
    在这里插入图片描述
    xy镜像:
    在这里插入图片描述

    展开全文
  • 像素映射是用于通过将分数图像转换为具有更高分辨率的分类图来获得子像素尺度上不同类别的空间分布的技术。 传统的子像素映射算法仅利用低分辨率图像,其信息不足以获取高分辨率土地覆盖图。 子像素映射的准确性...
  • 而后者是何凯明Mask-RCNN的一个变体,它沿用了Mask-RCNN的分割掩码和ROI层实现像素对齐,在RoiAlign上引入一个全卷积网络,对像素进行分类。此外,研究人员还介绍了团队在“修复”被遮挡部位的一些实验,通过引入一...

    DensePose COCO数据集,二是DensePose-RCNN。其中前者是一个包含了超过5万张图像的数据集,它的图像来自COCO,并经工作人员手动标记;而后者是何凯明Mask-RCNN的一个变体,它沿用了Mask-RCNN的分割掩码和ROI层实现像素对齐,在RoiAlign上引入一个全卷积网络,对像素进行分类。此外,研究人员还介绍了团队在“修复”被遮挡部位的一些实验,通过引入一个“教师”网络,DensePose-RCNN能无视服装等遮挡物,成功实现姿态估计和相关动作捕捉。

    DensePose COCO数据集

    优秀的项目始于合格的数据集,研究人员收集了5万张人类图像,并手动在上面构建了超过500万个对应关系。由于要建立的是二维RGB图像到三维立体模型的密集对应,一种传统做法是找到图像上的一个点,然后旋转图像和立体模型来实现精确坐标定位,但这样做效率太过低下。因此他们把标记工作分成两个阶段:先进行宏观的部位分割,再进行具体的对应注释。

    左:第一阶段;右:第二阶段

    如上图所示,在标记工作的第一个阶段,标记者根据语义定义把人体分成各个部位,如头、躯干、上肢、下肢、手、脚等。为了简化UV坐标参数设置,他们把人体的上下肢和躯干的前后部分类比飞机模型,因此即便目标穿了一条大裙子,它也不会在后期出现复杂注释。

    在第二阶段,标记者用了一组大致等距的点对每个部分区域进行采样,并严格对应到3D模型上。同样的,为了简化操作,他们用6个不同角度的二维图像代替旋转,允许标记者选择任意一个图放置对应点。

    这样做的优势是当他们在渲染后的图上任意选择一点后,它的表面坐标也能同时用于显示其在全图中的具体位置,也就是说能反映图像的全局。而由于这些点是以水平/垂直序列呈现的,当转成3D时,它们也不会出现自我交叉的问题,这有助于研究人员更高效地收集复杂特征。

    标记可视化:图像(左)、U坐标(中)、V坐标(右)

    DensePose-RCNN

    有了数据集,之后就是建立一个可以预测密集像素之间对应关系的深层神经网络。研究人员在这里结合了DenseReg的方法与Mask-RCNN的架构,一方面继续以全卷积的方式估计对应关系,另一方面通过卷积的像素对齐来使用掩码提取空间结构。

    DensePose-RCNN与DenseReg类似,通过划分表面来查找密集对应的策略。对于每个像素,它会确定以下两点:

    它属于哪块表面;

    它对应部分的二维校正。

    下图是这一过程的具体图解。

    具体来说,就是他们使用了完全卷积网络(FCN),并像DenseReg一样在这个基础上结合了分类和回归任务。首先,神经网络系统会将像素全部归类为背景,或者几个身体部位中的一个,提供表面坐标的粗略估计。这相当于使用标准交叉熵loss进行训练的标签任务。其次,网络中的回归系统会显示部位中所包含像素的真实坐标。由于人体结构复杂,他们将其分解成多个独立的表面,并用局部的二维坐标系对每个表面进行参数化,以此识别该区域上各个节点的位置。

    虽然FCN十分容易训练,但因为涉及密集像素,如果系统要同时做到确定坐标和分割对象,并保证结果不变形,这不太现实。因此研究人员受Mask-RCNN启发,希望能用ROI为特定目标提取特征。

    DensePose-RCNN架构

    如上图所示,本身Mask-RCNN的RoiAlign前就有一个FCN,研究人员把它换成了我们之前介绍的那个类DenseReg网络,用来提供分类信息,即通过分类回归确定身体部位分类和预测坐标所属部位。可以发现,FCN以下的架构则和Mask-RCNN完全一致。

    在用GTX1080做inference过程中,如果DensePose-RCNN处理的是320x240的图像,它的帧数可以达到25fps;如果是800x1100的图像,帧数也有4—5fps。

    一些实验

    最后,既然要实现姿态估计,遮挡是一个不得不面对的问题。DensePose-RCNN可以直接用标记的点进行监督学习,但是研究人员通过对原本未标记的信号做了一些“修补”处理后,发现新的方法可以取得更好的效果。

    他们的做法很简单,就是采用了一种基于学习的方法,建立一个“教师”网络:一个基于原尺寸和身体部位分割蒙版重建对象真值的完全卷积神经网络(如下图所示)。

    他们用级联策略进一步提高了系统的性能。Mask-RCNN架构允许利用相关任务的信息,如关键点估计和实例分割,再加上级联,这就意味着他么能实现任务协同和多种监督来源的互补。

    源码:https://github.com/facebookresearch/Densepose

    展开全文
  • 像素映射

    2019-04-15 16:15:14
    像素映射就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。 #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using ...

    VS2017&OPENCV4.0
    像素重映射就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <math.h>
    
    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:\\time.jpg");
    	if (!src.data) {
    		printf("could not load image...\n");
    		return -1;
    	}
    	char input_win[] = "input image";
    	namedWindow(input_win, WINDOW_AUTOSIZE);
    	namedWindow(OUTPUT_TITLE, WINDOW_AUTOSIZE);
    	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(300);
    		if ((char)c == 27) {
    			break;
    		}
    		index = c % 4;//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.定义域的遍历性:X中的每个元素x在映射的值域中都有对应对象

    2.对应的唯一性:定义域中的一个元素只能与映射值域中的一个元素对应

    定义域也称为原象集,值域也称为象集。

    图中A到B的为映射,B到A为逆映射。

    常见的映射关系

    单设:对于任意的x_i,有且仅有唯一的y_i=f(x_i),则f为单射。

    满射:对于任意的y_i,存在y_i=f(x) \ \ \ \ \ \ x \in X,则f为满射。

    双射:对于x_i \in X,y_i \in Y,有且仅有y_i = f(x_i),x_i=f^{-1}(y_i),即x_i,y_i一一对应,则f为双射。

    双射既满足单射,也满足满射。

    像素映射

    简单说就是把输入图片中个像素按照一定的规则映射到另外一张图像的对应位置上,形成一张新的图像。

    g(x,y) = f(h(x,y))

    f(x,y)为原图中的像素点,通过映射函数h(x,y)映射到目标图像g(x,y)中。

    如当h(x,y) = (I.cols-x,y),则可以实现图片的左右镜像对称。

    通常像素映射需要建立映射表,建立映射表的方式有两种:

    1.前向映射:即以原图像中的(x,y)为起点,根据映射关系(f_x(x),f_y(y))\rightarrow (x',y')找到目标图像中的坐标,然后将原图像中的像素值搬到目标图像中的对应位置坐标上。

    2.后向映射:即以目标图像中的(x',y')为起点,根据映射关系的逆运算(f'_x(x'),f'_y(y))\rightarrow (x,y)找到原图像中的坐标,然后将原图像中的像素值搬到目标图像中的对应位置坐标上。

    由于像素映射可以必须保证是满射,但是无法保证满足单射,因此采用后向映射更为合理。

    AIP简介

    像素重映射

    因为映射关系是(x_1,y_1)\rightarrow (x_2,y_2),所以可以拆解为两部分来看,即x坐标的映射和y坐标的映射,因此API中的map1是x映射表,map2是y映射表。简单来看真个API的功能可以表示下图,即根据原图与映射表生成新的图像,下图为顺时针旋转九十。

    映射表的尺度大小与原始图像相同,但是只保存x坐标或y坐标信息,所以是单通道的,且坐标在计算时会出现小数的情况,因此opencv要求映射表的数据类型为 CV_32FC1。

    Remap(
    InputArray src,
    OutputArray dst,
    InputArray map1,//x映射表  CV_32FC1
    InputArray map2,//y映射表
    int interpolation,//选择的插值方法,常见的为线性插值,可选双线性插值和立方插值等
    int borderMode,//BORDER_CONSTANT
    const Scalar borderValue, //固定值填充边缘时的颜色
    )

    代码与实践

    #include<opencv.hpp>
    #include<string>
    #include<iostream>
    
    using namespace std;
    using namespace cv;
    
    void update_map(Mat& map_x,Mat& map_y,const Mat& src ,Size size, int flag)
    {
    	map_x.create(size, CV_32FC1); //创建映射表
    	map_y.create(size, CV_32FC1);
    
    	float x_scale = src.cols*1.0/size.width;
    	float y_scale =	src.rows*1.0 / size.height;
    	float x, y;
    
    	flag = flag % 3;
    
        //填充映射表
    	for (int row = 0; row < size.height; row++)
    	{
    		for (int col = 0; col < size.width; col++)
    		{
    			switch (flag)
    			{
    			case 0: //左右翻转
    				x = src.cols - col * x_scale;  // x = X - x'
    				y = row * y_scale;
    				
    				map_x.at<float>(row, col) = x;
    				map_y.at<float>(row, col) = y;
    				break;
    			case 1://上下翻转
    				x = col * x_scale;
    				y = src.rows - row * y_scale;  //y = Y -y'
    
    				map_x.at<float>(row, col) = x;
    				map_y.at<float>(row, col) = y;
    				break;
    
    			case 2://旋转180°
    				x = row *  y_scale * src.cols /src.rows;				//x = y'*(X/Y)
    				y = src.rows -  col * x_scale *src.rows/src.cols;       //y = X-x'/(X/Y)
    
    				map_x.at<float>(row, col) = x;
    				map_y.at<float>(row, col) = y;
    				break;
    
    			default:
    				x = col * x_scale;
    				y = row * y_scale;
    
    				map_x.at<float>(row, col) = x;
    				map_y.at<float>(row, col) = y;
    
    				break;
    			}
    		}
    	}
    
    }
    
    
    int main(int argc,char** argv)
    {
    	Mat src = imread("33.jpg");
    
    	if (!src.data)
    	{
    		printf("打开图像失败!\n");
    		return -1;
    	}
    
    
    	char input_win[] = "input ";
    	char output_win[] = "output";
    	namedWindow(input_win,CV_WINDOW_AUTOSIZE);
    	namedWindow(output_win, CV_WINDOW_AUTOSIZE);
    
    	imshow(input_win, src);
    
    	Mat map_x, map_y,out_img;
    	int flag = 0;
    	while (true)
    	{
    		flag = waitKey(5000);
    		if (flag == 27)
    		{
    			break;
    		}
    		update_map(map_x, map_y, src, Size(300, 400), flag);
    
            //根据映射表完成映射
    		remap(src, out_img, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(255, 255, 255));
    
    		
    		imshow(output_win, out_img);
    	
    	}
    	
    	return 0;
    
    }
    

     

     

    展开全文
  • 像素映射 1 简介 什么是像素映射 简单说就是把输入图像中各个像素按照一定的规则映射到另一张图像的对应位置上去,形成一张新的图像.例如: g(x,y)=f(h(x,y))g(x,y)=f(h(x,y)) g(x,y) = f(h(x,y)) g...
  • 像素映射主要有水平方向映射和竖直方向映射,水平方向map_ j = cols - j,左右两边像素对调,相当于水平镜像。竖直方向map_i = rows - i,上下两边像素对调,相当于竖直镜像。 重映射API函数:remap(src, dst, map...
  • 像素映射就是将输入的图像中的像素的位置按照一定规则放置到另一个位置,这个规则可以自己去创建,用到了opencv中的cv::remap, Remap( InputArraysrc,// 输入图像 OutputArraydst,// 输出图像 InputArray...
  • 什么是映射? eg:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就...顾名思义,就是将输入图像中的像素经过新的映射关系,重新排列得到新的图像。 用数学...
  • 【opencv学习笔记】023之像素映射

    千次阅读 2018-04-17 09:12:13
    一、映射是个什么玩意?映射是个数学术语,指两个元素的集之间元素相互“对应”的关系,为名词。...二、像素映射是个什么玩意?把一个图像中一个位置的像素放置到另一个图片指定位置的过程就是像素重映...
  • 像素映射(cv::remap) 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。 API介绍cv::remap Remap( InputArray src,// 输入图像 OutputArray dst...
  • 一、映射是个什么玩意? 映射是个数学术语,指两个元素的集之间元素相互“对应”的关系,为名词。映射,或者射影,在数学及相关的领域经常等同于函数...重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位...
  • 一,像素映射介绍: 简单的说就是把输入图像中各像素按照一定的规则映射到另一张图像对应的位置上去,形成一张新的图像。 g(x,y)g(x,y)g(x,y) 是重映射之后的图像,h(x,y)h(x,y)h(x,y) 是功能函数,f 是源图像。 ...
  • 使用距离函数的逐像素位移映射

    千次阅读 2006-03-03 17:57:00
    第8章使用距离函数的逐像素位移映射William DonnellyWaterloo大学在本章中,我们将演示distance map,一种在pixel shader中给对象添加小尺度位移映射的技术。我们把位移映射看作一个光线跟踪的问题,从基表面的纹理...
  • 像素映射(镜面成像): 把输入图像中各个像素按照一定的规则到另外一张图像的对应位置上去,形成一张新的图像。 Remap( src, dst, map1,//x映射表 CV_32FC1 map2,//y映射表 int interpolation,//选择的插值...
  • Windows坐标系如下 : 设备坐标系的X、Y轴的方向是固定的,单位也是固定的,X轴向右递增,Y向下递增,设备点(0,0)始终是客户区、窗口区或者屏幕区的左上角 如下图: BMP 取数据:(其中的一种情况,共两种情况) ...
  • 纹理映射

    2016-12-21 22:55:20
    纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。 纹理映射是真实感图像制作的一个重要部分,运用它可以方便地制作出极具真实感的图形而不必花费很多时间考虑物体的表现细节。 然而纹理加载的过程...
  • 像素坐标值与实际坐标值的映射

    千次阅读 2020-01-07 10:15:54
    一、 原版 该程序实现了输入一个像素坐标点,然后计算出该像素点实际位置距离摄像头水平距离和垂直距离,即实现了单目摄像头测距。 适用范围...
  • 1.纹理映射 纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。纹理生成过程实质上是将所定义的
  • 单目测距——像素坐标值与实际坐标值的映射

    万次阅读 多人点赞 2018-09-01 03:51:08
    该程序实现了输入一个像素坐标系,然后计算出该像素点实际位置距离摄像头水平距离和垂直距离,即实现了单目摄像头测距。适用范围:摄像头固定角度,倾斜照射到地面,目前摄像头为无畸变摄像头。 /************...
  • 1. 问题 标注完数据之后,因为数据量太小经常会做一些数据增广,但是经过旋转等操作之后,原先标注的坐标就不再准确,需要重新标注。 2. 解决 通过计算原标注的边界点随图像增广后的映射位置,可以解决重新...x/y为像素...
  • API:   remap( InputArray src,// 输入...InputArray map1,// x 映射表 必须为:CV_16SC2/CV_32FC1/CV_32FC2  InputArray map2,// y 映射表  int interpolation,// 选择的插值方法,常见线性插值INTER_LI...
  • MFC GDI绘图时,设置了MM_ANISOTROPIC映射模式后,如何用像素单位设定CPen的宽度? CPen类的线型是PS_SOLID,笔的宽度是逻辑单位,不好换算,如何才能用像素宽度直接设定画笔的宽度呢?
  • OpenGL之纹理映射(一)

    千次阅读 2014-09-11 19:34:10
    纹理映射,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。 纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的...
  • OpenglES2.0 for Android:纹理映射

    千次阅读 2016-06-11 17:23:57
    纹理映射又叫做纹理贴图,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。就是把一幅图像贴到三维物体的表面上来增强真实感, 可以和光照计算、图像混合等技术结合起来形成许多非常漂亮的效果 (百度百科)...
  • 映射(Cat映射),也称为Arnold映射,由俄国数学家弗拉基米尔·阿诺德(Vladimir Igorevich Arnold)提出,在Arnold授课的时候经常使用猫的图像作为例子,故称为“猫映射”...其中xn,yn表示变换前灰度图中像素的位...
  • 什么是纹理映射(Texture Mapping)

    千次阅读 2011-05-01 23:17:00
    <br />纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。 一张纹理是由一系列的像素组成的(所以叫做texel,翻译为“纹理像素”或“纹理元素”),每个像素基于纹理的宽和高对应一个纹理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,660
精华内容 33,064
关键字:

像素映射