图像显示与处理实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图像显示与处理实验报告

班级:信息123班

姓名:杨阳

学号: 201227073

图像显示与处理

一、实验目的

1、掌握BMP文件格式,熟悉各参数和图像数据的存放方式;

2、通过编程实现对图像内容的读取(到内存中);

3、完成图像的显示,掌握设备环境上下文(DC)的使用方式。

4、对图像进行二值化、求边缘、增强等简单处理。

二、实验仪器设备、工具及材料

设备:多媒体计算机。

软件:Visual Studio 6.0及以上版本。

材料:灰度图像,24位真彩色图像(均为非压缩BMP格式)等。

三、实验内容及步骤

1、BMP文件格式

BMP是Bitmap(位图)的简写,是Windows操作系统中的标准图像文件格式。Windows 3.0以前的BMP图文件格式与显示设备有关,称为设备相关位图DDB文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此称为设备无关位图DIB(device-independent bitmap)格式。

BMP文件由4部分组成:位图文件头(BITMAPFILEHEADER)、位图信息头(BITMAPINFOHEADER)、彩色表(RGBQUAD)和图像数据阵列。对应的数据结构定义如下(来自MSDN)。

typedef struct tagBITMAPFILEHEADER {

WORD bfType; // file type, must be BM

DWORD bfSize; // size (bytes) of the bitmap file

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits; // offset (bytes) from this structure to the bitmap bits

} BITMAPFILEHEADER;

typedef struct tagBITMAPINFO {

BITMAPINFOHEADER bmiHeader;

RGBQUAD bmiColors[1];

} BITMAPINFO, *PBITMAPINFO;

typedef struct tagRGBQUAD {

BYTE rgbBlue; BYTE rgbGreen;

BYTE rgbRed; BYTE rgbReserved;

} RGBQUAD;

typedef struct tagBITMAPINFOHEADER

{

DWORD biSize; // bytes required by the structure

LONG biWidth; LONG biHeight;

WORD biPlanes; // number of planes, must be 1

WORD biBitCount; // number of bits-per-pixel

DWORD biCompression; // BI_RGB: uncompressed

DWORD biSizeImage; // size(bytes) of image, set to 0 for BI_RGB

bitmaps

LONG biXPelsPerMeter; // horizontal resolution

LONG biYPelsPerMeter; // vertical resolution

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER;

自然界所有颜色都可由红、绿、蓝(R,G,B)组合而成。R/G/B各自分成256级,这种分级概念称为量化,这样就能表示256×256×256约1600万种颜色,这对于人眼来说已经足够丰富了。对于颜色数远远少于1600万种的彩色图,可以用一个表:表中的每一行记录一种颜色的R、G、B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。这张R、G、B的表,就是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(Look Up Table)。

用R、G、B颜色表示所有的颜色叫做真彩色图(true color)。表示真彩色图时,每个象素直接用R、G、B三个分量字节表示,而不采用调色板技术。真彩色图又叫做24位色图。在Windows下,RGB颜色阵列存储的格式其实BGR。而32位的RGB位图像素数据格式是:蓝色B值、绿色G值、红色R值、透明通道A值。透明通道也称Alpha通道,该值是该像素点的透明属性,取值在0(全透明)到255(不透明)之间。

2、BMP文件加载

加载文件的目的是要得到图片属性及RGB数据,以便将其绘制在DC上。

首先,加载文件头:

BITMAPFILEHEADER header;

file.read((char*)&header,sizeof(header));

然后,加载位图信息头:

BITMAPINFOHEADER infoheader;

file.read((char*)&infoheader,sizeof(infoheader));

这里我们得到了3各重要的图形属性:宽,高,以及每个像素颜色所占用的位数。

接着,要考虑行对齐:

由于Windows在进行行扫描的时候最小的单位为4个字节,所以当图片宽width乘以每个像素的字节数不是4的整数倍时,要在每行的后面补0。需要通过下面的方法计算正确的数据长度:

m_dwBytesPerLine = (((m_pBmpInfoHead->biWidth) + 3) >> 2) << 2; // 灰度

m_dwBytesPerLine = (((m_pBmpInfoHead->biWidth*3) + 3) >> 2) << 2; // 24位真彩

m_iImageDataSize = m_dwBytesPerLine * m_pBmpInfoHead->biHeight;

最后,加载图片数据:

对于24位和32位的位图文件,位图数据的偏移量为

sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

也就是说现在可以直接读取图像数据了。

m_pImageData = new unsigned char[m_iImageDataSize];

file.read((char*) m_pPixelData, m_iImageDataSize );

如果你足够细心,就会发现内存m_pPixelData里的数据的确是BGR格式,可以用个纯蓝色或者是纯红色的图片测试一下。

3、BMP文件显示

下面是一段GDI绘制代码(一般可在OnDraw函数中实现),仅作参考。

对于有调色板的图像:

CPalette * pOldPal = pDC->SelectPalette( m_pPal, 1 );

::SetStretchBltMode( pDC->m_hDC, COLORONCOLOR );

::SetDIBitsToDevice( pDC->m_hDC, 0, 0, m_pBmpInfoHead->biWidth,

m_pBmpInfoHead->biHeight, 0, 0, 0, m_pBmpInfoHead->biHeight,

m_pPixelData, (LPBITMAPINFO)m_pBmpInfoHead, DIB_RGB_COLORS );

相关文档
最新文档