用VC做图像处理

作者&投稿:银单 (若有异议请与网页底部的电邮联系)
在VC++中如何进行图像处理?~

申请个二维或一维数组,把图像亮度值装进去。
比如用:
CBitmap::LoadBitmap
之类的函数,把硬盘中的文件读进数组。
然后做各种图像处理。(二值化,过滤处理之类的)
再显示或存盘。
或者用一些现成的图像处理库。比如收费的(LeadTools),
免费的(OpenCV)之类的。

不管什么图像,都是图像处理,我推荐你买一本北航出的数字图像处理的书籍,那上面有用VC++如何做图像处理的源代码

先对VC做基础性学习,明确VC的数据结构和使用方法,再有针对性的研究VC如何做图像处理,有以下资料可参考(网上多得是)
1. 图像文件的格式;

2. 图像编程的基础-操作调色板;

3. 图像数据的读取、存储和显示、如何获取图像的尺寸等;

4. 利用图像来美化界面;

5. 图像的基本操作:图像移动、图像旋转、图像镜像、图像的缩放、图像的剪切板操作;

6. 图像显示的各种特技效果;

7. 图像的基本处理:图像的二值化、图像的亮度和对比度的调整、图像的边缘增强、如何得到图像的直方图、图像直方图的修正、图像的平滑、图像的锐化等、图像的伪彩色、彩色图像转换为黑白图像、物体边缘的搜索等等;

8. 二值图像的处理:腐蚀、膨胀、细化、距离变换等;

9. 图像分析:直线、圆、特定物体的识别;

10.JEPG、GIF、PCX等格式文件相关操作;

11.图像文件格式的转换;

12.图像的常用变换:付利叶变换、DCT变换、沃尔什变换等;

13.AVI视频流的操作;

图像处理技术博大精深,不仅需要有很强的数学功底,还需要熟练掌握一门计算机语言,在当前流行的语言中,我个人觉的Visual C++这个开发平台是图像开发人员的首选工具。本讲座只是起到抛砖引玉的作用,希望和广大读者共同交流。
VC数字图像处理编程讲座之二

第一节 图像的文件格式

要利用计算机对数字化图像进行处理,首先要对图像的文件格式要有清楚的认识,因为我们前面说过,自然界的图像以模拟信号的形式存在,在用计算机进行处理以前,首先要数字化,比如摄像头(CCD)摄取的信号在送往计算机处理前,一般情况下要经过数模转换,这个任务常常由图像采集卡完成,它的输出一般为裸图的形式;如果用户想要生成目标图像文件,必须根据文件的格式做相应的处理。随着科技的发展,数码像机、数码摄像机已经进入寻常百姓家,我们可以利用这些设备作为图像处理系统的输入设备来为后续的图像处理提供信息源。无论是什么设备,它总是提供按一定的图像文件格式来提供信息,比较常用的有BMP 格式、JPEG格式、GIF格式等等,所以我们在进行图像处理以前,首先要对图像的格式要有清晰的认识,只有在此基础上才可以进行进一步的开发处理。

在讲述图像文件格式前,先对图像作一个简单的分类。除了最简单的图像外,所有的图像都有颜色,而单色图像则是带有颜色的图像中比较简单的格式,它一般由黑色区域和白色区域组成,可以用一个比特表示一个像素,"1"表示黑色,"0"表示白色,当然也可以倒过来表示,这种图像称之为二值图像。我们也可以用8个比特(一个字节)表示一个像素,相当于把黑和白等分为256个级别,"0"表示为黑,"255"表示为白,该字节的数值表示相应像素值的灰度值或亮度值,数值越接近"0",对应像素点越黑,相反,则对应像素点越白,此种图像我们一般称之为灰度图像。单色图像和灰度图像又统称为黑白图像,与之对应存在着彩色图像,这种图像要复杂一些,表示图像时,常用的图像彩色模式有RGB模式、CMYK模式和HIS模式,一般情况下我们只使用RGB模式,R 对应红色,G对应绿色,B对应蓝色,它们统称为三基色,这三中色彩的不同搭配,就可以搭配成各种现实中的色彩,此时彩色图像的每一个像素都需要3个样本组成的一组数据表示,其中每个样本用于表示该像素的一个基本颜色。

