数字图像处理----彩色图像处理杨淑莹教授天津理工大学计算机与通信工程学院彩色图像处理彩色图像的灰度化处理 彩色图像马赛克处理 彩色图像的浮雕处理彩色图像的灰度化处理1. 理论分析(1) BMP位图文件类型(2) 24位真彩色图像文件结构(3) 彩色图像的灰度化处理方法2. 理论验证(1)UltraEdit软件对真彩色文件数据剖析(2) 教学软件验证3. 实现步骤4. 编程代码(1) CDib类库的建立(2) CDib派生类的建立----彩色图像处理(3) 灰度化处理代码1.24位真彩色图像(1)每一像素由RGB三个分量组成。
(2)每个分量各占8位,取值范围为0~255,每个像素24位。
(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)2.理论分析--24位真彩色图像文件结构位图像素数据位图信息头结构BITMAPINFOHEADER 位图文件头结构BITMAPFILEHEADER 位图像素数据颜色表位图信息头结构BITMAPINFOHEADER位图文件头结构BITMAPFILEHEADER8位位图文件结构24位位图文件结构1)BMP文件头结构typedef struct tagBITMAPFILEHEADER{WORD bfType; // BM,2byteDWORD bfSize;// 文件大小,4byteWORD bfReserved1;// 0WORD bfReserved2;// 0DWORD bfOffBits; // 位图数据的起始位置,}TMAPFILEHEADER;//(14byte)2)位图信息头结构typedef struct tagBITMAPINFOHEADER{DWORD biSize; // biSize=40byteLONG biWidth;LONG biHeight;WORD biPlanes; // 1WORD biBitCount;// 每个像素所需的位数,24 DWORD biCompression; // 位图压缩类型,0DWORD biSizeImage; // 位图的大小,LONG biXPelsPerMeter; // 0LONG biYPelsPerMeter; // 0DWORD biClrUsed; // 颜色数0DWORD biClrImportant; // 重要的颜色数0} BITMAPINFOHEADER;3)位图像素数据(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)1.理论分析--彩色图像的灰度化处理使颜色的R、G、B分量值相等。
灰度化处理方法:¾三个分量取最大值、¾三个分量取最小值、¾三个分量取算术平均值、¾三个分量取Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j)2.理论验证(1)UltraEdit软件对数据文件剖析(2) 教学软件验证2.理论验证----UltraEdit数据剖析BITMAPFILEHEADER1个像素的真彩色文件BITMAPINFOHEADER2.理论验证---教学软件验证3.实现步骤(1) 打开图像文件,装载数据到内存;(2) 取得图像的数据区指针,得到蓝、绿、红三个分值;(3) 将蓝、绿、红三个值作比较,取得最大值;(4) 将最大颜色值返回给蓝、绿、红三个分量;(5) 显示图像。
获得文件路径名打开位图文件读取BITMAPFILEHEADER结构读取BITMAPINFOHEADER 结构得到位图大小,分配内存空间BMP 格式?开始获得数据的起始位置,保存起始位置指针结束打开文件流程4.编程代码----CDib类库的建立1)基本操作功能①文件的读出、写入操作;②提供位图宽度、高度、颜色数目等信息;③提供位图占据内存空间的信息。
数据区首地址、颜色表首地址、位图信息结构首地址等。
4.编程代码----CDib类数据定义public:BYTE * m_pData;RGBQUAD * m_pRGB;UINT m_numberOfColors;BITMAPFILEHEADER bitmapFileHeader;BITMAPINFOHEADER * m_pBitmapInfoHeader;BITMAPINFO * m_pBitmapInfo;BYTE * pDib;DWORD size;4.编程代码----CDib类函数功能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();---------------------------返回图像数据首地址4.编程代码----LoadFile()功能简介CFile dibFile;dibFile.Read(&bitmapFileHeader,)位图文件头结构BITMAPFILEHEADER size = fileLength -sizeof(BITMAPFILEHEADER)pDib = GlobalAllocPtr(GMEM_MOVEABLE, size )m_pData =pDib+m_pBitmapInfoHeader->biSize+colorTableSize 位图像素数据m_pData m_pRGB = (RGBQUAD*)(pDib+m_pBitmapInfoHeader ->biSize);颜色表m_pRGB m_pBitmapInfoHeader ->biSize =40字节位图信息头结构BITMAPINFOHEADERpDib 位图像素数据m_pData 位图信息头结构BITMAPINFOHEADER pDib4.编程代码----彩色图像处理派生类1) CDib派生类作用(1)具有CDib类的保护或公有成员功能。
对基类中的保护或公有成员可以直接使用,不需要声明。
(2)在派生类中定义各种处理函数。
扩充了一些功能,这些功能随处理算法的不同而不同,结构简洁。
4.编程代码----CDib派生类#include "Cdib.h"class MakeColorDib: public CDib{ public:void MakegGray();void Mosaic();void Sharp();void PaintColor(int m_Red,int m_Green,int m_Blue);void ContrastAlter(int m_Increment);void LightReverse();MakeColorDib();virtual ~MakeColorDib();};4.编程代码----灰度化处理代码void MakeColorDib::MakegGray(){BYTE *p_data; //原图数据区指针int wide,height,DibWidth,gray; //原图长、宽、字节宽p_data=this->GetData(); //取得原图的数据区指针wide=this->GetWidth(); //取得原图的数据区宽度height=this->GetHeight(); //取得原图的数据区高度DibWidth=this->GetDibWidthBytes(); //取得数据区字节数for(int j=0;j<height;j++)// 每行for(int i=0;i<DibWidth;i+=3)// 每列{BYTE* pbyBlue= p_data++; //得到蓝色值BYTE* pbyGreen= p_data++; //得到绿色值BYTE* pbyRed= p_data++; //得到红色值BYTE r = * p_data++;BYTE g = * p_data++;BYTE b = * p_data++;if(r>g)gray=r;else gray=g;if(gray<b)gray=b;*pbyBlue= gray; //将最大值赋给蓝分量*pbyGreen= gray; //将最大值赋给绿分量*pbyRed= gray; //将最大值赋给红分量}}彩色图像马赛克处理1. 理论基础将图像从形式上划分为很多小块,在每块内的各个像素都取到相同的红、绿、蓝颜色值,从而对某些细节进行模糊化处理,使图像粗糙化。