这一章主要是练习一些图像的表示和描述,内容主要包括图像的一些常用表示方法,比如说链码,MPP,标记,边界片段,骨骼等。另一方面是图像的描述算子,比如说边界描述算子,区域描述算子等。有些课本练习的代码暂时还没有搞定。
其练习过程和结果如下所示:
1 %% 数组单元概念
2 clc
3 clear
4 f=imread('..\images\dipum_images_ch11\Fig1102(a)(noisy_circular_stroke).tif');
5 imshow(f);
6 [a b c d]=image_stats(f);
7 a=image_stats1(f);
8 b=image_stats2(f);
9
10 %% Freeman链码及其某些变体
11 clc
12 clear
13 f=imread('..\images\dipum_images_ch11\Fig1102(a)(noisy_circular_stroke).tif');
14 subplot(231),imshow(f);
15 title('freeman原图');
16
17 h=fspecial('average',9);%9*9平滑算子
18 g=imfilter(f,h,'replicate');%滤波
19 subplot(232),imshow(g);
20 title('freeman中值滤波后图像');
21
22 g=im2bw(g,0.5);%将原图像转换为二值图像
23 subplot(233),imshow(g);
24 title('freeman图像阈值处理后');
25
26 %函数boundaries(BW,CONN,DIR)表示的是跟踪目标的边界,返回值为一个p*1的数组单元,p为目标的个数
27 %每一个单元又是一个Q*2的矩阵,即Q个点的x,y坐标
28 B=boundaries(g);
29
30 %函数cellfun(FUN,C)是指对一个单元数组中的每一个单元应用函数FUN
31 d=cellfun('length',B);%求B中每一个目标边界的长度,所以返回值d是一个向量
32
33 [max_d,k]=max(d);%返回向量d中最大的值,存在max_d中,k为其索引。
34 v=B{k(1)};%如果最大边界不止一条,则取出其中的一条即可。v是一个坐标数组
35 [M,N]=size(g);
36
37 %函数bound2im(b,M,N,x0,y0)是生成一副二值图像,大小为M*N,x0和y0是b中最小的x和y轴坐标
38 g=bound2im(v,M,N,min(v(:,1)),min(v(:,2)));
39
40 subplot(234),imshow(g);
41 title('取出最大边界后图像');
42
43 % [S, SU] = bsubsamp(B, GRIDSEP)指的是对边界B进行子采样,每个GRIDSEP个点采样一次
44 %输出S是采样后的值,输出SU是归一化的边界,什么意思?
45 [s,su]=bsubsamp(v,50);
46 g2=bound2im(s,M,N,min(s(:,1)),min(s(:,2)));
47 subplot(235),imshow(g2);
48 title('蒋采样后的边界图像');
49
50 %connectpoly(X,Y)函数是按照坐标(X,Y)顺时针或者逆时针连接成多边形
51 cn=connectpoly(s(:,1),s(:,2));
52 g2=bound2im(cn,M,N,min(cn(:,1)),min(cn(:,2)));
53 subplot(236),imshow(g2);
54 title('连接成多边形图像');
55%freeman链码过程如下:
56
57 %函数fchcode为计算边界的freeman链码
58 c=fchcode(su);
59%链码结果:
60
61 %% 获得一个区域的边界的细胞墙(木有搞定)
62 clc
63 clear
64 f=imread('..\images\dipum_images_ch11\Fig1107(a)(mapleleaf).tif');
65 subplot(231),imshow(f);
66 title('原图像');
67
68 B=bwperim(f,8);%返回一个包含二进制图像的边界图像,采用4近邻
69 subplot(232),imshow(B);
70 title('二进制边界图像');
71
72 Q=qtdecomp(B,0,2);%对B图进行四叉树分解,最小尺寸为2*2,用0做阈值
73 subplot(233),imshow(Q);
74 title('四叉树分解后图像')
75
76 %% 使用函数minperpoly
77 clc
78 clear
79 f=imread('..\images\dipum_images_ch11\Fig1107(a)(mapleleaf).tif');
80 subplot(231),imshow(f);
81 title('原图像');
82
83 b=boundaries(f,4,'cw');%找出B的边界,顺时针4邻接
84 b=b{1};%因为这幅图比较特殊,它只有一个边界物体
85 [M,N]=size(f);
86 xmin=min(b(:,1));
87 ymin=min(b(:,2));
88 bim=bound2im(b,M,N,xmin,ymin);%将边界物体转换成边界图像
89 subplot(232),imshow(bim);
90 title('找出的边界图像');
91
92 % [X, Y] = minperpoly(F, CELLSIZE)为计算二值图像的最小周长多边形
93 [x,y]=minperpoly(f,2)%2为用于形成边界方形的大小,x和y是MPP上顶点的坐标
94
95 b2=connectpoly(x,y);%将顶点依次连接成多边形
96 b2=bound2im(b2,M,N,xmin,ymin);
97 subplot(233),imshow(b2);
98 title('使用大小为2*2的方形边界单元获得的MPP');
99
100 [x,y]=minperpoly(f,3)%2为用于形成边界方形的大小,x和y是MPP上顶点的坐标
101 b3=connectpoly(x,y);%将顶点依次连接成多边形
102 b3=bound2im(b3,M,N,xmin,ymin);
103 subplot(234),imshow(b3);
104 title('使用大小为3*3的方形边界单元获得的MPP');
105
106 [x,y]=minperpoly(f,4)%2为用于形成边界方形的大小,x和y是MPP上顶点的坐标
107 b4=connectpoly(x,y);%将顶点依次连接成多边形
108 b4=bound2im(b4,M,N,xmin,ymin);
109 subplot(235),imshow(b4);
110 title('使用大小为4*4的方形边界单元获得的MPP');
111
112 [x,y]=minperpoly(f,8)%2为用于形成边界方形的大小,x和y是MPP上顶点的坐标
113 b8=connectpoly(x,y);%将顶点依次连接成多边形
114 b8=bound2im(b8,M,N,xmin,ymin);
115 subplot(236),imshow(b8);
116 title('使用大小为8*8的方形边界单元获得的MPP');
117%使用minperpoly过程如下:
118
119 %% 标记(木有搞定)
120 clc
121 clear
122 f=imread('..\images\dipum_images_ch11\Fig1111(a)(boundary_sq.tif');
123 imshow(f);
124 title('标记原图');
125
126 [st,angle,x0,y0]=signature(f);
127 plot(angle,st)
128
129 %% 计算一个区域的骨骼
130 clc
131 clear
132 f=imread('..\images\dipum_images_ch11\Fig1113(a)(chromo_original).tif');
133 subplot(231),imshow(f);
134 whos f;%其实是个二值图像
135 title('人体染色体原始图');
136
137 f=im2double(f);%不再是二值图像了
138 h=fspecial('gaussian',25,25);
139 g=imfilter(f,h,'replicate');
140 subplot(232),imshow(g);
141 title('高斯平滑后的图像');%为什么平滑后那些杂点就没了呢,至少平滑到那点时像素值它自己的权值最大的啊?
142
143 g=im2bw(g,1.5*graythresh(g));%其中的graythresh()函数为自动阈值,处理后g为二值图像了
144 subplot(233),imshow(g);
145 title('经阈值处理后');
146
147 s=bwmorph(g,'skel',Inf);%提取骨骼,bwmorph为二进制形态学处理函数
148 subplot(234),imshow(s);
149 title('骨骼化后图像');
150
151 s1=bwmorph(s,'spur',8);%删除毛刺
152 subplot(235),imshow(s1);
153 title('8次去毛刺后');
154
155 s2=bwmorph(s1,'spur',7);%删除毛刺
156 subplot(236),imshow(s2);
157 title('再7次去毛刺后');
158%提取染色体骨骼图过程如下:
159
160 %% 傅里叶描述子
161 clc
162 clear
163 f=imread('..\images\dipum_images_ch11\Fig1113(a)(chromo_original).tif');
164 subplot(331),imshow(f);
165 whos f;%其实是个二值图像
166 title('人体染色体原始图');
167
168 f=im2double(f);%不再是二值图像了
169 h=fspecial('gaussian',15,9);
170 g=imfilter(f,h,'replicate');
171 g=im2bw(g,0.7);%其中的graythresh()函数为自动阈值,处理后g为二值图像了
172 subplot(332),imshow(g);
173 title('经阈值处理后');
174
175 b=boundaries(g);
176 b=b{1};
177 bim=bound2im(b,344,270);%344,270为图片的尺寸
178 subplot(333),imshow(bim);
179 title('提取的边界图');
180
181 z=frdescp(b);%对边界坐标b进行傅里叶变换系数(有多少个点就有多少个系数),将b的坐标点看成是复平面中的某个复数
182 z14=ifrdescp(z,546);%用50%的描述子进行逆变换
183 z546im=bound2im(z14,344,270);
184 subplot(334),imshow(z546im);
185 title('546个描述子恢复后');
186
187 z110=ifrdescp(z,110);%用50%的描述子进行逆变换
188 z110im=bound2im(z110,344,270);
189 subplot(335),imshow(z110im);
190 title('110个描述子恢复后');
191
192 z56=ifrdescp(z,56);%用50%的描述子进行逆变换
193 z56im=bound2im(z56,344,270);
194 subplot(336),imshow(z56im);
195 title('56个描述子恢复后');
196
197 z28=ifrdescp(z,28);%用50%的描述子进行逆变换
198 z28im=bound2im(z28,344,270);
199 subplot(337),imshow(z28im);
200 title('28个描述子恢复后');
201
202 z14=ifrdescp(z,14);%用50%的描述子进行逆变换
203 z14im=bound2im(z14,344,270);
204 subplot(338),imshow(z14im);
205 title('14个描述子恢复后');
206
207 z8=ifrdescp(z,8);%用50%的描述子进行逆变换
208 z8im=bound2im(z8,344,270);
209 subplot(339),imshow(z8im);
210 title('8个描述子恢复后');
211%傅里叶描述子图过程:
212
213 %% 函数regionprops的使用
214 clc
215 clear
216 B = [1 1 1 0 0 0 0 0
217 1 1 1 0 1 1 0 0
218 1 1 1 0 1 1 0 0
219 1 1 1 0 0 0 0 0
220 1 1 1 0 0 0 1 0
221 1 1 1 0 0 0 1 0
222 1 1 1 0 0 1 1 0
223 1 1 1 0 0 0 0 0];
224 B=bwlabel(B);%将矩阵B变成标记矩阵,默认为8连通,将连通区域用不同的整数给标记出来
225
226 D=regionprops(B,'area','boundingbox')
227 w=[D.Area]
228 NR=length(w)
229
230 V=cat(1,D.BoundingBox)%cat函数表示沿着第一个方向级联存放数组
231%该函数的使用过程如下:
232
233 %% 统计纹理度量(木有搞定)
234 clc
235 clear
236 f=imread('..\images\dipum_images_ch11\Fig1119(a)(superconductor-with-window).tif');
237 sA=imhist(f);
238 statxture(sA)%计算图像的6个统计度量量
239
240 %% 计算频谱纹理
241 clc
242 clear
243
244 f1=imread('..\images\dipum_images_ch11\Fig1121(a)(random_matches).tif');
245 subplot(241),imshow(f1);
246 title('随机排列火柴');
247
248 f2=imread('..\images\dipum_images_ch11\Fig1121(b)(ordered_matches).tif');
249 subplot(245),imshow(f2);
250 title('规则排列火柴');
251
252 [srad1,sang1,s1]=specxture(f1);
253 subplot(242),imshow(s1);
254 title('随机排列火柴频谱图');
255
256 subplot(243),plot(srad1);
257 title('随机排列火柴幅度图');
258
259 subplot(244),plot(sang1);
260 title('随机排列火柴角度图');
261
262 [srad2,sang2,s2]=specxture(f2);
263 subplot(246),imshow(s2);
264 title('规则排列火柴频谱图');
265
266 subplot(247),plot(srad2);
267 title('规则排列火柴幅度图');
268
269 subplot(248),plot(sang2);
270 title('规则排列火柴角度图');
271%计算频谱纹理图过程如下:
272
273 %% 不变矩
274 clc
275 clear
276 f=imread('..\images\dipum_images_ch11\Fig1123(a)(Original_Padded_to_568_by_568).tif');
277 imshow(f);
278 title('不变矩原图');
279%不变矩原始图像如下:
280
281 %padarray函数为矩阵0填充,图像原始大小为400*400,但是需要旋转45度,所以最大变为568*568
282 fp=padarray(f,[84 84],'both');%因此四个方向每个方向都要扩充84个像素
283
284 fhs=f(1:2:end,1:2:end);%表示从第一个到最后一个,每2个采样一次
285 figure,subplot(221),imshow(fhs);
286 title('半大图像');
287 fhsp=padarray(fhs,[184 184],'both');
288
289 fm=fliplr(f);
290 subplot(222),imshow(fm);
291 title('镜面图像');
292 fmp=padarray(fm,[84 84],'both');
293
294 fr2=imrotate(f,2,'bilinear');%旋转2度,双线性插值
295 subplot(223),imshow(fr2);
296 title('旋转2度后图像');
297
298 fr45=imrotate(f,45,'bilinear');
299 subplot(224),imshow(fr45);
300 title('旋转45度后图像');
301%不变矩变换图像如下:
302
303 phiorig=abs(log(invmoments(f)))
304 phihalf=abs(log(invmoments(fhs)))
305 phimirror=abs(log(invmoments(fm)))
306 phirot2=abs(log(invmoments(fr2)))
307 phirot45=abs(log(invmoments(fr45)))
308%这5幅图像的7个不变矩图像如下:
309
310 %图像主分量
311 clc
312 clear
313 f1=imread('..\images\dipum_images_ch11\Fig1125(a)(WashingtonDC_Band1_512).tif');
314 subplot(231),imshow(f1);
315 title('可见蓝色波段图像');
316
317 f2=imread('..\images\dipum_images_ch11\Fig1125(b)(WashingtonDC_Band2_512).tif');
318 subplot(232),imshow(f2);
319 title('可见绿色波段图像');
320
321 f3=imread('..\images\dipum_images_ch11\Fig1125(c)(WashingtonDC_Band3_512).tif');
322 subplot(233),imshow(f3);
323 title('可见红色波段图像');
324
325 f4=imread('..\images\dipum_images_ch11\Fig1125(d)(WashingtonDC_Band4_512).tif');
326 subplot(234),imshow(f4);
327 title('近红外光图像');
328
329 f5=imread('..\images\dipum_images_ch11\Fig1125(e)(WashingtonDC_Band5_512).tif');
330 subplot(235),imshow(f5);
331 title('中红外光图像');
332
333 f6=imread('..\images\dipum_images_ch11\Fig1125(f)(WashingtonDC_Band6_512).tif');
334 subplot(236),imshow(f6);
335 title('热红外光图像');
336%6幅多谱图像显示结果如下:
337
338 S=cat(3,f1,f2,f3,f4,f5,f6);%将6幅图像在第三维中连接起来
339 [X,R]=imstack2vectors(S);%将S组织到数组X中
340 p=princomp(X,6);%princomp用来获得6幅图像的主分量
341
342 g1=p.Y(:,1);%计算第1主维分量
343 g1=reshape(g1,512,512);
344 figure,subplot(231),imshow(g1,[]);
345
346 g2=p.Y(:,2);%计算第2主维分量
347 g2=reshape(g2,512,512);
348 subplot(232),imshow(g2,[]);
349
350 g3=p.Y(:,3);%计算第3主维分量
351 g3=reshape(g3,512,512);
352 subplot(233),imshow(g3,[]);
353
354 g4=p.Y(:,4);%计算第4主维分量
355 g4=reshape(g4,512,512);
356 subplot(234),imshow(g4,[]);
357
358 g5=p.Y(:,5);%计算第5主维分量
359 g5=reshape(g5,512,512);
360 subplot(235),imshow(g5,[]);
361
362 g6=p.Y(:,6);%计算第6主维分量
363 g6=reshape(g6,512,512);
364 subplot(236),imshow(g6,[]);
365%主分量分解过程如下:
图像的表示和描述对后面做计算机视觉处理起来很大的作用。当然针对不同的研究对象其表示和描述的特点也不同。