位图基础
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章位图基础
本章要点:
☑数字图像的基本概念
☑与设备相关位图(DDB)
☑与设备无关位图(DIB)
☑ CDib类库的建立
☑数字图像处理的应用
1.1数字图像的基本概念
计算机屏幕上显示出来的画面通常有两种描述方法:一种为图形,另一种为图像。
图形、图像在存储结构和表示方法上有着根本的区别。
图形是矢量结构的画面存储形式,是由指令集合组成的描述,这些指令描述构成一幅图的所有直线、圆、圆弧、矩形、曲线等的位置、维数和大小、形状、颜色,显示时需要相应的软件读取这些命令,并将其转变为屏幕上所显示的形状和颜色,图形记录的主要内容是坐标值或坐标值序列,对一般画面内容的颜色或亮度隐含且统一地描述,因此,矢量结构显式地表现画面内容的坐标值。
图像是以栅格结构存储画面内容,栅格结构将一幅图划分为均匀分布的栅格,每个栅格称为像素,显式地记录每一像素的光度值(亮度或彩色),所有像素位置按规则方式排列,像素位置的坐标值却是有规则地隐含。
图像由数字阵列信息组成,用以描述图像中各像素点的强度与颜色,因此图像适合于表现含有大量细节(如明暗变化、场景复杂和多种颜色等)的画面,并可直接、快速地在屏幕上显示出来。
图像占用存储空间较大,一般需要进行数据压缩。
色度学理论认为,任何颜色都可由红(Red)、绿(Green)、蓝(Blue)三种基本颜色按照不同的比例混合得到。
红、绿、蓝被称为三原色,简称RGB三原色。
在PC的显示系统中,显示的图像是由一个个像素组成的,每一个像素都有自己的颜色属性,像素的颜色是基于RGB 模型的,每一个像素的颜色由红,绿,蓝三原色组合而成。
3种颜色值的结合确定了在图像上看到的颜色。
人眼看到的图像都是连续的模拟图像,其形状和形态表现由图像各位置的颜色所决定。
因此,自然界的图像可用基于位置坐标的三维函数来表示,即:
f(x,y,z)={f red(x,y,z) ,f green(x,y,z), f blue(x,y,z)}
其中f表示空间坐标为(x,y,z)位置点的颜色, f red 、f green、 f blue分别表示该位置点的红、绿、蓝三种原色的颜色分量值。
他们都是空间的连续函数,即连续空间的每一点都有一个精确的值与之相对应。
为了研究的方便,主要考虑平面图像。
平面上每一点仅包括两个坐标值,因此,平面图像函数是连续的二维函数,即:
f(x,y)={f red(x,y) ,f green(x,y), f blue(x,y)} 数字图像是连续图像f(x,y)的一种近似表示,通常用由采样点的值所组成的矩阵来表示:
f(0,0) f(0,1)…. f(0,M-1)
f(1,0) f(1,1)…. f(1,M-1)
f(N-1,0) f(N-1,1)…. f(N-1,M-1)
每一个采样单元叫做一个像素(pixel),上式中,M、N分别为数字图像在横、纵方向上的像素总数。
在计算机内通常用二维数组来表示数字图像的矩阵,把像素按不同的方式进行组织或存储,就得到不同的图像格式,把图像数据存成文件就得到图像文件。
图像文件按其数字图像格式的不同一般具有不同的扩展名。
最常见的图像格式是位图格式,其文件名以BMP为扩展名。
图像数字化的精度包括两个部分,即分辨率和颜色深度。
分辨率指图像数字化的空间精细程度,有显示分辨率和图像分辨率两种不同的分辨率。
图像分辨率是数字化图像时划分图像的像素密度,即单位长度内的像素数,其单位是每英寸的点数DPI(Dots Per Inche)。
显示分辨率是把数字图像在输出设备(如显示屏或打印机等)上能够显示的像素数目和所显示像素之间的点距。
显示分辨率是用户在屏幕上观察图像时,所感受到的分辨率。
一般显示分辨率是由计算机的显示卡所决定的。
例如标准的VGA显示卡的分辨率是640×480,即宽640点(像素),高480点(像素)。
至于较高级的显示卡,通常可以支持800×600或是1024×768点以上。
图像分辨率说明了数字图像的实际精细度,显示分辨率说明了数字图像的表现精细度。
具有不同的图像分辨率的数字图像在同一输出设备上的显示分辨率相同。
数字图像的颜色深度表示每一像素的颜色值所占的二进制位数。
颜色深度越大则能表示的颜色数目越多。
颜色深度的不同,就产生不同种类的图像文件,在计算机中常使用如下类型的图像文件。
1.单色图像
单色图像中每个像素点仅占一位,其值只有0或1,0代表黑,1代表白或相反。
因为图像中的每个像素仅需1位信息,常把单色图像称为是1位图像。
单色图像具有比较简单的格式,一般由黑色区域和白色区域组成。
2.灰度图像
灰度图像具有如下特征:
(1) 灰度图像的存储文件带有图像颜色表,此颜色表共有256项,图像颜色表中每一表项由红、绿、蓝颜色分量组成,并且红、绿、蓝颜色分量值都相等,即:
f red(x,y) =f green(x,y)= f blue(x,y)
(2)每个像素由8位组成,其值范围从0~255,表示256种不同的灰度级。
每个像素的像素值f(x,y)是图像颜色表的表项入口地址。
例如,某灰度图像(16x6)对应的数值矩阵如下:
125,153,158,157,127, 70,103,120,129,144,144,150,150,147,150,160,
133,154,158,100,116,120, 97, 74, 54, 74,118,146,148,150,145,157,
155,163, 95,112,123,101,137,108, 81, 71, 63, 81,137,142,146,152,
167, 69, 85, 59, 65, 43, 85, 34, 69, 78,104,101,117,132,134,149,
54, 46, 38, 44, 38, 36, 44, 36, 25, 48,115,113,114,124,135,152,
58, 30, 44, 35, 28, 69,144,147, 57, 60, 93,106,119,124,131,144,
3.伪彩色图像
伪彩色图像与灰度图像相似,其存储文件中也带有图像颜色表,伪彩色图像具有如下特征:
(1)图像颜色表中的红、绿、蓝颜色分量值不全相等,即:
f red(x,y)≠f green(x,y)≠ f blue(x,y)
(2)整幅图像仅有256种颜色,要表示256种不同的颜色,像素必须由8位组成,每个
像素值不是由每个基色分量的数值直接决定,而是把像素值当作图像颜色表的表项入口地址。
把具有256色的图像称为8位彩色图像。
256色图像有照片效果,比较真实。
4.24位真彩色图像
具有全彩色照片表达能力的图像为24位彩色图像,24位真彩色图像存储文件中不带有图像颜色表,其具有如下特征:
(1)图像中每一像素由RGB三个分量组成,每个分量各占8位,每个像素需24位。
(2)f red(x,y)、f green(x,y)、 f blue(x,y)取值范围为0~255。
例如,某彩色图像(6x8)对应的数值矩阵如下:
(207,137,130) (220,179,163) (215,169,161) (210,179,172) (210,179,172) (207,154,146)
(217,124,121) (215,169,161) (216,179,170) (216,179,170) (207,137,120) (159, 51, 71)
(213,142,135) (216,179,170) (221,184,170) (190, 89, 89) (204,109,113) (204,115,118)
(216,179,170) (220,188,176) (190, 77, 84) (206, 95, 97) (217,113,113) (189, 85, 97)
(222,192,179) (150, 54, 71) (177, 65, 73) (145, 39, 65) (150, 47, 67) (112, 20, 56)
(136, 38, 65) (112, 20, 56) (112, 20, 56) (109, 30, 65) (112, 20, 56) ( 95, 19, 64)
(136, 38, 65) ( 91, 11, 56) (113, 25, 60) (103, 19, 59) ( 81, 12, 59) (126, 62, 94)
(138, 46, 71) (103, 19, 59) (158, 65, 83) (124, 40, 70) (145, 62, 79) (130, 46, 73)
由于24位真彩色图像所需的存储空间很大,处理速度较慢,当需要存储空间不大,并且要求实时快速处理图像时,一般都要利用相应的8位位图对其进行近似处理,因此8位位图是图像技术中涉及范围比较广泛的一种图像表示方法。
本书从第二章至第十章介绍8位位图的处理技术。
第十一章介绍24位位图的处理技术。
1.2与设备相关位图(DDB)
与设备相关位图DDB是一种内部位图格式,它显示的图像依计算机显示系统的设置不同而不同,因此一般不存储文件。
结构BITMAP定义了DDB位图的类型、宽度、高度、颜色格式和像素位值,该结构在Windows.h中定义如下:
typedef struct tagBITMAP
{
int bmType; // 位图类型,必须设为0
int bmWidth; // 位图宽度
int bmHeight; //位图高度
int bmWidthBytes; //位图中每一扫描行中的字节数
BYTE bmPlanes; //颜色层数
BYTE bmBitsPixel; //每一像素所占的位数
Void FAR* bmBits; //存放像素值内存块的地址
} BITMAP;
DDB中不包括颜色信息,显示时是以系统的调色板为基础进行各位的颜色映射的,Windows只能保证系统调色板的前二十种颜色稳定不变,所以DDB只能保证正确显示色彩少于二十色的位图。
Windows SDK 提供了标准的DDB位图操作函数,MFC中定义了CBitmap 类来说明DDB位图,其中封装了与DDB位图操作相关的数据结构和操作函数。
表1-1列出了 CBitmap 类封装的主要函数。
表1-1 CBitmap 类封装的主要函数
1.3与设备无关位图(DIB)
与设备无关位图DIB可以在不同的机器或系统中显示位图所固有的颜色。
与DDB相比而言,DIB是一种外部的位图格式,经常存储以BMP为后缀的位图文件。
DIB位图还支持图像数据的压缩。
1.BMP文件组成
位图结构如下所示:
2. BMP文件头
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,
以字节为单位
} BITMAPFILEHEADER;
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;
4. 颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。
RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD
{
BYTE rgbBlue;// 蓝色的亮度(值范围为0-255)
BYTE rgbGreen; // 绿色的亮度(值范围为0-255)
BYTE rgbRed; // 红色的亮度(值范围为0-255)
BYTE rgbReserved;// 保留,必须为0
} RGBQUAD;
颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
当biBitCount=1,4,8时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;
5. 位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。
位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节。
位图图素的位数可为1、4、8和24,其图像的颜色数分别为2、16、256和真彩色。
其中前三种具有对应的颜色表,而24位位图的颜色表为空,其像素值就是颜色值。
如果BITMAPINFOHEADER的biClrUsed域不为0,则其值为位图所使用的颜色数,也即是颜色表的表项数。
如果该域为0,则位图的颜色表的表项数是满的,即像素颜色位数为1、4、8,则其颜色表项数分别为2、16、256。
颜色表中一般将最重要的颜色排在前面。
DIB位图的位数据紧跟在颜色表后面。
数据可以是不压缩的,也可以是压缩的。
对4位和8位位图,可以采用RLE(游程长度编码)压缩,分别称为RLE4和RLE8位图。
位数据以行为单位存储,每行都被填充到一个四字节边界,即每行所占的存储长度总是四字节(32位)的倍数,不足时将多余位用0填充。
位图行的存储次序是颠倒的,即位图文件中第一行数据对应的是位图的最底行。
对于像素位数为1的DIB位图,其每个像素只占1位,每个字节存储8个像素。
字节的最高位对应于最左边的像素。
在像素位数为24的DIB位图中,每个像素占三字节,从左到右的每一字节分别存储蓝、绿、红的颜色值。
每行用0填充到一个四字节边界。
1.4 CDib类库的建立
大多数图像处理都是基于与设备无关位图(DIB)来进行讨论的,由于MFC中没有处理DIB 位图的类,这就给编程带来了许多困难。
所以需要定义一个处理DIB位图的专用类CDib类,在其中封装必要而有效的DIB数据成员和处理函数。
该类具有的功能如下。
void LoadFile(CString m_fileName); ----装载BMP位图文件
BOOL SaveFile(const char *pszFilename);----存储BMP位图文件
char* GetFileName(); ----------------------返回位图文件名
DWORD GetSize();---------------------------返回位图文件的大小
UINT GetWidth();---------------------------返回位图的宽度
UINT GetHeight();--------------------------返回位图的高度
UINT GetNumberOfColors();------------------返回位图颜色数目
RGBQUAD* GetRGB();-------------------------返回颜色表首地址
BITMAPINFO* GetInfo();---------------------返回图像信息结构首地址
BYTE* GetData();---------------------------返回图像数据首地址
1.CDib类的设计目标
用面向对象的方法处理位图的核心是设计一个处理DIB的类,称之为CDib类。
本节从功能、父类、数据封装和继承等方面来分析CDib类的设计目标。
(1)功能
根据上节对DIB操作的分析,以及参照CBitmap的功能设计,CDib类的基本操作功能应包括:
①DIB文件的读、写操作;
②提供位图宽度、高度、颜色数目等位图相关信息;
③提供有关位图占据内存空间的信息,包括:图像数据区首地址、颜色表首地址、位图信息结构首地址等信息。
(2)父类
由于MFC中已有一个支持DDB操作的CBitmap类,因此,很直观的想法是,以CBitmap 类为父类派生出CDib类。
但是,从长远考虑,这样做并没有什么好处。
首先,CBitmap类是为DDB的操作而设计的,其中没有处理DIB的功能,因此CDib类不能从中继承任何可用的功能。
其次,CBitmap类是从CGdiObject中派生来的,CBitmap类以及它从CGdiObject 类继承来的数据成员和功能函数对CDib类来说都是不合适的,也是多余的。
此外,CBitmap 类没有提供有效的文件操作机制。
而DIB主要是一种“外部”位图,即它主要以文件形式进行存储和交换,所以CDib类应该能很好地处理文件操作。
MFC中的CObject类是MFC中其他大多数类的根类和基类。
它不但提供许多有用的特性,还包括对文件串行化的支持,运行时的类信息和对象诊断的输出等。
如果从CObject类派生类,则可继承该类的这些特性。
另外,CObject类具有最低限度的成员数据和函数,从CObject 类派生类所花的代价是最低的。
因此,采用CObject类作为CDib类的父类是很合理的。
(3)数据封装
面向对象方法的一个重要特征就是数据封装。
即将类的成员数据隐藏在类中,外界只能通过类的成员函数来操作类的成员数据。
这是面向对象方法的重要优点,它可以保护类中的数据不受外部的意外修改。
但是,过分“纯粹”的数据封装,需要付出降低程序效率的代价。
特别在设计像CDib这样需要大量使用Win32 API函数的类时,这种缺陷特别突出。
因为操作DIB的API函大多需要一些DIB的属性作为参数。
如果硬要将这些属性封装起来,则需要在类中重新实现许多Win32 API函数。
这不但要花费很大的精力,而且还可能因此而产生错误和低效。
所以,在设计CDib时应采用既尽可能保证数据的封装,又能保证效率的提
(4)继承
CDib类的另一个设计目标应该考虑到,在程序中即要打开原图,又要对原图分别进行各种处理,为了能够对照显示,原图不做任何处理,可将原图定义为CDib类的对象或指向该对象的指针,而将需要处理的类定义为CDib类的派生类,由于派生类对基类中的保护或公有成员可以直接使用,不需要声明,因此,在派生类中仅仅定义各种处理图像数据区的函数即可。
本书中所有实例都按这种结构设计,使不同处理功能归结在不同的CDib派生类中,结构简洁,请看附录及光盘上的实例。
2.构造CDib类
根据上节的分析,实现了CDib类,其接口文件和实现文件分别为DIB.H和DIB.CPP。
文件DIB.H包含了CDib类的类声明有关的所有信息。
CDib类的声明及实现细节如下。
#ifndef __CDIB_H
#define __CDIB_H
class CDib : public CObject
{
public:
RGBQUAD* m_pRGB;
BYTE* m_pData;
UINT m_numberOfColors;
BOOL m_valid;
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER* m_pBitmapInfoHeader;
BITMAPINFO* m_pBitmapInfo;
BYTE* pDib;
DWORD size;
public:
CDib();
~CDib();
char m_fileName[256];
char* GetFileName();
BOOL IsValid();
DWORD GetSize();
UINT GetWidth();
UINT GetHeight();
UINT GetNumberOfColors();
RGBQUAD* GetRGB();
BYTE* GetData();
BITMAPINFO* GetInfo();
WORD PaletteSize(LPBYTE lpDIB);
WORD DIBNumColors(LPBYTE lpDIB);
void SaveFile(const CString filename);
public:
void LoadFile(const char* dibFileName);
文件DIB.CPP中包含了Cdib类中各函数的实现,实现代码如下。
#include "stdafx.h"
#include "CDib.h"
#include "windowsx.h"
CDib::CDib()
{
size=0;
}
CDib::~CDib()
{
GlobalFreePtr(m_pBitmapInfo);
}
void CDib::LoadFile(const char* dibFileName)
{
strcpy(m_fileName,dibFileName);
CFile dibFile(m_fileName, CFile::modeRead);
dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER)); if (bitmapFileHeader.bfType == 0x4d42)
{
DWORD fileLength = dibFile.GetLength();
size = fileLength -sizeof(BITMAPFILEHEADER);
pDib =(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size);
dibFile.Read((void*)pDib, size);
dibFile.Close();
m_pBitmapInfo = (BITMAPINFO*) pDib;
m_pBitmapInfoHeader = (BITMAPINFOHEADER*) pDib;
m_pRGB = (RGBQUAD*)(pDib +
m_pBitmapInfoHeader->biSize);
int m_numberOfColors = GetNumberOfColors();
if (m_pBitmapInfoHeader->biClrUsed == 0)
m_pBitmapInfoHeader->biClrUsed =
m_numberOfColors;
DWORD colorTableSize = m_numberOfColors *
sizeof(RGBQUAD);
m_pData = pDib + m_pBitmapInfoHeader->biSize
+ colorTableSize;
if (m_pRGB == (RGBQUAD*)m_pData) // No color table
m_pRGB = NULL;
m_pBitmapInfoHeader->biSizeImage = GetSize();
m_valid = TRUE;
}
else
{
m_valid = FALSE;
AfxMessageBox("This isn't a bitmap file!"); }
}
BOOL CDib::IsValid()
{
return m_valid;
}
char* CDib::GetFileName()
{
return m_fileName;
}
UINT CDib::GetWidth()
{
return (UINT) m_pBitmapInfoHeader->biWidth;
}
UINT CDib::GetHeight()
{
return (UINT) m_pBitmapInfoHeader->biHeight;
}
DWORD CDib::GetSize()
{
if (m_pBitmapInfoHeader->biSizeImage != 0)
return m_pBitmapInfoHeader->biSizeImage;
else
{
DWORD height = (DWORD) GetHeight();
DWORD width = (DWORD) GetWidth();
return height * width;
}
}
UINT CDib::GetNumberOfColors()
{
int numberOfColors;
if ((m_pBitmapInfoHeader->biClrUsed == 0) &&
(m_pBitmapInfoHeader->biBitCount < 9))
{
switch (m_pBitmapInfoHeader->biBitCount)
{
case 1: numberOfColors = 2; break;
case 4: numberOfColors = 16; break;
case 8: numberOfColors = 256;
}
}
else
numberOfColors = (int) m_pBitmapInfoHeader->biClrUsed;
return numberOfColors;
}
BYTE* CDib::GetData()
{
return m_pData;
}
RGBQUAD* CDib::GetRGB()
{
return m_pRGB;
}
BITMAPINFO* CDib::GetInfo()
{
return m_pBitmapInfo;
}
WORD CDib::PaletteSize(LPBYTE lpDIB)
{
return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE));
}
WORD CDib::DIBNumColors(LPBYTE lpDIB)
{
WORD wBitCount; // DIB bit count
wBitCount = ((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;
switch (wBitCount)
{
case 1:
return 2;
case 4:
return 16;
case 8:
return 256;
default:
return 0;
}
}
void CDib::SaveFile(const CString filename)
{ //此函数只能保存经处理后宽度、高度均没有改变大小的图像
strcpy(m_fileName,filename);
CFile dibFile(m_fileName, CFile::modeCreate|CFile::modeWrite);
dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
dibFile.Write((void*)pDib, size);
dibFile.Close();
}
本书从第二章到第十章介绍256色的图像处理技术,在第十一章介绍24位真彩色图像的处理。
在显示方面调用了调色板技术。
设备无关位图读取及显示的方法,流程图如下所示:
图像显示的流程图
1.5数字图像处理的应用
1.图像处理
在实际应用中,系统获取的原始图像不是完美的,由于噪声、光照、拍摄角度不正等原因,图像的质量不高,所以需要进行图像处理,以有利于提取感兴趣的信息。
所谓图像处理,就是对图像信息进行加工以满足人的视觉心理或应用需求的行为。
数字图像处理的英文名称是“Digital Image Processing”。
通常所说的数字图像处理是指用计算机进行的处理,因此也称为计算机图像处理。
对于一个图像处理系统来说,可以将流程分为三个阶段,首先是图像处理阶段、第二是图像分析阶段、第三是图像理解阶段。
图像处理阶段主要是在像素级上进行处理,进行图像的几何校正,图像的灰度变换处理,图像噪声滤除的平滑处理,目标物体边界的锐化处理等,这些工作尤为重要,如果这阶段处理不好,后面的工作根本无法展开。
图像分析阶段主要对图像里感兴趣的目标进行检测、分割、特征提取和测量,分析的结果能为用户提供描述图像
目标特点和性质的数据,把原来以像素描述的图像转变成比较简洁的非图像方式的描述。
图像理解阶段主要通过对图像里各目标的性质和它们之间相互关系的研究,对描述抽象出来的符号进行运算,了解把握图像内容并解释原来的客观场景,提供客观世界的信息,指导和规划行为,其处理过程和方法与人类的思维推理可以有去多类似之处。
图像处理就是用一系列的特定操作来改变图像的像素,以达到特定的目标,比如使图像更清晰,或从图像中提取某些特定的信息等。
对含有噪声的图像,要除去噪声、滤去干扰,提高信噪比;对信息微弱的图像要进行灰度变换等增强处理;对已经退化的模糊图像要进行各种复原的处理;对失真的图像要进行几何校正等变换。
除此之外,图像的合成、图像的编码与传送等技术也属于图像处理的内容。
由此可见,图像处理就是为了达到改善图像的质量,将图像变换成便于人们观察、适于机器识别的目的。
数字图像处理是现代图像处理的主要方法,具有再现性好、精度高、适用面广和灵活性大等优点。
图像处理既可以在空间域实现,也可以在频域内实现,本书只在第9章介绍了图像基于变换域的处理方法,其它部分主要介绍在空间域内对图像进行运算,它是一种既简单又重要的图像处理技术,能让用户改变图像上像素点的灰度值,产生一幅新图像。
2.图像处理中的常用技术
数字图像处理的内容非常丰富,是现代计算机的重要应用方向。
对图像像素的处理方式上可以划分为点处理和区域处理。
点处理是一种输出像素值仅取决于输入像素值的图像处理方法;区域处理的输出像素值不仅与输入的像素值有关,而且与输入像素在一定的范围内的相邻像素值有关。
区域处理在数字图像处理中占有重要地位。
区域处理在处理某一像素时,利用与该像素相邻的一组像素,经过某种变换得到处理后图像中某点的的像素值。
目标像素的邻域一般是由像素组成的二维矩阵,该矩阵的大小为奇数,目标像素位于该矩阵的中央,即目标像素就是区域的中心像素。
经过处理后,目标像素的值为经过特定算法计算后所得的结果。
主要的区域处理算法有卷积、中值滤波和边缘检测。
其中卷积算法的应用最广泛,大部分的区域处理都采用卷积算法来实现。
(1)卷积
卷积可以简单的看成加权求和的过程。
卷积时使用的权用一个很小的矩阵来表示,矩阵的大小是奇数,而且与使用的区域的大小相同。
这种权矩阵叫做卷积核,区域中的每个像素分别与卷积核中的每个元素相乘,所有乘积之和即区域中心像素的新值。
比如,对于一个3*3的区域P与卷积核K,其中:
p1 p2 p3 k1 k2 k3
p= p4 p5 p6 k = k4 k5 k6
p7 p8 p9 k7 k8 k9
P与卷积核K卷积后,区域P的中心像素p5表示如下:
p5=p1*k1+ p2*k2+ …p8*k8+ p9*k9
卷积核中各元素叫卷积系数。
卷积核中卷积系数的大小、方向及排列次序决定了卷积的图像处理效果。
大多数常用的卷积核都是3*3的,所有卷积核的行、列都是奇数。
进行卷积时会遇到一些较复杂的问题,首先是图像边界的问题。
当在图像上逐个移动卷积核时,只要卷积核移到了图像边界,即卷积核悬挂在图像边界上时,就会出现计算上的问题。
这时在原图像上就不能完整找到与卷积核中卷积系数相对应的九个(对3*3卷积核)
图像像素。
解决这一问题的两个简单方法是:或者忽略图像边界数据,或者在图像的四周复制图像的边界数据。
卷积运算的第二个复杂问题是计算得到的中心像素的动态问题。
使用大多数卷积核卷积得到的中心像素值都位于像素值的有效范围之内。
但也有一些卷积核卷积的结果超出了像素的有效范围。
这时要引用比例缩放操作,即对卷积结果进行指定次数的除以二操作。
卷积运算的第三个复杂问题是卷积结果像素值的符号问题。
当卷积核中包含负的卷积系数时,卷积结果像素值的符号可能为负。
负的像素没有意义,也不能显示,必须进行适当的处理,常用的方法如下:
①将负的结果像素值置为0;
②取负的结果像素值的绝对值作为像素的新值;
③将所有像素的值都加上一个常数,使所有负的像素值都大于等于0。
(2)循环像素点
因为在图像上逐个移动卷积核时,只要卷积核移到了图像边界,即卷积核悬挂在图像边界上,这时在原图像上就不能完整找到与卷积核中卷积系数相对应的九个(对3*3卷积核)图像像素。
在处理图像时可以忽略图像边界。
代码实现:for(j=1;j<height-1;j++)
for(i=1;i<wide-1;i++)
图 1-1 图像数据区
如图1-1为图像数据区,每一个点存储了该点像素的灰度值,做图像处理时是从(1,1)点开始取到(height-2,wide-2)点结束,外围边界数据忽略。
3 数字图像处理的应用
目前数字图像处理技术的应用越来越广泛,已经渗透到人们的日常生活中,例如天气预报、医院、银行、超市、道路交通管理、重要部门的监控报警系统、可视电话、网络传输等等。
下面列举一些典型的应用实例。
(1)遥感航天中的应用
①天文、太空星体的探测及分析;
②军事侦察、定位、指挥等;
③地质、地形、地图的普查及绘制;
④地下矿藏的勘探;
⑤环境污染的监测;
⑥气象、天气预报的合成分析。
(2)生物医学中的应用
①显微图像处理;
②DNA显示分析;
③生物进化的图像分析;
④手术规划;
⑤内脏大小、形状、活动及异常检出分析;
⑥癌细胞识别。
(3)工业应用
①产品无损检测、焊缝及内部缺陷检测;
②流水线零件自动检测识别;
③生产过程的监控;
④交通管制、机场监控;
⑤支票、签名辨伪及识别;
⑥机器人视觉系统的应用。
(4)军事公安领域中的应用
①罪犯脸形的合成;
②指纹自动识别;
③巡航导弹地形识别;
④手迹、印章的鉴定识别;
⑤遥控飞行器的引导;
⑥雷达的目标侦察。
(5)其它应用
①多媒体计算机系统及应用;
②图像的远程通信;
③电视会议;
④可视电话;
⑤服装试穿显示;
⑥现场视频管理。
数字图像处理技术的应用远远超出上述的内容,它在国民经济中发挥越来越大的作用。