| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> 多媒体实验 Visual Studio 图像显示与处理 对图像进行二值化、求边缘、增强等处理 -> 正文阅读 |
|
[开发工具]多媒体实验 Visual Studio 图像显示与处理 对图像进行二值化、求边缘、增强等处理 |
具体代码,图像处理结果,报告,请访问: 多媒体实验VisualStudio图像显示与处理对图像进行二值化、求边缘、增强等处理.zip-讲义文档类资源-CSDN文库 一、实验目的 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 ); pDC->SelectPalette( pOldPal, 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 ); 更多关于BMP文件的细节,请参考:BMP格式_百度百科。 4、图像处理 此处,我们仅对灰度图像进行简单的处理,可以在二值化、求边缘和图像增强之中选择一到两个进行尝试。 二值化: 设定一个阈值(比如128),逐一检查每个像素的值,大于等于这个值的像素被设为255,小于这个阈值的像素被设为0。就会出现一个二值化的结果。 求边缘: 简单的求边缘算法是对图像中每个像素(最边缘的像素可不考虑)进行二维卷积运算,可以采用Sobel算子进行尝试。Sobel算子有两个,分别可以计算水平方向和垂直方向的边缘强度,通过综合而这可以得到整体边缘强度。
图像增强: 图像像素灰度一般会集中在某个区域,导致视觉分辨率低下。为此,可以考虑对该段区域进行拉伸。比如,按照如下曲线(或折线)的映射关系,类似于非均匀采样,将某段的量化精度提高。 ? 四、实验内容和步骤 1、实现对BMP文件的读取,至少要实现8位、24位两种情况。 2、实现图像的显示,至少要实现8位、24位两种情况。 3、对于8位灰度图像,进行简单的图像处理,得到对应的结果。 五、实验截图 1.实现BMP文件的读取。如下图二是对8位BMP文件的读取以及显示。图三是对24位BMP文件的读取以及显示。 图二 8位BMP文件的读取以及显示 ? 图三 24位BMP文件的读取以及显示 2.对于8位灰度图像,进行二值化和图像增强得到的结果如图四和图五。 ? 图四 二值化后的8位灰度图像 ?图五 图像增强后的8位灰度图像 ? 六、思考题
1.BMP文件格式,又称为Bitmap (位图)或是DIB(Device-Independent Device, 设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。BMP文件的数据按照从文件头开始的先后顺序分为四个部分:①bmp文件头(bmp file header): 提供文件的格式、大小等信息。②位图信息头(bitmap information): 提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息。③调色板(color palette): 可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表。④位图数据(bitmap data): 就是图像数据。 2.
3.
4.在图像处理中,灰度线性变换算法需要首先将图像数据备份,然后才好进行处理,因为数据存储方式不同。 七、实验总结 ............具体报告内容请访问: 多媒体实验VisualStudio图像显示与处理对图像进行二值化、求边缘、增强等处理.zip-讲义文档类资源-CSDN文库 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/23 21:28:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |