具体代码,图像处理结果,报告,请访问:

多媒体实验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

0

1

-2

0(中心)

2

-1

0

1

-1

-2

-1

0

0(中心)

0

1

2

1

图像增强

图像像素灰度一般会集中在某个区域,导致视觉分辨率低下。为此,可以考虑对该段区域进行拉伸。比如,按照如下曲线(或折线)的映射关系,类似于非均匀采样,将某段的量化精度提高。

四、实验内容和步骤

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文件中有哪些重要的参数,分别表示什么意义?
  2. 你还熟悉哪些图像文件格式,它们各有何特点?
  3. 谈谈你所了解到的图像处理都有哪些具体应用。
  4. 在图像处理中,哪种算法需要首先将图像数据备份,然后才好进行处理?为什么?

1.BMP文件格式,又称为Bitmap (位图)或是DIB(Device-Independent Device, 设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。BMP文件的数据按照从文件头开始的先后顺序分为四个部分:①bmp文件头(bmp file header): 提供文件的格式、大小等信息。②位图信息头(bitmap information): 提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息。③调色板(color palette): 可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表。④位图数据(bitmap data): 就是图像数据。

2.

  • GIF格式:该图形格式却在Internet上被广泛地应用,原因主要是256种颜色已经较能满足主页图形需要,而且文件较小,适合网络环境传输和使用。
  • JPEG格式:可以用不同的压缩比例对这种文件压缩,其压缩技术十分先进,对图像质量影响不大,因此可以用最少的磁盘空间得到较好的图像质量。由于它优异的性能,所以应用非常广泛,而在Internet. 上,它更是主流图形格式。
  • PCX格式:PCX格式是ZSOFT公司在开发图像处理软件Paintbrush时开发的一-种格式,存储格式从1位到24位,它是经过压缩的格式,占用磁盘空间较少。由于该格式出现的时间较长,并且具有压缩及全彩色的能力,所以PCX 格式现在仍是十分流行。
  • PSD格式(Photoshop 格式):Adobe公司开发的图像处理软件Photoshop中自建的标准文件格式就是PSD格式,在该软件所支持的各种格式中,PSD 格式存取速度比其它格式快很多,功能也很强大。由于Photoshop软件越来越广泛地应用,所以这个格式也逐步流行起来。PSD格式是Photoshop的专用格式,里面可以存放图层、通道、遮罩等多种设计草稿。

3.

  • 通信工程方面:当前通信的主要发展方向是声音、文字、图像和数据结合的多媒体通信。具体地讲是将电话、电视和计算机以三网合- - -的方式在数字通信网上传输。其中以图像通信最为复杂和困难,因图像的数据量十分巨大,如传送彩色电视信号的速率达100Mbit/s以上。要将这样高速率的数据实时传送出去,必须采用编码技术来压缩信息的比特量。在- -定意义上讲,编码压缩是这些技术成败的关键。除了已应用较广泛的熵编码、DPCM编码、变换编码外,目前国内外正在大力开发研究新的编码方法,如分行编码、自适应网络编码、小波变换图像压缩编码等
  • 文化艺术方面:目前这类应用有电视画面的数字编辑,动画的制作,电子图像游戏,纺织工艺品设计,服装设计与制作,发型设计,文物资料照片的复制和修复,运动员动作分析和评分等等,现在已逐渐形成- -门新的艺术--计算机美术。
  • 生物医学工程方面:数字图像处理在生物医学工程方面的应用十分广泛,而且很有成效。除了上面介绍的CT技术之外,还有一-类是对医用显微图像的处理分析,如红细胞、白细胞分类,染色体分析,癌细胞识别等。此外,在X光肺部图像增晰、超声波图像处理、心电图分析、立体定向放射治疗等医学诊断方面都广泛地应用图像处理技术。

4.在图像处理中,灰度线性变换算法需要首先将图像数据备份,然后才好进行处理,因为数据存储方式不同。

七、实验总结

............具体报告内容请访问:

多媒体实验VisualStudio图像显示与处理对图像进行二值化、求边缘、增强等处理.zip-讲义文档类资源-CSDN文库

多媒体实验 Visual Studio 图像显示与处理 对图像进行二值化、求边缘、增强等处理相关推荐

  1. 2020-2021学年——图像图形编程实践实验1_图像二值化

    图像二值化 实验目的 1.熟练掌握在MATLAB中如何读取图像. 2.掌握如何利用MATLAB来获取图像的大小.颜色.高度.宽度等等相关信息. 3.掌握如何在MATLAB中按照指定要求存储一幅图像的方 ...

  2. input自适应_【正点原子FPGA连载】第十一章基于OV5640的自适应二值化实验-领航者ZYNQ之HLS 开发指南...

    1)摘自[正点原子]领航者ZYNQ之HLS 开发指南 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手 ...

  3. linux 正点原子ov5640_【正点原子FPGA连载】第二十六章基于OV5640的二值化实验-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...

    本帖最后由 正点原子 于 2020-10-26 16:21 编辑 QQ群头像.png (1.78 KB) 2020-10-24 10:50 上传5)关注正点原子公众号,获取最新资料 100846rel ...

  4. 还在纠结通道数、位深度?实验带你看懂关于灰度图像,二值化图像,彩色图像、图片通道数,位深度的全部内容

    数据加载相关 前言 图片的通道数.位深度 单通道 三通道 四通道 通道数之间的转化 二值化图像 小结 灰度图像 小结 pillow库 相关全部代码 前言 首先我们都知道,图像是由一个个像素点组成的.图 ...

  5. visual studio内置“iis”组件提取及二次开发

    简介 visual studio安装后会自带小型的"iis"服务器,本文就简单提取一下这个组件,自己做一个小型"iis"服务器吧. 先来说用途吧(废话可绕过), ...

  6. win10下Visual Studio 2012 update4、AutoCAD 2016和二次开发插件ObjectARX2016环境安装及配置

    1.参考博友的记录 https://blog.csdn.net/selenitic_g/article/details/94724474 2.我的sdk 路径是C:\ObjectARX 2016 默认 ...

  7. matlab 二值化_MATLAB实验,图像二值化处理

    防止迷路,记得关注点赞哦.下期见~~ 1.读入一幅彩色图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口来分别显示RGB图像和灰度图像,注上文字标题. I=imread('001.jpg' ...

  8. 图像处理 基于Visual C++编程 学习笔记 (3)显示灰度图像和二值化图像

    灰度图imggray 有了上面的基础,灰度图就相当简单了 彩色图转灰度方法: 1.浮点算法:Gray=R*0.3+G*0.59+B*0.11  2.整数方法:Gray=(R*30+G*59+B*11) ...

  9. 使用Visual Studio+OpenCV进行的Susan算子边缘检测及数米粒图像处理实验

    一.实验内容 用计算机视觉的方法数米粒. 二.实验目的及意义 计算机视觉的应用非常广泛,本实验就是让同学们对计算机视觉技术的应用有一个简单的了解. 1.了解计算机视觉的实验环境.本实验选用的是 VS+ ...

最新文章

  1. C++中类和结构体的区别
  2. Centos7完全分布式搭建Hadoop2.7.3
  3. 32 bit 与 64 bit 程序(2)比较
  4. 敏捷软件开发宣言–Manifesto for Agile Software Development
  5. TensorFlow深度学习应用开发实战(深度学习简介和开发环境搭建)
  6. vc++中进程通信之剪贴板常用函数
  7. LLVM之clang
  8. 姓氏头像制作小程序源码_全新UI带头像库_支持多流量主模式
  9. 矩形碰撞公式,以前还做j2me时就用到的公式,为了方便查找,这里记一下
  10. 数据库基础技巧及用法
  11. RAID磁盘列阵介绍
  12. 怎样下载ImageNet数据集并使用?
  13. Office三件套批量转PDF以及PDF书签读写与加水印
  14. 什么蓝牙耳机性价比高?四款高性价比蓝牙耳机推荐
  15. Cadence OrCAD Capture 查找功能详细介绍
  16. android中JNI知识(很全)
  17. 【JAVA】(实训1)EL表达式编码问题
  18. bitmap内存溢出
  19. PyTorch学习笔记:nn.Sigmoid——Sigmoid激活函数
  20. C++之string类型详解

热门文章

  1. java版我的世界怎么看坐标_我的世界坐标怎么开?
  2. 星网宇达利用NTRIPClient连接千寻服务器获取差分定位数据
  3. 数学分析(6): 微分
  4. Windows下的Autorun程序
  5. java i= 0001_Java I/O 好复杂,傻傻分不清楚,别担心,我们有线索了。。。
  6. vnc启动失败时候的解决方案
  7. 微软CRM锁定9大垂直产业
  8. “心有多大,肚子就有多大”
  9. 软件项目管理-第七章软件项目进度基本概念(1):进度基本知识
  10. vant tabs sticky模式下的bug