• 图像行宽四字节对齐

    2018-03-28 15:54:12
    图像四字节对齐是如果图像宽不是4的倍数,那么opencv(其实大部分其他库也一样)会对每行数据进行填充(为了加快存储和读取,计算机读取数据以4字节为单位),使其填充为4的倍数,所以在获取每行图像首地址时的偏移量是...

    知识要点:图像行宽四字节对齐。
    背景:以前都是使用opencv的Mat类型进行图像数据的操作,后面碰到函数对图像数据的输入类型为BYTE*,碰到图像复原显示后出现图像的扭曲或者重影。图像四字节对齐是如果图像宽不是4的倍数,那么opencv(其实大部分其他库也一样)会对每行数据进行填充(为了加快存储和读取,计算机读取数据以4字节为单位),使其填充为4的倍数,所以在获取每行图像首地址时的偏移量是widthstep(一定是4的倍数)而不一定是width(当width是4的倍数时,widthstep=width)。例如,
    3*3的未填充图像
    1  2  3
    4  5  6
    7  8  9 

    那么填充后为
    1  2  3  @
    4  5  6  @
    7  8  9  @

    如果将3*3的未填充图像放到存储空间中为1  2  3  4  5  6  7  8  9

    填充后的图像为1  2  3  @  4  5  6  @  7  8  9  @
        由于在Mat中没有widthstep的成员变量,需要自己计算widthstep。图像为Mat ImgwidthStep计算如下:

               widthStep=(img.cols*img.elemSize()+3)/4*4;
    以下为像素访问的小例子,其功能是从Mat类型的中读取图像数据。并将图像数据保存到BYTE类型的数组中。最后将BYTE数据写入Mat类型中。并进行显示。功能比较简单,其目的主要是弄清楚图像行宽四字节对齐。方便以后读取出BYTE数据后进行处理。
    #include<opencv.hpp>
    #include<iostream>
    using namespace cv;
    using namespace std;
    typedef unsigned char BYTE;
    //获取图像数据,并将获取的图像数据放入新建的图像中。
    int main()
    {
    	Mat img = imread("图像宽度4字节.png");
    
    	BYTE *tSrc;
    	int tSheight = 0, tSwidth = 0, tDheight = 0, tDwidth = 0;
    
    	//测试的源图像高度和宽度
    	tSheight = img.rows;
    	tSwidth = img.cols;
    
    	//测试的目的图像高度和宽度
    	tDheight = tSheight;
    	tDwidth = tSwidth;
    
    	tSrc = new BYTE[tSheight*tSwidth * 3];
    
    	//计算行宽
    	int widthStep = (img.cols*img.elemSize() + 3) / 4 * 4;
    
    
    	//获取图像数据
    	for (int i = 0; i < tSheight; i++)
    	{
    		for (int j = 0; j < tSwidth; j++)
    		{
    			*(tSrc + i*tSwidth*3 + 3 * j + 0) = *(img.data + i*widthStep + 3 * j + 0);
    			*(tSrc + i*tSwidth*3 + 3 * j + 1) = *(img.data + i*widthStep + 3 * j + 1);
    			*(tSrc + i*tSwidth*3 + 3 * j + 2) = *(img.data + i*widthStep + 3 * j + 2);
    
    		}
    	}
    
    	//恢复原始图像并显示
    	Mat outimg = Mat(tDheight, tDwidth, CV_8UC3);
    
    
    	for (int i = 0; i < tDheight; i++)
    	{
    		for (int j = 0; j < tDwidth; j++)
    		{
    
    			*(outimg.data + i*widthStep + j * 3 + 0) = tSrc[i*tDwidth*3 + j * 3 + 0];
    			*(outimg.data + i*widthStep + j * 3 + 1) = tSrc[i*tDwidth*3 + j * 3 + 1];
    			*(outimg.data + i*widthStep + j * 3 + 2) = tSrc[i*tDwidth*3 + j * 3 + 2];
    
    		}
    	}
    
    
    
    	imshow("原始图像", img);
    
    	imshow("恢复的原始图像", outimg);
    
    	waitKey(0);
    
    	return 0;
    }
    


    效果图:

    怕忘记,将其记录之。

    展开全文
  • 图像配准是数字图像处理的一种重要应用,用于对齐两幅或多幅相同场景的图片。图像配准需要输入图像与参考图像。输入图像是我们希望变换的图像,参考图像是想要配准输入图像的图像。如:图像配准的主要方法是使用约束...

    图像配准是数字图像处理的一种重要应用,用于对齐两幅或多幅相同场景的图片。

    图像配准需要输入图像与参考图像。输入图像是我们希望变换的图像,参考图像是想要配准输入图像的图像。如:

    图像配准的主要方法是使用约束点,输入图像产生输出图形的特定变换通常是不知道,所以需要估计变换函数,而估计变换函数问题是建模问题之一。

    基于双线性近似的简单模型:

    x = c1v + c2w + c3vw + c4;

    y = c5v + c6w + c7vw + c8;

    (v,  w)和(x, y)分别是输入图像和参考图像中约束点的坐标。如果在两幅图像中有四对相应的约束点,则可以解出8个未知参数。这样构成简单模型,从而可以把一幅图像的像素变换为另一幅图像的像素位置。

    当然可以选择更复杂的模型,如最小均方算法等。

    图像配准示例代码:

    1、读入参考图像和要配准的输入图像

    I_base = imread('D:\图像处理\image\lena1.jpg');
    I_in = imrotate(I_base,30);
    subplot(121)
    imshow(I_base(:,:,1))
    title('参考图片')
    subplot(122)
    imshow(I_in(:,:,1))
    title('输入图片')

    结果:

     

    2、标准基准点对,将其保存至工作空间。

    利用matlab提供的cpselect函数可以交互式地选择基准点。在命令行中按照以下方式调用cpselect启动交互工具

    >>  cpselect(I_in(:,:,1),I_base(:,:,1));

    在该control point select窗口中,点击tool里面的add point一项进行手工标注点(交互式标点),然后在file菜单里export  points to workspace 即可输出表定点的坐标位置。

    注意:调用cpselect()函数要将需要配准的图像作为第一参数,将基准图像作为后一个参数。并且cpselect只接受灰度图像,如果需要处理RGB彩色图像,可以只给CPselect函数传递一个图像的层。

    根据之前得到的控制点对坐标,利用cp2tform函数可以计算变换的参数。将基准点对作为输入传递给cp2tform,选择一种适当的变换类型,cp2tform函数就能确定该类型变换所需的参数,实际上相当于一种数据拟合。cp2tform函数寻找能够拟合控制点对的变换参数,返回一个TFORM的结构的几何变换结构,其中包括几何变换的类型和参数

    tform = cp2tform(movingPoints1,fixedPoints1,'affine');
    I_out = imtransform(I_in,tform);
    figure
    subplot(121)
    imshow(I_base);
    title('参考图像');
    subplot(122)
    imshow(I_out);
    title('输出图像');

    最终结果:

     

    转载于:http://www.cnblogs.com/MrZheng9511/p/register.html

    http://blog.csdn.net/vicie414/article/details/41577241


    展开全文
  • bitmap文件存储时,在raw data数据部分,要求每一行对齐4字节。 例如,一副bitmap图片,宽度是13,即每行有效像素为50个,按照RGB24格式存储,在bitmap文件的raw data部分,会从图像的左下角开始逐行遍历整幅...

    bitmap文件存储时,在raw data数据部分,要求每一行对齐到4字节。

    例如,一副bitmap图片,宽度是13,即每行有效像素为50个,按照RGB24格式存储,在bitmap文件的raw data部分,会从图像的左下角开始逐行遍历整幅图片。但是注意,每一行在bitmap文件中占用的存储空间并不一定就是每行有效像素的个数乘以3,比如按照这里举的例子,每行13个有效像素,13*3*8=312,不是32(4字节*8=32bit)的倍数。为了在bit级别凑成32的倍数(即所谓的4字节对齐),最少要扩展到320bit,即40字节。


    【对齐公式】

    four_bytes_aligned = (original_bits + 31) / 32 * 4

    C语言实现如下:

    [cpp] view plain copy
    1. #include <iostream>  
    2.   
    3. using namespace std;  
    4.   
    5. #define FOUR_BYTES_ALIGN(width_in_bit)  ((((width_in_bit)+31)>>5)<<2)  
    6.   
    7. int main(int argc, char * argv[]) {  
    8.     int width = 13;  
    9.     int width_byte_aligned = FOUR_BYTES_ALIGN(width * 24);  
    10.     cout << width_byte_aligned << endl;  
    11.   
    12.     return 0;  
    13. }  
    执行结果:40
    展开全文
  • 图像配准(对齐

    2019-07-18 15:47:55
    提取两幅图像各自的特征点,对两幅图像的特征点集进行匹配,得到最优匹配, 再利用仿射变换/透视变换等优化两幅图像之间的对应关系,从而求得变换参数,最终可利用最优化参数,将其中一幅图像变形为与另外一幅图像...

    对齐过程描述如下:
    提取两幅图像各自的特征点,对两幅图像的特征点集进行匹配,得到最优匹配, 再利用仿射变换/透视变换等优化两幅图像之间的对应关系,从而求得变换参数,最终可利用最优化参数,将其中一幅图像变形为与另外一幅图像同样的空间布局,从而可实现诸如:多张图像融合/超分辨率放大/图像拼接/目标识别等目的。
    具体流程如下:
    step 1: 特征点提取
    在这里插入图片描述
    step 2: 特征点集的匹配
    step 3: 利用最优匹配参数变形图像
    在这里插入图片描述
    step 4: 图像配准(对齐)后实现图像拼接
    在这里插入图片描述
    另一种对齐
    是将图像与想要对齐的图像(参考图像)进行对齐,如下图所示:
    在这里插入图片描述
    其中,I表示输入图像(要对齐的图像),T表示参考图像(想要对齐的图像或者说输入图像经过对齐操作之后想要达到的图像)。

    关于人脸对齐
    人脸特征点检测的结果如下:
    在这里插入图片描述
    人脸对齐的效果如下,可以看到右边的脸已经和左边的脸形状大体一致:
    在这里插入图片描述
    在这里插入图片描述

    参考
    http://blog.sina.com.cn/s/blog_c190cb710102vsr4.html

    展开全文
  • #define FOUR_BYTES_ALIGN(width_in_bit) ((((width_in_bit)+31)>>5)) int width = 13; int width_byte_aligned = FOUR_BYTES_ALIGN(width * 24);
    #define FOUR_BYTES_ALIGN(width_in_bit)  ((((width_in_bit)+31)>>5)<<2)  
     
    int width = 13;  
    int width_byte_aligned = FOUR_BYTES_ALIGN(width * 24);  
    

    展开全文
  • 概述 本文主要内容来自参考资料《mage Alignment ...这里用到的技术被称为基于特征的图像对齐,因为在这种技术中,要在一个图像中检测到一组特征点,并与另一张图像中的特征点相匹配。然后根据这些匹配的特征...
  • 每天一分钟,带你读遍机器人顶级会议文章 标题:Online Robust Image Alignment via Subspace Learning from Gradient Orientations 作者:Qingqing Zheng, Yi Wang , and Pheng Ann Heng 来源:International ...
  • 本次实验的目的是利用图像处理技术,基于数字化存储的玻璃底板图像自动生成尽量非虚化的彩色图像。为完成本次实验,你需要从原始图像文件中分割提取三个彩色通道图像,将它们对齐并彼此叠加在一起,最终形成一张RGB...
  • 1.1 什么是图像对齐图像对准? 1.2 图像对齐的应用 1.3 图像对齐基础理论 1.4 如何找到对应点 2 OpenCV的图像对齐 2.1 基于特征的图像对齐的步骤 2.2 代码 3 参考 在这篇文章中,我们将学习如何使用OpenCV...
  • 2.5 IPP图像处理编程基础 在图像处理方面,Inte IPP库提供了较为全面的支持,因此,熟悉IPP中关于图像处理中的函数的功能是调用IPP进行图像处理的基础。因此,我们特别用一节来具体介绍Intel® IPP中的图像处理...
  • 图像处理系统设计注意点:1.将算法开发和FPGA实现分离用软件的图像处理环境可以使用大批量的图像样本进行测试及调试算法,再将算法映射到硬件上,这样大大节省了硬件调试周期。2.算法的精度图像处理的算法中,大部分...
  • 最近用C写了个关于BMP文件图像处理的简单程序,结果算法写了不用1个小时搞定,而次要的文件输入输出搞了我半天才搞定。 主要问题有两点: 第一,在读取BMP文件的文件头信息放入结构体时,发现中间会漏了2个...
  • 图像处理总结概念

    2018-05-08 13:29:41
    1.直方图:一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征。图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。图像的灰度直方图是灰度级...
  • WPF的图像处理

    2012-07-06 15:52:09
    本主题介绍 WPF 图像处理。通过 Microsoft Windows Presentation Foundation 图像处理组件,开发人员可以显示、转换和格式化图像。 WPF 图像处理组件 WPF 图像处理使得 Microsoft Windows 内的图像处理功能得到了...
  • 位图4字节对齐问题

    2014-06-04 20:49:54
    在自己对图像数据进行处理的时候,会有字节对其的问题,
  • 本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片空间几何变换,包括图像平移、图形旋转、图像反转倒置镜像和图像...
  • 本文试图总结它们的特点,方便研究人员根据自己的研究目的、图像类型和系统配置,选择合适的生物图像处理软件。 1. 胞体分割(cell segmentation) 胞体识别是生物图像分析中很重要的一步。通常,用于胞体分割的...
  • 数字图像处理(MATLAB)(第二版) 冈萨雷斯 主要用来记录自己的学习过程,相关实验内容,便于日后查找相关知识点及复习所用 第二章 灰度变换和空间滤波 本章重点讨论两类空间域处理方法:亮度(或灰度)变换与...
1 2 3 4 5 ... 20
收藏数 38,453
精华内容 15,381