1、数字图像处理数字图像处理VC+编程实现编程实现安秋安秋南京农业大学工学院南京农业大学工学院编程实现方法 Visual C+图像处理编程 MATLAB图像处理编程 基于开源库OpenCV的图像处理编程 基于其他库的图像处理编程图像处理的图像处理的VCVC编程编程 VC+编程环境简介 图像编程基础 图像格式的理解 BMP文件格式及读写 程序范例微型图像处理系统既包含硬件设备,也需要一定的软件环境支持。目前,图像处理系统平台多为Microsoft Windows或X-Windows,开发的主流工具为Microsoft公司的VC+。这是因为VC+是一种具有高度综合性能的软件开发工具,用它开发出来的程序
2、有着运行速度快、可移植能力强等优点。本书中实例也是在Windows平台下,用VC+6.0实现的。此外,各国的科学家和研究机构开发了不少专用的图像处理软件环境,下面仅对主要的几种作一简单介绍。VC开发环境简介 VC编程需要的知识C/C+语言;对Windows操作系统的了解(底层编程);微软类库MFC(Microsoft Foundation Class)Visual C+是一个可视化集成开发环境 掌握工程的概念 菜单使用介绍、Debug/Release区别等等VC开发的两种方式(一)SDK(software development kit)方式又称WIN32API(应用程序接口)编程即直接调用3
3、2位Windows(WIN32)操作系统提供的接口函数进行编程。SDK编程(VC中)使用的语言是C语言。适合底层编程和对速度要求较高的环境,比如游戏开发、驱动开发、数字图形等 看图像打开、高斯噪声绘制的例子VC开发的两种方式(二)MFC方式又称类库编程,即程序主要不再直接跟操作系统API打交道(在需要的时候也可以调用API),而是使用封装好的C+类库。MFC编程的好处之一:可以使用MFC向导来生成程序框架,提高效率 在这堂课中后面讲的程序都是在这堂课中后面讲的程序都是MFC程序程序C+语言是一种中级语言自然语言(高级语言)中级语言低级语言(机器语言)跳过去int m_nA=10;Int m_n
4、B=10;Int m_nC=m_nB+m_nA;MOV AL,10MOV BL,10ADD AL,BLC+语言的优缺点优点:编译语言优点:编译语言 脱离语言环境脱离语言环境 运行速度快运行速度快 代码少代码少缺点:编译过程复杂 语言可读性差 容易犯错 纠错困难C+语言是C语言的一个超集C语言C+语言VisualC+MFCC+是一种面向对象的程序语言CWinApp:程序对象:程序对象CMainFrame:窗口对象:窗口对象Cdocument:文档对象:文档对象Cview:视对象:视对象类的使用CWinApp:程序对象:程序对象CMainFrame:窗口对象:窗口对象CDocument:文档对象:
5、文档对象CView:视对象:视对象每一个对象的定义就是一个类,类是C+新派生的一个数据类型,比较抽象。通常情况下可以简单理解为分类。使用:CMainFrame m_Frame;/创建一个类的实例,分配相应的内存。m_Frame.Create(NULL);/通过实例调用类中的变量、函数、行为等 等。MFC类库简介MFC:微软开发的C+程序的类库,在类库内集成了 Windows程序设计所经常使用到的类,如:窗 口的管理、控件的管理、文件的管理、视的管 理等。同时对类进行了树状的管理,通过封装 和继承实现了简单实用的目的,而且功能强大,在Windows环境下编程和使用VC+编程应该对 MFC了解。指
6、针及其使用指针是C语言中一个非常重要的数据类型,通过指针可以实现直接对内存的存取。指针的声明:int*m_nNum;指针的赋值:m_nNum=&m_ngg;m_nNum(0002h)*m_nNum(20h)(32)数组的使用:m_nNum=m_nArr0;*(m_nNum+3)=m_nArr4;声明变量:int m_ngg=32;int m_nArr100;20h00h43h1eh0000h0001h0002h1234h1235hFffeeh堆和栈的概念堆和栈是计算机管理内存的两种方式:栈空间一般存储临时数据。堆空间一般存储较大的和生命期较长的数据。C语言中语言中,单个的临时变量都放在栈中。单
7、个的临时变量都放在栈中。int m_nNum=32;char m_cChar=m;大型的数组变量放在堆中:大型的数组变量放在堆中:int m_nNum100;BYTE m_nNum=(BYTE*)new BYTE2000;new和delete 操作符new操作符是C+的保留字,用来在堆中开辟一个指定大小的内存空间。BYTE m_nData=(BYTE*)new BYTEm_nWidth*m_nHeight;栈空间中的数据在函数调用结束,如果没有声明为全局变量,将被自动删除。堆空间的变量不会自动删除,需要程序员手工删除。delete m_nData;VC+6.0工作平台IDE的使用菜单菜单工具条
8、工具条提示栏提示栏视窗口视窗口编辑窗口编辑窗口输出窗口输出窗口窗口的概念图示中是我们讲要讲到的程序的界面,它是Windows系统的一个标准的界面,这种窗口框架结构也是视窗系统的核心。1、系统菜单、系统菜单2、程序菜单、程序菜单3、工具条、工具条4、视空间、视空间5、提示条、提示条文档/视图的概念 文档/视图结构是Windows窗口结构中的标准形式。在单文档窗口程序中,生成一个单文档模板和窗口视图对应,这时视图是由窗口生成的。在多文档界面中,窗口类只生成主框架,而子窗口和子视图有文档模板生成。视的概念 视结构是窗口中的客户区,用户可以在视区中画文字、画图像等等任意的屏幕的写操作。WindowsG
9、UI对视结构做了优化,用户可以方便的调用MFC类库中的相关类完成复杂的任务。开始程序设计1、声明一个文件操作类:CFileRW2、在文件类内完成对BMP文件的读写操作。3、在CDoc类中调用CFileRW类的实例完成运算工作,同时在Doc中响应菜单的消息命令。4、在CFileRW中创建存放文件数据的堆变量数组,并以指针的形式完成调用。5、在Doc中实现对堆数组的用后删除。图像在计算机中的理解这是一张计算机桌面的图像:这是一张计算机桌面的图像:0,01024,7681024,00,768XY基本元素基本元素:图像空间的大小:图像空间的大小:1024768个像素。每个点的坐标(个像素。每个点的坐标
10、(x,y)。)。颜色分辨率:颜色分辨率:32位彩色图像。位彩色图像。00000000000000000000000011111111RBGA像素像素三基色调色板在在WindowsWindows操作系统内部默认存在着一个调色板,调色板的操作系统内部默认存在着一个调色板,调色板的颜色是和显示卡的颜色能力相对应的,当前的真彩色卡支颜色是和显示卡的颜色能力相对应的,当前的真彩色卡支持持3 34 4个字节一个点的彩色表,一般第四个字节用于透明个字节一个点的彩色表,一般第四个字节用于透明显示通道。显示通道。调色板中用8位的一个字节表示一种颜色分量,R或者G、B。所有的可能的颜色的组合为224。这也是VGA
11、显示卡能够显示的最多的颜色数。所以我们把具有24位颜色的图像,叫做真彩色图像。分辨率的概念图像的分辨率越高,图像的空间点阵数越多;图像的颜色分辨率越高,表示每个像素点的字节数越多;图像的存储空间大小(字节):空间点阵数每个像素点的颜色字节数。图像的矩阵格式00000000000000011111111101010101000101010000000100000001000000011110000100000001000000010000000101100101001110010001011100000001图像在二进制格式中的形式图像在二进制格式中的形式1位表示一个点,两种颜色组合,黑白图像。
12、4位表示一个点,16种颜色组合,16种颜色索引图像8位表示一个点,256种颜色组合,256种颜色索引图像。16位,24位,32位。0,01024 PIXELS768 PIXELS图像实际的存储空间大小:10247682482304K2.25M(字节)图像的大小有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R,G,B三个分量表示,因为每个分量有256个级别,要用8位即一个字节来表示,所以每个象素需要用3个字节。整个图象要用200*200*3,约120k字节。这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R,G,B值。这样当我们表示一个象素的颜色时,只
13、需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为红色时,只需要标明0即可。再来计算一下:16种状态可以用4位表示,所以一个象素要用半个字节。整个图象要用200*200*0.5,约20k字节,再加上表占用的字节为3*16=48字节。整个占用的字节数约为前面的1/6!图像文件中对上述特征的处理图像的永久保存是存储到图像文件中。由于图像具有各种不同的特征,所以在存储文件时应该予以细致的描述:图像大小、颜色分辨率的大小、是否压缩、是否自己定义调色板等等。这些信息都包含在图像文件的文件头中。图像文件的格式类型标准的图像文件格式:图像文件
14、头图像的点阵数据。常用的图像文件格式:BMPGIFJPGPCX等等。BMP位图文件类型颜色深度的不同,就产生不同种类的图像文件,在计算机中常使用如下类型的图像文件:单色图像(黑白)单色图像(黑白)灰度图像灰度图像 伪彩色图像(伪彩色图像(8 8位和位和1616位位图)位位图)2424位真彩色图像位真彩色图像 3232位真彩色图像位真彩色图像单色图像 单色图像中每个像素点仅占一位,其值只有0或1,0代表黑,1代表白或相反。灰度图像(1)文件带有图像颜色表,共有256项,每一表项由红、绿、蓝三色分量组成。f red(x,y)=f green(x,y)=f blue(x,y)(2)每个像素由8位组成
15、,其值范围从0255,像素值f(x,y)是图像颜色表的表项入口地址。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
16、,115,113,114,124,135,152,58,30,44,35,28,69,144,147,57,60,93,106,119,124,131,144,伪彩色图像(1)图像颜色表中的红、绿、蓝颜色分量值不全相等。f red(x,y)f green(x,y)f blue(x,y)(2)图像有256种颜色,像素值是图像颜色表的索引地址。BMP文件的标准格式BMP文件的标准格式:5454个字节个字节大小的文件头;(不包括调色板)。以字节为基本单位的图像数据。在VC+中有标准的格式定义,两个结构变量,可以直接使用。位图文件的组成 结构名称 符号 位图文件头(bitmap-file header
17、)BITMAPFILEHEADERbmfh位图信息头(bitmap-information header)BITMAPINFOHEADERbmih彩色表(color table)RGBQUADaColors图象数据阵列字节BYTEaBitmapBitsBMP文件格式摘要偏移量偏移量 域的名称域的名称 大小大小 内容内容 图象文件头0000h文件标识2 bytes两字节的内容用来识别位图的类型:BM:Windows 3.1x,95,NT,BA:OS/2 Bitmap Array CI:OS/2 Color IconCP:OS/2 Color PointerIC:OS/2 IconPT:OS/2
18、Pointer注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。0002hFile Size1 dword用字节表示的整个文件的大小0006hReserved1 dword保留,必须设置为0000AhBitmap Data Offset1 dword从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量图象信息头 001ChBits Per Pixel1 word 每个象素的位数 1-单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)4-16 色位图8-256 色位图 16-16bit 高彩色位图24-24bit
19、 真彩色位图32-32bit 增强型真彩色位图001EhCompression1 dword压缩说明:0-不压缩(使用BI_RGB表示)1-RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)2-RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)3-Bitfields-位域存放方式(用BI_BITFIELDS表示)0022hBitmap Data Size1 dword用字节数表示的位图数据的大小。该数必须是4的倍数0026hHResolution1 dword用象素/米表示的水平分辨率002AhVResolution1 dword用象素/米表示的垂直分辨率002EhColors
20、1 dword位图使用的颜色数。如8-比特/象素表示为100h或者 256.0032hImportant Colors1 dword指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要调色板数据根据BMP版本的不同而不同PaletteN*4 byte调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:1字节用于蓝色分量 1字节用于绿色分量 1字节用于红色分量 1字节用于填充符(设置为0)图象数据根据BMP版本及调色板尺寸的不同而不同Bitmap Dataxxx bytes该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字
21、节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。单个像素的真彩色文件分析42 4D-BM3A 00 00 00-文件长度00 00 00 00-保留字节36 00 00 00-数据区起始地址28 00 00 00-本结构长度40个字节01 00 00 00-位图的宽度,以像素为单位01 00 00 00-位图的高度,以像素为单位01 00-目标设备的级别,必须为1 18 00-每个像素所需的位数24位 00 00 00 00-位图压缩类型,必须是 004 00 00 00-位图的大小,以字节为单位00 00 00 00-位图水平分辨率,每米像
22、素数00 00 00 00-位图垂直分辨率,每米像素数00 00 00 00-位图实际使用的颜色表中的颜色数00 00 00 00-位图显示过程中重要的颜色数WinHexWinHex软件软件文件标识文件标识文件头信息头信息头数据区数据区文件长度文件长度 保留字节保留字节 数据区起始地址数据区起始地址信息头信息头结构大小结构大小位图位图压缩类型压缩类型颜色表颜色表颜色数颜色数单个像素的256伪彩色位图文件调色板 256项 数据256色位图文件调色板数据 调色板 256项;所占字节数:256*4=1024;1024/16=64行;总行数43h=4*16+3=67行;文件头占 3行;所以占64行。每
23、行16字节,可以存储4个表项,64*4=256个表项。程序中图像数据的存储和使用图像数据在图像文件中存储的方式:图像文件只能够以数据流的方式存取数据,所以图像数据是以连续的字节存放的。0010011100100111001001110010011100100111 1 2 3 4 1025 2049 1024*768文件和内存中010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101显示屏幕0,01024768图
24、像矩阵格式与流格式的对应点阵:宽度m_nWidth,高度m_nHeight 横向的位值 X,纵向的位置 Y,f(x,y)是坐标X,Y处的颜色值。数据流:f(x,y)=g(y*m_nWidth+x);g(n)数据流中 n位值的颜色值。BMP文件存储格式(BMP VC中的描述)BMP文件由文件头、位图信息头、颜色信息和图像数据四部分组成。位图结构如下所示:位图文件头结构 BITMAPFILEHEADER位图信息头结构 BITMAPINFOHEADER位图颜色表 RGBQUAD位图像素数据VC6.0中用BITMAPFILEHEADER和BITMAPINFOHEADER两个结构变量来描述BMP文件的文
25、件头。位图文件头(第一部分)第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数)typedef struct tagBITMAPFILEHEADER WORD bfType;/文件类型描述,必须为BMDWORD bfSize;/以字节为单位的图像文件大小。WORD bfReserved1;/保留为0WORD bfReserved2;/保留为0DWORD bfOffBits;/从这个结构末尾到图像数据开始的字节数。BITMAPFILEHEADER,*PBITMAPFILEHE
26、ADER;位图信息头(第二部分)typedef struct tagBITMAPINFOHEADER DWORD biSize;/这个结构的字节数(大小)LONG biWidth;/图像的宽度。LONG biHeight;/图像的高度 WORD biPlanes;/目标设备的为平面数,指定为1。WORD biBitCount;/每个像素点的颜色位数。(0,1,4,8,16,24,32)DWORD biCompression;/图像是否压缩,压缩格式。DWORD biSizeImage;/图像数据的大小(字节)LONG biXPelsPerMeter;/每个像素点的空间分辨率(每米点的个数)水平
27、方向;LONG biYPelsPerMeter;/每个像素点的空间分辨率(每米点的个数)垂直方向;DWORD biClrUsed;/描述实际使用到的颜色数,0 DWORD biClrImportant;/显示时使用的颜色数,0;BITMAPINFOHEADER,*PBITMAPINFOHEADER;这个结构的长度是固定的,为40个字节(WORD为无符号16位整数,DWORD无符号32位整数,LONG为32位整数)biSizeImage字段 biSizeImage指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:biSizeImage=biWidth*biHeight要注意的是:
28、上述公式中的biWidth必须是4的整倍数(所以不是biWidth,而是biWidth,表示大于或等于biWidth的,离4最近的整倍数。举个例子,如果biWidth=240,则biWidth=240;如果biWidth=241,biWidth=244)一定要注意:每行所占字节长度始终是一定要注意:每行所占字节长度始终是4的倍数,或的倍数,或者每行所占位长度是者每行所占位长度是32的倍数。如果不是,则需要补齐的倍数。如果不是,则需要补齐 调色板/颜色表(第三部分)调色板实际上是一个四元数组,则有2的biBitCount次方个元素。数组中每个元素的类型是一个RGBQUAD结构,占4个字节。typ
29、edef struct tagRGBQUADBYTErgbBlue;/蓝色分量BYTErgbGreen;/绿色分量BYTErgbRed;/红色分量BYTErgbReserved;/保留值RGBQUAD;注意:注意:24位真彩色图中没有调色板数据!位真彩色图中没有调色板数据!位图信息-BITMAPINFO结构位 图 信 息 头 和 颜 色 表 组 成 位 图 信 息,BITMAPINFO结构定义如下:struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors1;/颜色表 BITMAPINFO;位图数据 结构 数据域 含义 B
30、ITMAPFILEHEADER bfType 字节“BM”bfSize 文件总字节数 BfReserved1 0 BfReserved1 0 bfOffBit 位图数据距文件头的偏移量 BITMAPINFOHEADER biSize 本结构大小的字节数 biWidth 位图的宽度,单位为像素点 biHeight 位图的高度,单位为像素点 biPlanes 1 biBitCount 像素的位数(1,4,8,24)biCompression 压缩方式(0表示不压缩)bisizeImage 位图数据的字节数biXpelsPerMeter 水平分辨率(像素点/米)biYpelsPerMeter 垂直分
31、辨率(像素点/米)biClrUsed 图像中使用的颜色数 biClrImportant 图像中重要的颜色数 RGBQUADrgbBlue 蓝色的比例 rgbGreen 绿色的比例 rgbRed 红色的比例 rgbReserved 0 实际的位图数据区(第四部分)第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该像素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的R,G,B值。下面就2色,16色,256色位图和真彩色位图分别介绍。对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。对于16色位图,用4位可以表示一个像素的颜色,
32、所以一个字节可以表示2个像素。对于256色位图,一个字节刚好可以表示1个像素。对于真彩色图,三个字节才能表示1个像素。注意:BMP文件的数据从下到上,从左到右的。获得文件路径名打开位图文件读取BITMAPFILEHEADER结构读取BITMAPINFOHEADER结构得到位图大小,分配内存空间BMP格式?获得数据的起始位置,保存起始位置指针结束开始打开BMP文件的流程图对文件的读取 通过CFile类来完成对文件的读取和写入,CFile类是MFC类库中专门完成文件读取的类,该类内部封装类WindowsAPI流式文件存取函数。使用简单、易懂。数据的声明 类的声明和相应变量、函数的定义在头文件“.h
33、”中完成,变量的引用和函数体在对应的“.cpp”文件中。类中的数据分为公用、保护和私有三种。公用数据用来被其他的函数和过程调用和修改,保护变量只可以调用不可以修改,而私有数据只有类内部的函数和行为可以调用和修改。这就是一种类的封装。公用数据和私有数据 public:int m_nTempPub;private:int m_nTempPri;protected:int m_nTempPro;各结构体内存的分配为BITMAPFILEHEADER申请一块内存空间,用来保存图像文件的文件头的结构信息;BITMAPFILEHEADER pbmfile=new BYTEsizeof(BITMAPFILEH
34、EADER);为BITMAPINFO申请一块内存空间,用来保存图像文件的图像结构信息;BITMAPINFO pbmfile=new BYTEsizeof(BITMAPINFO);为图像的点阵数据申请一块内存空间,用来保存图像点阵数据,当进行算法运算时,此数组中的数据用新的数据来替换。BYTE*new BYTEm_nWidth*m_nHeight;得到数据起始位置指针,并得到图象的宽、高等信息信息使用文件中颜色表创建调色板 调色板调入设备环境设定参数,显示位图 恢复原调色板设定参数显示位图带有颜色表?结束 开始图像显示的流程图显示图像数据图像数据的显示在视图的类中CView中进行,在视图的CPP
35、文件中的OnDraw(CDC*pDC)函数中可以完成这一绘制任务。应用程序的创建中当创建到视的客户区时既是调用改函数的默认格式完成对视区的绘制。我们只要将视区重新绘制一次即可完成绘制工作。调色板的基本应用 调色板的原理 调色板的创建与实现 显示函数调色板的原理 调色板就是在256色显示系统中,将图像中出现的256种颜色组成颜色表,对这些颜色按8位,即0至255进行编号,每一编号代表其中的一种颜色,在这种颜色中颜色编号叫做颜色的索引号。调色板的创建与实现 在调色板系统中,每一幅图像都有自己的调色板,显示时必须将自己的调色板载入系统调色板中,实现调色板。显示函数 在Visual C+环境中用于显示
36、的主要有BitBlt函数、StretchBlt函数和StretchDIBits函数。BitBlt函数和StretchBlt函数属于CDC类,而StretchDIBits函数为API函数。BitBltBitBlt()()函数函数该函数的结构如下:BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORD dwrop);参数说明:x:指定绘制目标矩形左上角的逻辑X轴位置。y:指定绘制目标矩形左上角的逻辑Y轴位置。nWidth:指定绘制目标矩形和源位图的宽度(按逻辑单位)。nHeight:指定绘制
37、目标矩形和源位图的高度(按逻辑单位)。pSrcDC:设备上下文的指针。xSrc,ySrc:指定源位图左上角的逻辑X轴、Y轴位置。dwrop:指定要执行的光栅运算。其操作码定义了图形设备接口(GDI)在输出操作中如何组合颜色。当要将位图的像素从内存显示环境复制到显示器(或打印机)设备环境中,一般会用到这个函数。StretchBltStretchBlt()函数()函数该函数的结构如下:BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight
38、,DWORD dwrop);参数说明:x:指定绘制目标矩形左上角的逻辑X轴位置。y:指定绘制目标矩形左上角的逻辑Y轴位置。nWidth:指定绘制目标矩形的宽度(按逻辑单位)。nHeight:指定绘制目标矩形的高度(按逻辑单位)。pSrcDC:设备上下文的指针xSrc,ySrc:指定源位图左上角的坐标(按逻辑单位)。nSrcWidth,nSrcHeight:指定复制源位图的宽度和高度(按逻辑单位)。dwrop:指定要执行的光栅运算。其操作码定义了图形设备接口(GDI)在输出操作中如何组合颜色。处理图像数据在Doc中通过两个函数afx_msg void OnSobel();和BOOL CImageProcessingDoc:Template(BYTE*lpDIBBits,LONG lWidth,LONG lHeight,int iTempH,int iTempW,int iTempMX,int iTempMY,FLOAT*fpArray,FLOAT fCoef);来完成,具体的函数结构和源代码在例程中。程序范例 具体编程讲解。讨论讨论与与答疑答疑
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。