对于现存的所有的图像文件格式,我们在这里主要介绍BMP图像文件格式,并且文件里的图像数据是未压缩的,因为图像的数字化处理主要是对图像中的各个像素进行相应的处理,而未压缩的BMP图像中的像素数值正好与实际要处理的数字图像相对应,这种格式的文件最合适我们对之进行数字化处理。请读者记住,压缩过的图像是无法直接进行数字化处理的,如JPEG、GIF等格式的文件,此时首先要对图像文件解压缩,这就要涉及到一些比较复杂的压缩算法。后续章节中我们将针对特殊的文件格式如何转换为BMP格式的文件问题作专门的论述,经过转换,我们就可以利用得到的未压缩的BMP文件格式进行后续处理。对于JPEG、GIF等格式,由于涉及到压缩算法,这要求读者掌握一定的信息论方面的知识,如果展开的话,可以写一本书,限于篇幅原因,我们只作一般性的讲解,有兴趣的朋友可以参考相关书籍资料。

一、BMP文件结构

1. BMP文件组成

BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。文件中的数据块表示图像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要读者朋友关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数。

2. BMP文件头

BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。其结构定义如下:

typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为"BM"
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;该结构占据14个字节。

3. 位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。其结构如下:

typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的平面数不清,必须为1
WORD biBitCount// 每个像素所需的位数,必须是1(双色), 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;该结构占据40个字节。

注意:对于BMP文件格式,在处理单色图像和真彩色图像的时候,无论图象数据多么庞大,都不对图象数据进行任何压缩处理,一般情况下,如果位图采用压缩格式,那么16色图像采用RLE4压缩算法,256色图像采用RLE8压缩算法。

4. 颜色表

颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD {
BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
BYTErgbGreen; // 绿色的亮度(值范围为0-255)
BYTErgbRed; // 红色的亮度(值范围为0-255)
BYTErgbReserved;// 保留,必须为0
} RGBQUAD;

颜色表中RGBQUAD结构数据的个数由BITMAPINFOHEADER 中的biBitCount项来确定,当biBitCount=1,4,8时,分别有2,16,256个颜色表项,当biBitCount=24时,图像为真彩色,图像中每个像素的颜色用三个字节表示,分别对应R、G、B值,图像文件没有颜色表项。位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:

typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;

注意:RGBQUAD数据结构中,增加了一个保留字段rgbReserved,它不代表任何颜色,必须取固定的值为"0",同时, RGBQUAD结构中定义的颜色值中,红色、绿色和蓝色的排列顺序与一般真彩色图像文件的颜色数据排列顺序恰好相反,既:若某个位图中的一个像素点的颜色的描述为"00,00,ff,00",则表示该点为红色,而不是蓝色。

5. 位图数据

位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。这种格式我们又称为Bottom_Up位图,当然与之相对的还有Up_Down形式的位图,它的记录顺序是从上到下的,对于这种形式的位图,也不存在压缩形式。位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当 biBitCount=8时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节,此时图像为真彩色图像。当图像不是为真彩色时,图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,当为真彩色时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别对应R、G、B分量的值,这时候图像文件中没有颜色表。上面我已经讲过了,Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字为单位),不足的以0填充,图像文件中一个扫描行所占的字节数计算方法:

DataSizePerLine= (biWidth* biBitCount+31)/8;// 一个扫描行所占的字节数

位图数据的大小按下式计算(不压缩情况下):

DataSize= DataSizePerLine* biHeight。

上述是BMP文件格式的说明,搞清楚了以上的结构,就可以正确的操作图像文件,对它进行读或写操作了。

。。。。。。

MFC对话框的话可以在CXXXDlg类中添加

MFC 文档类的话,在VIew类中


MATLAB与vc++用作图像处理,那个比较合适?
单单对图象进行处理的话用matlab比较适合,因为操作简单,不用开发用户界面. 如果要做成可以改参数之类的需要用户界面的,那VC++比matlab方便很多,虽然matlab也可以做,但是VC++通用性更强

...图片假定放在D盘picture文件夹内),以备后续的图像处理?
24位位图在VC++中需要三个结构来存储:BITMAPFILEHEADER:文件信息头 LPBITMAPINFOHEADER:位图信息头指针 LPBYTE:像素数据指针 假设你的图片名为:“图片.bmp”。1、你用VC++建立一个MFC(exe)工程,命名为“My”,在弹出的“MFC应用程序向导-步骤1”中选“单文档”,然后点“完成”->“确定”。2、在...

