




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建。基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换几种算法进行组合,就可以实现一些非常复杂的功能,而且逻辑严密。这里给出形态学的一般原理,以及用形态学进行边界提取,角点提取好骨架提取的原代码一 引言 数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到19世纪。1964年法国的Matheron和Serra在积分几何的研究成果上,将数学形态学引入图像处
2、理领域,并研制了基于数学形态学的图像处理系统。1982年出版的专著Image Analysis and Mathematical Morphology是数学形态学发展的重要里程碑,表明数学形态学在理论上趋于完备及应用上不断深入。数学形态学蓬勃发展,由于其并行快速,易于硬件实现,已引起了人们的广泛关注。目前,数学形态学已在计算机视觉、信号处理与图像分析、模式识别、计算方法与数据处理等方面得到了极为广泛的应用。 数学形态学可以用来解决抑制噪声、特征提取、边缘检测、图像分割、形状识别、纹理分析、图像恢复与重建、图像压
3、缩等图像处理问题。该文将主要对数学形态学的基本理论及其在图像处理中的应用进行综述。二 数学形态学的定义和分类 数学形态学是以形态结构元素为基础对图像进行分析的数学工具。它的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并除去不相干的结构。数学形态学的基本运算有4个:膨胀、腐蚀、开启和闭合。它们在二值图像中和灰度图像中各有特点。基于这些基本运算还可以推导和组合成各种数学形态学
4、实用算法。(1)二值形态学 数学形态学中二值图像的形态变换是一种针对集合的处理过程。其形态算子的实质是表达物体或形状的集合与结构元素间的相互作用,结构元素的形状就决定了这种运算所提取的信号的形状信息。形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算。 基本的形态运算是腐蚀和膨胀。 在形态学中,结构元素是
5、最重要最基本的概念。结构元素在形态变换中的作用相当于信号处理中的“滤波窗口”。用B(x)代表结构元素,对工作空间E中的每一点x,腐蚀和膨胀的定义为: 用B(x)对E进行腐蚀的结果就是把结构元素B平移后使B包含于E的所有点构成的集合。用B(x)对E进行膨胀的结果就是把结构元素B平移后使B与E的交集非空的点构成的集合。先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭
6、运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。 可见,二值形态膨胀与腐蚀可转化为集合的逻辑运算,算法简单,适于并行处理,且易于硬件实现,适于对二值图像进行图像分割、细化、抽取骨架、边缘提取、形状分析。但是,在不同的应用场合,结构元素的选择及其相应的处理算法是不一样的,对不同的目标图像需设计不同的结构元素和不同的处理算法。结构元素的大小、形状选择合适与否,将直接影响图像的形态运算结果。因此,很多学者结合自己的应用实际,提出了一系列的改进算法。如梁勇提出的用多方位形态学结构元素进行边缘检测算法既具有
7、较好的边缘定位能力,又具有很好的噪声平滑能力。许超提出的以最短线段结构元素构造准圆结构元素或序列结构元素生成准圆结构元素相结合的设计方法,用于骨架的提取,可大大减少形态运算的计算量,并可同时满足尺度、平移及旋转相容性,适于对形状进行分析和描述。(2)灰度数学形态学 二值数学形态学可方便地推广到灰度图像空间。只是灰度数学形态学的运算对象不是集合,而是图像函数。以下设f(x,y)是输入图像,b(x,y)是结构元素。用结构元素b对输入图像y进行膨胀和腐蚀运算分别定义为:对灰度图像的膨胀(或腐蚀)操作有两类效果:(1)
8、如果结构元素的值都为正的,则输出图像会比输入图像亮(或暗);(2)根据输入图像中暗(或亮)细节的灰度值以及它们的形状相对于结构元素的关系,它们在运算中或被消减或被除掉。灰度数学形态学中开启和闭合运算的定义与在二值数学形态学中的定义一致。用b对f进行开启和闭合运算的定义为:(3)模糊数学形态学 将模糊集合理论用于数学形态学就形成了模糊形态学。模糊算子的定义不同,相应的模糊形态运算的定义也不相同。在此,选用Shinba的定义方法。模糊性由结构元素对原图像的适应程度来确定。用有界支撑的模糊结构元素对模糊图像的腐蚀和膨
9、胀运算按它们的隶属函数定义为: 其中,x,yZ2代表空间坐标,ua,ub分别代表图像和结构元素的隶属函数。从(7),(8)式的结果可知,经模糊形态腐蚀膨胀运算后的隶属函数均落在0,1的区间内。模糊形态学是传统数学形态学从二值逻辑向模糊逻辑的推广,与传统数学形态学有相似的计算结果和相似的代数特性。模糊形态学重点研究n维空间目标物体的形状特征和形态变换,主要应用于图像处理领域,如模糊增强、模糊边缘检测、模糊分割等。 三 数学形态学在图像处理中的主要应用近年来,数学形态学在图像处理方面得到了日益广泛的应用。下面主要就数学形态学在边缘检测、图像分割、图像细化以及噪声滤除等
10、方面的应用做简要介绍。(1) 边缘检测边缘检测是大多数图像处理必不可少的一步,提供了物体形状的重要信息。对于二值图像,边缘检测是求一个集合A的边界,记为B(A): 对于灰度图像,边缘检测是求一幅图像的形态学梯度,记为g:数学形态学运算用于边缘检测,存在着结构元素单一的问题。它对与结构元素同方向的边缘敏感,而与其不同方向的边缘(或噪声)会被平滑掉,即边缘的方向可以由结构元素的形状确定。但如果采用对称的结构元素,又会减弱对图像边缘的方向敏感性。所以在边缘检测中,可以考虑用多方位的形态结构元素,运用不同的结构
11、元素的逻辑组合检测出不同方向的边缘。梁勇等人构造了8个方向的多方位形态学结构元素,应用基本形态运算,得到8个方向的边缘检测结果,再把这些结果进行归一化运算、加权求和,得到最终的图像边缘。该算法在保持图像细节特征和平滑边缘等方面,取得了较好的效果。边缘检测源代码:1. /* 2. 形态学基本操作采用二值图像 3. */ 4. #include<cv.h> 5. #include <highgui.h> 6. int main() 7.
12、 IplImage * image,*image2,*image3; 8. image = cvLoadImage("E:imagemapleleaf.tif", 0); 9. cvNamedWindow("image",1); 10. cvShowI
13、mage("image",image); 11. 12. 13. /*边界提取*/ 14. image2 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1); 15.
14、; image3 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1); 16. int i , j 17. int left,right, up , down; 18.
15、0;int n = 2;/窗口大小为5*5 19. int r,s,flag; 20. unsigned char * ptr, *dst; 21. for (i = 0 i< image->height; i+) 22.
16、160; 23. for (j = 0 j< image->width; j+) 24. 25. /窗口设定 26
17、. left = j - n; 27. right = j +n; 28. up
18、;= i -n; 29. down = i+n; 30. /窗口出界处理 31. if(left&
19、lt; 0)left = 0; 32. if(right >= image->width)right = image->width-1; 33. if(up< 0)up =0;&
20、#160; 34. if(down >= image->height)down = image->height -1; 35. 36. /腐蚀处理 37.
21、; dst = (unsigned char *)image2->imageData + image2->widthStep*i + j; 38. flag = 1; 39.
22、60; for (r = up;r <= down;r+) 40. 41. for (s
23、60;= left s<= right; s+) 42. 43. ptr = (
24、unsigned char *)image->imageData + r*image->widthStep + s; 44. 45. if(*ptr != 255) 46. &
25、#160; flag = 0; 47. 48.
26、0; 49. 50. if (flag = 1) 51.
27、 52. *dst = 255; 53. 54.
28、60; else 55. *dst = 0; 56. 57. 58.
29、 59. 60. cvSub(image,image2,image3,0); 61. cvNamedWindow("image3",1); 62. cvShowImage("image3",image3); 63. cvSaveIm
30、age("mapleleafboard.bmp", image3); 64. cvWaitKey(0); 65. cvReleaseImage(&image); 66. cvReleaseImage(&image2); 67. cvReleaseImage(&image3);&
31、#160; 68. cvDestroyAllWindows(); 69. return 0 70. 原图:边界提取: (2) 图像分割基于数学形态学的图像分割算法是利用数学形态学变换,把复杂目标X分割成一系列互不相交的简单子集X1,X2,XN,即:对目标X的分割过程可按下面的方法完成:首先求出X的最大内接“圆”
32、X1,然后将X1从X中减去,再求X-X1的最大内接“圆”X2,依此类推,直到最后得到的集合为空集为止。下面以二值图像为例,介绍用数学形态学方法求解子集X1,X2,XN的过程。设B为结构元素,B可以是圆、三角形、正方形等简单的几何基元,那么“简单”形状集合Xi可以用下面的公式来定义:式中ni为一整数,用上式定义Xi分割目标,有时会产生分割过程不唯一的现象。为此可采用下面公式来定义简单集合Xi:其中Li为一个点或一条线,当Li为点时,则与(12)式定义等价。(13)式定义的简单形状Xi可由niB沿线Li移动而产生。即将“产生器”niB的中心沿“脊骨”Li移动产生。如果niB为圆,则得到的Xi称Bl
33、um带。它具有一些特殊的性质,如Xi的边界是光滑的,Xi的最大圆与其边界相切,Xi的脊骨与产生器都是唯一的等等。有了简单形状集合Xi的定义,则目标X可按下面方法分割。首先按式(14)求出X的最大内切结构元素Xi:数学形态学用于图像分割的缺点是对边界噪声敏感。为了改善这一问题,刘志敏等人提出了基于图像最大内切圆的数学形态学形状描述图像分割算法和基于目标最小闭包结构元素的数学形态学形状描述图像分割算法,并使用该算法对二值图像进行了分割,取得了较好的效果。邓世伟等人提出一种基于数学形态学的深度图像分割算法。作者首先利用形态学算子获得分别含有阶跃边缘与屋脊边缘的凸脊和凹谷图像,然后利用控制区域生长过程
34、得到最终的分割结果。与传统方法相比,该方法速度快,抗噪性能好。 (3) 形态骨架提取形态骨架描述了物体的形状和方向信息。它具有平移不变性、逆扩张性和等幂性等性质,是一种有效的形状描述方法。二值图像A的形态骨架可以通过选定合适的结构元素B,对A进行连续腐蚀和开启运算来求取,设S(A)代表A的骨架,定义为:蒋刚毅等人运用数学形态学方法,对交通标志的内核形状提取形态骨架函数,将其作为用于模式匹配的形状特征。A的形态骨架函数SKF(A)表示为:SKF(X)中值较大的点对应大的n,并代表了形态骨架的主要成分,即表
35、达了形状的主体结构;而SKF(X)中值较小的点对应小的n,是形态骨架的细节成分,与形状的边缘信息相联系。形态骨架函数完整简洁地表达了形态骨架的所有信息,因此,根据形态骨架函数的模式匹配能够实现对不同形状物体的识别。算法具有位移不变性,因而使识别更具稳健性。 骨架提取原代码:1. /*/ 2. /* 骨架提取*/ 3. /*/ 4. #include<cv.h> 5. #include <highgui.h> 6. int
36、main() 7. IplImage* image = cvLoadImage("E:imagebone.tif",0); 8. cvNamedWindow("image",1); 9. cvNamedWindow("image2",1); 10.
37、160; cvNamedWindow("image3",1); 11. cvNamedWindow("image4",1); 12. cvNamedWindow("image5",1); 13. cvNamedWindow("image6",1); 14.
38、0;15. cvNamedWindow("result",1); 16. cvShowImage("image", image); 17. /cvWaitKey(0); 18. /当前图片image2 当前被腐蚀后的图片image3 被腐蚀开操作之后的图片
39、160;image5 19. /image4 作为开操作的中间值 作差后的图片image6 并之后的图片result 20. IplImage *image2, *image3 , *image4, *image5,*image6,*result; 21. im
40、age2 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1); 22. image3 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1); 23. image5 = cvCreateImage(cvSize(im
41、age->width,image->height),IPL_DEPTH_8U,1); 24. image4 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1); 25. image6 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPT
42、H_8U,1); 26. result = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1); 27. 28. /循环标志 flag 29. bool flag =
43、true; 30. /腐蚀判断标志 flag2 31. bool flag2 = true; 32. int i,j,r,s; 33. unsigned char * ptr,*dst; 34.
44、; unsigned char B9 = 255 ,255,255,255,255,255,255,255,255; 35. /对result进行赋值 全部为0 36. for (i = 0 i< result->height; i+) 37. &
45、#160; 38. for (j = 0 j< result->width j+) 39. 40.
46、 dst = (unsigned char *)(result->imageData + result->widthStep *i +j); 41. *dst = 0; 42.
47、160; 43. 44. image2 = cvCloneImage(image); 45. cvShowImage("image2", image2); 46. /cvWaitKey(0); 47.
48、0;while (flag) 48. 49. /flag = false; 50. cvShowImage("image2",image2); 51.
49、0; /进行腐蚀操作,开环操作 作差 并 52. for (i = 0 i< image3->height; i+) 53. 54.
50、0; for (j = 0 j< image3->width j+) 55. 56. dst =
51、60; (unsigned char *)(image3->imageData + i*image3->widthStep + j); 57. if (i = 0 )| (j = 0) |( i =
52、60;image->height -1 ) | (j = image->width -1 ) 58. 59.
53、160; *dst = 0; 60. /break; 61.
54、0; 62. else 63. flag2 = true; 64. &
55、#160; for (r = i-1 r<= i+1 r+) 65. 66.
56、160; for (s = j -1 s<= j+1 s+) 67. &
57、#160; 68. ptr = (unsigned char *)(image2->imageData + r*image2->widthStep + j); 69
58、. if(*ptr != 255) 70.
59、; flag2 =false; 71. 72.
60、60; 73. 74. &
61、#160;75. if (flag2) 76. 77.
62、0; *dst = 255; 78. 79.
63、; else *dst = 0; 80. 81. 82.
64、 83. cvShowImage("image3",image3); 84. 85. 86. /开操作 先腐蚀 后膨胀 87.
65、60; for (i = 0 i< image4->height; i+) 88. 89. for (j = 0 j< imag
66、e4->width j+) 90. 91. dst = (unsigned char *)(image4->imageData
67、60;+ i*image4->widthStep + j); 92. if (i = 0 )| (j = 0) |( i = image->height -1 ) | (j =
68、0;image->width -1 ) 93. 94. *dst = 0;&
69、#160; 95. /break; 96. 97.
70、 else 98. flag2 = true; 99. &
71、#160; for (r = i-1 r<= i+1 r+) 100. 101.
72、 for (s = j -1 s<= j+1 s+) 102. 103.
73、; ptr = (unsigned char *)(image3->imageData + r*image3->widthStep + s); 104.
74、; if(*ptr != 255) 105.
75、; flag2 =false; 106. 107. &
76、#160; 108. 109. 110.
77、0; if (flag2) 111. 112.
78、60; *dst = 255; 113. 114. else *dst =
79、;0; 115. 116. 117. 118. &
80、#160; cvShowImage("image4",image4); 119. /膨胀操作 120. for (i = 0 i< image5->height; i+) 121.
81、 122. for (j = 0 j< image5->width j+) 123.
82、 124. dst = (unsigned char *)(image5->imageData + i*image5->widthStep + j); 125. &
83、#160; if (i = 0 )| (j = 0) |( i = image5->height -1 ) | (j = image5->width -1 ) 126.
84、160; 127. *dst = 0; 128.
85、60; /break; 129. 130. else 131. &
86、#160; flag2 = false; 132. for (r = i-1 r<= i+1 r+)
87、;133. 134. for (s = j -1 s<= j+1&
88、#160; s+) 135. 136.
89、 ptr = (unsigned char *)(image4->imageData + r*image4->widthStep + s); 137. if(*pt
90、r = 255) 138. flag2 = true; 139.
91、60; 140. 141.
92、; 142. 143. if (flag2) 144.
93、; 145. *dst = 255; 146.
94、0; 147. else *dst = 0; 148. &
95、#160; 149. 150. 151. cvShowImage("image5",image5);&
96、#160; 152. 153. 154. /作差 155. cvSub(image3,image5,image6,0); 156. /并运算 157. for (i =
97、0 i< result->height; i+) 158. 159. for (j = 0 j< result->width j+) 160.
98、; 161. dst = (unsigned char *)(result->imageData + result->widthStep *i +j); 162.
99、 ptr = (unsigned char *)(image6->imageData + image6->widthStep *i +j); 163. if (*ptr = 255)
100、 164. 165. 166. *dst = 255; 167. &
101、#160; 168. 169. 170. cvShowImage("image6",image6);&
102、#160; 171. /将腐蚀后的图像复制给当前图像image2 172. image2 = cvCloneImage(image3); 173. 174. /循环标志判定 175. flag
103、 = false; 176. for (i = 0 i< image2->height; i+) 177. 178. for (j =
104、;0 j< image2->width j+) 179. 180. 181. &
105、#160; ptr = (unsigned char *)(image2->imageData + image2->widthStep *i +j); 182. if (*ptr = 255) 183.
106、160; 184. flag = true; 185.
107、 186. 187. 188. cvShowImage("result", result); 189. &
108、#160;cvWaitKey(40); 190. 191. 192. cvShowImage("image2", image2); 193. cvShowImage("image3", image3); 194.
109、0; /cvShowImage("image4", image4); 195. /cvShowImage("image5", image5); 196. /cvShowImage("image6", image6); 197. cvShowImage("result&
110、quot;,result); 198. cvSaveImage("E:imagebonegujia.bmp",result); 199. cvWaitKey(0); 200. cvReleaseImage(&image); 201. cvDestroyAllWindows(); &
111、#160;202. return 0; 203. 原图:提取的骨架:DNA原图:骨架:形态学算法对于提取交叉的物体,会产生断裂,一般会在提取之后紧跟连接操作。角点提取源代码:采用击中击不中变换1. /* 2. 形态学基本操作采用二值图像 形态学方法在边界获取和形状检测中有很多应用 寻找角点 3. */ 4. #include<cv.h> 5. #include <highgui.h
112、> 6. int main() 7. IplImage * image,*image2,*image3,*image4,*result; 8. image = cvLoadImage("E:imagejiaodian.bmp", 0); 9. cvNamedWindow("
113、;image",1); 10. cvShowImage("image",image); 11. 12. 13. /*击中击不中变换 寻找角点*/ 14. /*/ 15. /* 最终结果为
114、(79, 85 )和 (129 ,134)两个符合要求的角点 在结果图像中可以看到两个白点*/ 16. /*/ 17. image2 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1); 18.
115、 image3 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1); 19. image4 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1); 20. resu
116、lt = cvCreateImage(cvSize(image->width, image->height),image->depth ,1); 21. 22. int i,j,r,s 23. unsigned char B19 = 255,255,255,255,0,0,255,0,0; &
117、#160;24. unsigned char B29 = 0,0,0,0,255,255,0,255,255 25. int flag; 26. /iamge2 是对image进行求补的结果 27. unsigned char *ptr, *dst,*ptr2; 2
118、8. for (i = 0 i< image2->height; i+) 29. 30. for (j = 0 j< image2->width; j+) 31.
119、0; 32. ptr = (unsigned char*)image->imageData + i * image->widthStep+ j; 33.
120、; dst = (unsigned char*)image2->imageData + i*image2->widthStep + j; 34. *dst = 255- (*ptr); 35. 36.
121、160; 37. 38. 39. /对源图像进行腐蚀 40. for (i = 0 i< image3->height; i+) 41.
122、 42. for (j = 0 j< image3->width; j+) 43. 44. flag
123、= 1; 45. dst = (unsigned char*)image3->imageData + i*image3->widthStep +j; 46. /边界判断
124、60;47. if ( i = 0) | (j = 0) | (i = image3->height-1) | (j = image3->width -1 ) 48. &
125、#160; 49. *dst = 0; 50. 51.
126、 else 52. for (r = i -1 r<= i+1; r+) 53.
127、160; 54. for (s = j-1 s <=&
128、#160;j +1 s+) 55. 56.
129、; ptr = (unsigned char*)image->imageData + r * image->widthStep+ s; 57.
130、0; if (*ptr != B13*(r-i+1) + s-j+1) 58.
131、60; 59. flag = 0; 60.
132、 break; 61. 62
133、. 63. 64.
134、160; if (flag = 1) 65. 66.
135、160; ptr = (unsigned char*)image->imageData + i * image->widthStep+ j; 67. &
136、#160; *dst = 255; 68. 69.
137、160; else 70. *dst = 0;
138、;71. 72. 73. 74. 75.
139、60; 76. 77. 78. /显示腐蚀结果 79. 80. for (i = 0 i< image2->height; i+) 81.
140、; 82. for (j = 0 j< image2->width; j+) 83. 84. ptr
141、 = (unsigned char*)image->imageData + i * image->widthStep+ j; 85. ptr2 = (unsigned char*)image3->imageData + i*image3->widthStep +
142、0;j; 86. if (*ptr2 = 255) 87. 88. &
143、#160; printf("x, %d y: %d %dn",j, i, *ptr2 - *ptr); 89. 90.
144、 91. 92. 93. /对补图像进行腐蚀 94. for (i = 0 i< image4->height; i+) 95
145、. 96. for (j = 0 j< image4->width; j+) 97. 98.
146、160; flag = 1; 99. dst = (unsigned char*)image4->imageData + i*image4->widthStep +j; 100.
147、; /边界判断 101. if ( i = 0) | (j = 0) | (i = image4->height-1) | (j = image4->width -1 ) 102. 103.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 绿色创新与企业ESG表现对价值的影响
- 肿瘤痛的充分镇痛讲课文档
- 跨部门协同培养人才心得体会
- 部编版一年级下册看图写话范文读写结合
- 2025年国际贸易实务操作模拟考试及解析手册
- 数智化转型对制造业生产力的推动作用
- 2025年人工智能领域招聘笔试模拟题集与解析
- 绿色供应链管理在制造业中的绿色供应链信息化建设与挑战应对报告
- 2025年云计算服务提供商产品经理面试预测题集
- 2025年光伏系统设计与安装实战演练高级模拟题集
- 两个女儿断绝关系协议书范文
- 多囊卵巢综合征合并胰岛素抵抗诊治专家共识
- 竞选竞选大学心理委员参考课件
- 2024年数控车工技能竞赛理论考试题库500题(含答案)
- 牙体牙髓病学(山东联盟)智慧树知到答案2024年滨州医学院
- 《矿物岩石学》全套教学课件
- 全国职业院校宠物营养学知识竞赛备考试题库(含答案)
- JTG-D82-2009公路交通标志和标线设置规范
- 教学课件 《公共政策概论》谢明
- 《民航基础第一章》课件
- 化学物理与材料科学
评论
0/150
提交评论