VC++ 图像处理

本文档主要介绍了使用VC++进行图像处理编程的基础知识,涵盖了图像的读取、存储、显示以及基本的图像处理算法,适合初学者入门学习。
摘要由CSDN通过智能技术生成

VC++图象处理编程(一)

 

基本概念

前言

数字图像处理技术与理论是计算机应用的一个重要领域,许多工程应用都涉及到图像处理,一直有一个强烈的愿望,想系统的写一个关于数字图像处理的讲座,由于工作学习很忙,时至今日才得以实现。

  “图”是物体透射光或反射光的分布,“像”是人的视觉系统对图的接收在大脑中形成的印象或认识。图像是两者的结合。人类获取外界信息是靠听觉、视觉、触觉、嗅觉、味觉等,但绝大部分(约80%左右)来自视觉所接收的图像信息。图像处理就是对图像信息进行加工处理,以满足人的视觉心理和实际应用的需要。简单的说,依靠计算机对图像进行各种目的的处理我们就称之为数字图像处理。早期的数字图像处理的目的是以人为对象,为了满足人的视觉效果而改善图像的质量,处理过程中输入的是质量差的图像,输出的是质量好的图像,常用的图像处理方法有图像增强、复原等。随着计算机技术的发展,有一类图像处理是以机器为对象,处理的目的是使机器能够自动识别目标,这称之为图像的识别,因为这其中要牵涉到一些复杂的模式识别的理论,所以我们后续的讲座只讨论其中最基本的内容。由于在许多实际应用的编程中往往都要涉及到数字图像处理,涉及到其中的一些算法,这也是许多编程爱好者感兴趣的一个内容,我们这个讲座就是讨论如何利用微软的Visual C++开发工具来实现一些常用的数字图像处理算法,论述了图像处理的理论,同时给出了VC实现的源代码。本讲座主要的内容分为基础篇、中级篇和高级篇,具体包含的主要内容有:

1. 图像文件的格式;

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

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

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

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

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

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

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

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

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

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

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

13.AVI视频流的操作;

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

图象的文件格式

一.图象的文件格式

  要利用计算机对数字化图像进行处理,首先要对图像的文件格式要有清楚的认识,因为我们前面说过,自然界的图像以模拟信号的形式存在,在用计算机进行处理以前,首先要数字化,比如摄像头(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; // 位图文件的类型,必须为“BMP”

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; // 位图的大小,以字节为单位

1. \学习版Imgcx 打开文件夹Imgcx,执行SetUp,按提示安装Imgcx。该书各个章节所处理的图像都包含在安装后的文件夹…Imgcx\Image里。 2. \专业版Imgc 介绍该书配套的专业版软件Imgc。专业版软件包括该书全部图像处理的C语言源程序以及可执行的Visual C++ 界面源程序,可以满足大学教师、科研人员以及图像处理专业人员的需要。 3. \ImageSys试用版 包括通用图像处理系统ImgeSys的介绍和试用版的安装程序。通用图像处理系统ImageSys是一套大型专业图像处理软件,安装试用版后可以体会专业图像处理软件的魅力。 4. \动态图像处理 介绍北京现代富博科技有限公司的二维、三维动态图像处理软件系统。 有以下数字图像处理方法的实现: 1.一般2值化处理 void Threshold(BYTE *image_in, BYTE *image_out, int xsize, int ysize, int thresh, int mode); 2. 双阈值2值化处理 void Threshold_mid(BYTE *image_in, BYTE *image_out, int xsize, int ysize, int thresh_low, int thresh_high); 3.反转图像 void Reverse_image(BYTE *image_in, BYTE *image_out, int xsize, int ysize); 4.像素分布直方图 void Histgram(BYTE *image, int xsize, int ysize, long hist[256]); 5.计算直方图百分比 void CalHistPercent(long hist[], float hist_radio[], float &max_percent); 6.直方图平滑化 void Hist_smooth(long hist_in[256], long hist_out[256]); 7.直方图图像化(图像宽度大于等于64) void Hist_to_image(long hist[256], BYTE* image_hist, int xsize, int ysize); /*--------------------------提取轮廓-----------------------------*/ 8.1阶微分边沿检出(梯度算子) void Differential(BYTE *image_in, BYTE *image_out, int xsize, int ysize, float amp); 9.2阶微分边沿检出(拉普拉斯算子) void Differential2(BYTE *image_in, BYTE *image_out, int xsize, int ysize, float amp); 10.Prewitt法边沿检出 void Prewitt(BYTE *image_in, BYTE *image_out, int xsize, int ysize, float amp); 11.2值图像的细线化处理 void Thinning(BYTE *image_in, BYTE *image_out, int xsize, int ysize); /*--------------------------消除噪音-----------------------------*/ 12.去噪音处理(移动平均) void Image_smooth(BYTE *image_in, BYTE *image_out, int xsize, int ysize); 13.去噪音处理(中值) void Median(BYTE *image_in, BYTE *image_out, int xsize, int ysize); 14.膨胀 void Dilation(BYTE *image_in, BYTE *image_out, int xsize, int ysize); 15.腐蚀 void Erodible(BYTE *image_in, BYTE *image_out, int xsize, int ysize); /*--------------------------获取清晰图像------------------------*/ 16.亮度n倍 void Brightness_amplify(BYTE *image_in, BYTE *image_out, int xsize, int ysize, float n); 17.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值