图像处理之(24位)BMP旋转以及镜像算法

本文详细介绍了BMP图像格式的基本概念及其组成,包括位图文件头和信息头等。接着,文章深入探讨了如何进行BMP图像的旋转处理,通过坐标变换和双线性插值解决旋转后像素点颜色值的问题。此外,还阐述了镜像处理的理论,以及在实际编码中处理图像的不同步骤。最后展示了45°、60°、90°和180°旋转以及镜像效果。
摘要由CSDN通过智能技术生成
  在图像处理,图形学、计算机视觉中,我们经常能够见到bmp这种格式的图片;那么对于我们来说想要处理这种图片,首先就应当了解这种图片,知己知彼方能百战不殆。
  那么首先我们来了解一下bmp格式的图片:


一、了解BMP

(一)概述
  BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。


(二)格式特性
  了解完BMP的通用性之后,其实我们想要处理BMP格式图片,最关心的还是这个格式的组成是怎样的,有什么特点,怎样处理这个格式的图片。
  因此我们来把重点放在BMP的格式组成上:


  BMP其实是图片格式中最简单的一种,一般来说,典型的BMP图像数据文件由四部分组成:
   1. 位图文件头数据(BITMAPFILEHEADER):这个数据结构包含了BMP图像文件的类型、大小等信息;
typedef struct targetBITMAPFILEHEADER{
    WORD bfType; //文件类型,对于位图来说,这一部分为0x4d42
    DWORD bfSize; //文件大小(包含这14字节)
    WORD bfReserved1; //保留字,不考虑
    WORD bfReserved2; //保留字,同上
    DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 
}BITMAPFILEHEADER;


  2. 位图信息头数据(BITMAPINFOHEADER):这个数据结构则是包含了BMP图像数据的宽、高、压缩方法、定义颜色、占用空间等等信息;
typedef struct targetBITMAPINFOHEADER{
    DWORD   biSize;             //指定此结构体的长度,为40  
    LONG    biWidth;            //位图宽  
    LONG    biHeight;           //位图高  
    WORD    biPlanes;           //平面数,为1  
    WORD    biBitCount;         //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32  
    DWORD   biCompression;      //压缩方式,可以是0,1,2,其中0表示不压缩  
    DWORD   biSizeImage;        //实际位图数据占用的字节数  
    LONG    biXPelsPerMeter;    //X方向分辨率  
    LONG    biYPelsPerMeter;    //Y方向分辨率  
    DWORD   biClrUsed;          //使用的颜色数,如果为0,则表示默认值(2^颜色位数)  
    DWORD   biClrImportant;     //重要颜色数,如果为0,则表示所有颜色都是重要的  
}BITMAPINFOHEADER;


  3.调色板(RGBQUAD):其中,这一部分的数据结构是可选择的,有些为徒需要调色板,有些位图则不需要(比如24位的真彩图就不需要);
typedef struct tagRGBQUAD{
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved;
}RGBQUAD;


  4.位图数据:这部分的内容根据BMP位图使用的位数不同而不同,在24位真彩图中,直接使用RGB,而其他的小于24位的则使用调色板中颜色的索引值。
typedef struct tagIMAGEDATA  
{  
    BYTE blue;  
    BYTE green;  
    BYTE red;  
}IMAGEDATA;




二、旋转BMP的理论准备

  在进行编码之前,我们首先需要知道——旋转BMP需要什么样的准备工作、怎样去做,那么仔细考虑一下其实我们面临的是以下的几个问题:
  1. 首先我们在进行旋转的时候应当注意在旋转前与旋转后的坐标对应关系;
  2.当我们旋转之后,如果旋转之后的像素点并不是很如人意的落在像素点上,而是落在临近的四个像素点构成的正方形区域内(而且这种情况应该是很常见的一种),我们应当怎样确定旋转之后的像素的颜色值;
  3.怎样对图像进行旋转;
  4.旋转之后怎样将整个图片显示出来;




(一)问题一的求解
  那么针对于第一个问题,我们要做的就是进行坐标变换:如以下的图片:

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值