如何用vc++6.0实现数字图像处理
呵呵,刚好我最近做过一个这样的程序,应该可以帮到你。其实没那么难的,和普通的编程差不多,也是建立一个MFC工程即 文件--新建--MFCAppWizard(exe),第一步的时候选择多文档;还有有个地方要注意,因为一般要处理的图像可能比较大,所以在最后一步,你在选择view的种类时最好选择CScorllView。然后...

vc 数字图像处理高手请进!
需要一点图像处理的基础知识,但如果没这方面知识 ,只是从纯程序角度看也没有问题 梯度矢量 你把它看成一个矩阵(二维数组)的几个临近的数字加加减减就行了 对编程序没有什么障碍

关于数字图像的规定化处理——单映射法(vc实现)
集合论是当代数学的基础.学习集合,不仅应从本质上去理解与集合有关的各个概念、性质和运算法则,更重要的是在解题的过程中自觉地应用集合的语言和方法去表示各种数量关系,解决各种数学问题. 映射刻划的是两个集合之间元素的特殊对应关系,是我们进一步学习函数的基础,同时也是一个重要的数学方法.数学...

用VC++处理24位真彩图转换成256级灰度图怎么弄
还是先熟悉了VC++吧!关于图像处理方面的内容建议看看:图像处理程序设计(杨淑莹)清晰版+源码 include <windows.h>BOOL BMP24to8(char *szSourceFile,char *szTargetFile);int main(int argc,char* argv[]){\/\/调用这个函数直接把24位真彩色灰度化BOOL stat=BMP24to8("c:\/\/source.bmp","c:\/\/...

VC++如何将采集到的数据做成实时显示的图像?比如“电压幅值VS时间”的...
1、VC++一般做上位机,通过串口通讯将来自下位机的数据保存到数据库,或直接用于绘制曲线 2、VC++ MFC中有功能丰富的图形图像处理函数,参考一下CDC类 3、以时间为X轴,获取数据为Y轴数值,连续对数据点连线 4、更多交流参考我空间文章。

VC图像处理编程问题!!(MFC设计一个能影响到位图的橡皮擦)
是不是操作没有对图像数据进行操作啊,你查查看啊。也许是你这个橡皮擦只是根本只是覆盖到原图上,表面看起来是有视觉上的改观,但其实根本没有对位图进行操作。你检查一下 程序不是你自己编的么?肯定有指向图像数据区的指针啊,调用该指针配合你的橡皮藏进行操作不就行了吗?

怎么把火焰特效加到VC++图像处理程序中?
在菜单触发事件时运行相关火焰效果函数,比如你已有CFire这个类,类中定义了相关的Fire方法,你就可以用CFire->Fire(); 的方式执行相应火焰效果函数。VC++中菜单事件使用方法如下:菜单项属性说明:ID 标识菜单的唯一常量。Caption 菜单项标题,“&" 后面的字符为快捷键,在菜单项后的字符将加下划线。...

寻求编程高手帮忙用VC++编一个简单的图像处理软件!!!
我现在也在做相关的程序,快做好了.如果要简单一点的 使用 picture 控件实现打开文件,放大缩小使用StretchBlt之类的位图相关的函数或者直接使用MoveWindow,灰度的话 我很偷懒,直接使用GetPixel函数 获取RGB值做运算 最后保存对话框里的图像就OK了。希望对你有帮助。

名山县13573178434: 如何在vc中进行图形图像处理 -
种黄前列: 首先你要知道vc怎么打开图像文件.那就是要知道现在的图像文件有哪些格式,怎么压缩的,有哪些类可以直接拿来用,要把这些类导入的vc中,然后使用这些类里的函数进行文件的解压缩,然后按存储格式,读取图像数据(首先要知道这些数据是怎么存储的,是8进制还是16进制等等),然后应用相应的算法处理数据,比如图像锐化的算法,图像模糊的算法,都有一定的规则的,按这些规则处理图像数据,就实现了图像处理.

名山县13573178434: vc编程实时处理图像
种黄前列: MFC中没有图像处理这方面的函数,图形方面的类为CDC. (1)至于图像采集:那么现在操作系统对于数字相机的内存读取就像在本地读取一样,所以只要通USB数据线连接于计算机后,就是读文件的问题.推荐你使用C++的STL中的文件输入...

名山县13573178434: vc 图像处理如何实现
种黄前列: 用vc编程,MFC有读取bmp图像的函数,读入图像后,用C++语言编写图像处理程序,处理结果,送视图类函数显示

名山县13573178434: 如何用VC6.0对图像进行处理 -
种黄前列: 处理特定格式的图像要知道图像的具体格式,读取文件然后按特定的要求用特定的算法处理数据,这方面的东西网上资料很多,可以搜索“VC++ 数字图像处理”有很多你想要的结果,这方面的书也可以容易找到,根据书上的做就行了~~ 如果你是入门:一开始不建议用MFC编程,因为这个MFC会很复杂,变成了学习MFC编程而不是图像处理.你可以基于api编程,opencv是个不错的选择,只是很多算法已经封装好,可以很快上手.VC++版本不要选择太高,建议6.0就可以. 一开始不要目标太高,就把图像当成矩阵,也不要去追究算法的数学证明,比如说,图像平滑,你只要知道就是把周围像素的值来组合求的中心点的值就行

名山县13573178434: 最近想用VC来做图像处理,但是只学过C语言,不知道从哪里看起,哪?
种黄前列: 看看数字图像处理的书,了解图像处理的基本思想,比如说图像可以看做个二维数组之类的. 然后给电脑装上OpenCV,就参考《OpenCV教程——基础篇》这本书,跟着书上的例子练习. 更高的层次就可以看一些论文,实现比较复杂的算法,再往后可以自己创新...

名山县13573178434: 怎样用VC实现jpg图像转换为bmp图像? -
种黄前列: 不能, bmp图像是采用像素格式保存数据. jpg图像采用压缩格式保存数据.一般的专业图像处理开发包 都是对bmp格式图像进行处理. 像开放的opencv也只对bmp格式图像进行处理

名山县13573178434: 如何用vc6.0 来做图像处理?是用mfc工程吗,然后导入图像么? 如何去掉图像的背景,然后反转 -
种黄前列: 首先是图像的打开问题,你可以用其他的库来实现,这样方便 如果用这些库的话显示也就很方便了,可以用cximage、gdi+、opencv等,你可以用一下opencv 一般用mfc因为用这个比sdk简单 去掉背景那要看你怎么去,图像处理的算法很多,但是不一定能能够适用于你的图像,反转这个算法实现起来很容易,得到图像的数据区,然后逐行扫描交换数据即可 不知道你这个把两张图片和在一起是什么意思,是图像的融合呢,还是图像的加减操作等 去噪声很多,一般采用滤波的发放,也可以变换到频率域进行操作 你可以找一下这方面的书看一下,数字图像处理的书还是很多的,再找一下vc数字图像处理,教你怎么样在vc的框架下进行处理,其实关键在于算法

名山县13573178434: 在VC++中如何进行图像处理?
种黄前列: 如果是自己从头编写的话, 就是申请个二维或一维数组,把图像亮度值装进去. 比如用 CBitmap::LoadBitmap 之类的函数,把硬盘中的文件读进数组. 然后做各种图像处理.(二值化,过滤处理之类的) 再显示或存盘. 或者用一些现成的图像处理库.比如收费的(LeadTools), 免费的(OpenCV)之类的吧.

名山县13573178434: 在VC++中如何进行图像处理? -
种黄前列: 申请个二维或一维数组,把图像亮度值装进去. 比如用: CBitmap::LoadBitmap 之类的函数,把硬盘中的文件读进数组. 然后做各种图像处理.(二值化,过滤处理之类的) 再显示或存盘. 或者用一些现成的图像处理库.比如收费的(LeadTools), 免费的(OpenCV)之类的.

名山县13573178434: 如何在VC环境下使用Halcon库 -
种黄前列: 在VC环境下进行图像处理比在MATLAB下开发运算速度要快,但工作量要大的多,用MATLAB做图像处理,直接调用里面的相关函数就可以完成,而且比较直观,但满足不了在速度上要求比较高的场合.所以在VC环境下直接开发往往是首选,...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网