这一章中主要是用数字图像处理技术对图像进行分割。因为图像分割是个比较难的课题。这里练习的是比较基本的。包过点、线和边缘的检测,hough变换的应用,阈值处理,基于区域的分割以及基于分水岭方法的分割。
其练习代码和结果如下:
1 %% 图像分割
2
3 %% 点检测
4 clc
5 clear
6 f=imread(\'.\images\dipum_images_ch10\Fig1002(a)(test_pattern_with_single_pixel).tif\');
7 subplot(121),imshow(f),title(\'点检测原图\');
8
9 w=[-1,-1,-1;
10 -1,8,-1;
11 -1,-1,-1]
12 g=abs(imfilter(double(f),w));
13 subplot(122),imshow(g),title(\'点检测结果\');
14%点检测图结果如下:
15
16 %% 非线性滤波点检测
17 clc
18 clear
19 f=imread(\'.\images\dipum_images_ch10\Fig1002(a)(test_pattern_with_single_pixel).tif\');
20 subplot(121),imshow(f),title(\'非线性滤波点检测原图\');
21
22 m=3;
23 n=3;
24 %ordfilt2(f,order,domin)表示的是用矩阵domin中为1的地方进行排序,然后选择地order个位置的值代替f中的值,属于非线性滤波
25 g=imsubtract(ordfilt2(f,m*n,ones(m,n)),ordfilt2(f,1,ones(m,n)));%滤波邻域的最大值减去最小值
26 T=max(g(:));
27 g2=g>=T;
28 subplot(122),imshow(g2);
29 title(\'非线性滤波点检测后图\');
30%运行结果如下:
31
32 %% 检测指定方向的线
33 clc
34 clear
35 f=imread(\'.\images\dipum_images_ch10\Fig1004(a)(wirebond_mask).tif\');
36 subplot(321),imshow(f);
37 title(\'检测指定方向线的原始图像\');
38
39 w=[2 -1 -1;
40 -1 2 -1;
41 -1 -1 2];%矩阵用逗号或者空格隔开的效果是一样的
42 g=imfilter(double(f),w);
43 subplot(322),imshow(g,[]);
44 title(\'使用-45度检测器处理后的图像\');
45
46 gtop=g(1:120,1:120);%取g的左上角图
47 gtop=pixeldup(gtop,4);%扩大4*4倍的图
48 subplot(323),imshow(gtop,[]);
49 title(\'-45度检测后左上角放大图\');
50
51 gbot=g(end-119:end,end-119:end);%取右下角图
52 gbot=pixeldup(gbot,4);%扩大16倍的图
53 subplot(324),imshow(gbot,[]);
54 title(\'-45度检测后右下角后放大图\');
55
56 g=abs(g);
57 subplot(325),imshow(g,[]);
58 title(\'-45度检测后的绝对值图\');
59
60 T=max(g(:));
61 g=g>=T;
62 subplot(326),imshow(g);
63 title(\'-45度检测后取绝对值最大的图\')
64%检测指定方向的线过程如下:
65
66 %% sobel检测器检测边缘
67 clc
68 clear
69 f=imread(\'.\images\dipum_images_ch10\Fig1006(a)(building).tif\');
70 subplot(321),imshow(f);
71 title(\'sobel检测的原始图像\');
72
73 [gv,t]=edge(f,\'sobel\',\'vertical\');%斜线因为具有垂直分量,所以也能够被检测出来
74 subplot(322),imshow(gv);
75 title(\'sobel垂直方向检测后图像\');
76
77 gv=edge(f,\'sobel\',0.15,\'vertical\');
78 subplot(323),imshow(gv);
79 title(\'sobel垂直检测0.15阈值后图像\');
80
81 gboth=edge(f,\'sobel\',0.15);
82 subplot(324),imshow(gboth);
83 title(\'sobel水平垂直方向阈值0.15后图像\');
84
85 w45=[-2 -1 0
86 -1 0 1
87 0 1 2];%相当于45度的sobel检测算子
88 g45=imfilter(double(f),w45,\'replicate\');
89 T=0.3*max(abs(g45(:)));
90 g45=g45>=T;
91 subplot(325),imshow(g45);
92 title(\'sobel正45度方向上检测图\');
93
94 w_45=[0 -1 -2
95 1 0 -1
96 2 1 0];
97 g_45=imfilter(double(f),w_45,\'replicate\');
98 T=0.3*max(abs(g_45(:)));
99 g_45=g_45>=T;
100 subplot(326),imshow(g_45);
101 title(\'sobel负45度方向上检测图\');
102%sobel检测过程如下:
103
104 %% sobel,log,canny边缘检测器的比较
105 clc
106 clear
107 f=imread(\'.\images\dipum_images_ch10\Fig1006(a)(building).tif\');
108
109 [g_sobel_default,ts]=edge(f,\'sobel\');%
110 subplot(231),imshow(g_sobel_default);
111 title(\'g sobel default\');
112
113 [g_log_default,tlog]=edge(f,\'log\');
114 subplot(233),imshow(g_log_default);
115 title(\'g log default\');
116
117 [g_canny_default,tc]=edge(f,\'canny\');
118 subplot(235),imshow(g_canny_default);
119 title(\'g canny default\');
120
121 g_sobel_best=edge(f,\'sobel\',0.05);
122 subplot(232),imshow(g_sobel_best);
123 title(\'g sobel best\');
124
125 g_log_best=edge(f,\'log\',0.003,2.25);
126 subplot(234),imshow(g_log_best);
127 title(\'g log best\');
128
129 g_canny_best=edge(f,\'canny\',[0.04 0.10],1.5);
130 subplot(236),imshow(g_canny_best);
131 title(\'g canny best\');
132%3者比较的结果如下:
133
134 %% hough变换说明
135 clc
136 clear
137 f=zeros(101,101);
138 f(1,1)=1;
139 f(101,1)=1;
140 f(1,101)=1;
141 f(51,51)=1;
142 f(101,101)=1;
143 imshow(f);title(\'带有5个点的二值图像\');
144%显示如下:
145
146 H=hough(f);
147 figure,imshow(H,[]);
148 title(\'不带标度的hough变换\');
149%不带标度的hough变换结果如下:
150
151 [H,theta,rho]=hough(f);
152 figure,imshow(theta,rho,H,[],\'notruesize\');%为什么显示不出来呢
153 axis on,axis normal;
154 xlabel(\'\theta\'),ylabel(\'\rho\');
155
156 %% 计算全局阈值
157 clc
158 clear
159 f = imread(\'.\images\dipum_images_ch10\Fig1013(a)(scanned-text-grayscale).tif\');
160 imshow(f);
161 title(\'全局阈值原始图像\')
162%其图片显示结果如下:
163
164 T=0.5*(double(min(f(:)))+double(max(f(:))));
165 done=false;
166 while ~done
167 g=f>=T;
168 Tnext=0.5*(mean(f(g))+mean(f(~g)));
169 done=abs(T-Tnext)<0.5
170 T=Tnext;
171 end
172 g=f<=T;%因为前景是黑色的字,所以要分离出来的话这里就要用<=.
173 figure,subplot(121),imshow(g);
174 title(\'使用迭代方法得到的阈值处理图像\');
175
176
177 T2=graythresh(f);%得到的是0~1的小数?
178 g=f<=T2*255;
179 subplot(122),imshow(g);
180 title(\'使用函数graythresh得到的阈值处理图像\');
181%阈值处理后结果如下:
182
183 %% 焊接空隙区域生长
184 clc
185 clear
186 f = imread(\'.\images\dipum_images_ch10\Fig1014(a)(defective_weld).tif\');
187 subplot(221),imshow(f);
188 title(\'焊接空隙原始图像\');
189
190 %函数regiongrow返回的NR为是不同区域的数目,参数SI是一副含有种子点的图像
191 %TI是包含在经过连通前通过阈值测试的像素
192 [g,NR,SI,TI]=regiongrow(f,255,65);%种子的像素值为255,65为阈值
193
194 subplot(222),imshow(SI);
195 title(\'焊接空隙种子点的图像\');
196
197 subplot(223),imshow(TI);
198 title(\'焊接空隙所有通过阈值测试的像素\');
199
200 subplot(224),imshow(g);
201 title(\'对种子点进行8连通分析后的结果\');
202%焊接空隙区域生长图如下:
203
204 %% 使用区域分离和合并的图像分割
205 clc
206 clear
207 f = imread(\'.\images\dipum_images_ch10\Fig1017(a)(cygnusloop_Xray_original).tif\');
208 subplot(231),imshow(f);
209 title(\'区域分割原始图像\');
210
211 g32=splitmerge(f,32,@predicate);%32代表分割中允许最小的块
212 subplot(232),imshow(g32);
213 title(\'mindim为32时的分割图像\');
214
215 g16=splitmerge(f,16,@predicate);%32代表分割中允许最小的块
216 subplot(233),imshow(g16);
217 title(\'mindim为32时的分割图像\');
218
219 g8=splitmerge(f,8,@predicate);%32代表分割中允许最小的块
220 subplot(234),imshow(g8);
221 title(\'mindim为32时的分割图像\');
222
223 g4=splitmerge(f,4,@predicate);%32代表分割中允许最小的块
224 subplot(235),imshow(g4);
225 title(\'mindim为32时的分割图像\');
226
227 g2=splitmerge(f,2,@predict);%32代表分割中允许最小的块
228 subplot(236),imshow(g2);
229 title(\'mindim为32时的分割图像\');
230
231 %% 使用距离和分水岭变换分割灰度图像
232 clc
233 clear
234 f = imread(\'.\images\dipum_images_ch10\Fig0925(a)(dowels).tif\');
235 subplot(231),imshow(f);title(\'使用距离和分水岭分割原图\');
236
237 g=im2bw(f,graythresh(f));
238 subplot(232),imshow(g),title(\'原图像阈值处理后的图像\');
239
240 gc=~g;
241 subplot(233),imshow(gc),title(\'阈值处理后取反图像\');
242
243 D=bwdist(gc);
244 subplot(234),imshow(D),title(\'使用距离变换后的图像\');
245
246 L=watershed(-D);
247 w=L==0;
248 subplot(235),imshow(w),title(\'距离变换后的负分水岭图像\');
249
250 g2=g & ~w;
251 subplot(236),imshow(g2),title(\'阈值图像与分水岭图像相与图像\');
252%使用距离分水岭图像如下:
253
254 %% 使用梯度和分水岭变换分割灰度图像
255 clc
256 clear
257 f = imread(\'.\images\dipum_images_ch10\Fig1021(a)(small-blobs).tif\');
258 subplot(221),imshow(f);
259 title(\'使用梯度和分水岭变换分割灰度图像\');
260
261 h=fspecial(\'sobel\');
262 fd=double(f);
263 g=sqrt(imfilter(fd,h,\'replicate\').^2+imfilter(fd,h\',\'replicate\').^2);
264 subplot(222),imshow(g,[]);
265 title(\'使用梯度和分水岭分割幅度图像\');
266
267 L=watershed(g);
268 wr=L==0;
269 subplot(223),imshow(wr);
270 title(\'对梯度复制图像进行二值分水岭后图像\');
271
272 g2=imclose(imopen(g,ones(3,3)),ones(3,3));
273 L2=watershed(g2);
274 wr2=L2==0;
275 f2=f;
276 f2(wr2)=255;
277 subplot(224),imshow(f2);
278 title(\'平滑梯度图像后的分水岭变换\');
279%使用梯度和分水岭变换分割灰度图像结果如下:
280
281 %% 控制标记符的分水岭分割
282 clc
283 clear
284 f = imread(\'.\images\dipum_images_ch10\Fig1022(a)(gel-image).tif\');
285 imshow(f);
286 title(\'控制标记符的分水岭分割原图像\');
287
288 h=fspecial(\'sobel\');
289 fd=double(f);
290 g=sqrt(imfilter(fd,h,\'replicate\').^2+imfilter(fd,h\',\'replicate\').^2);
291 L=watershed(g);
292 wr=L==0;
293 figure,subplot(231),imshow(wr,[]);
294 title(\'控制标记符的分水岭分割幅度图像\');
295
296 rm=imregionalmin(g);%梯度图像有很多较浅的坑,造成的原因是原图像不均匀背景中灰度细小的变化
297 subplot(232),imshow(rm,[]);
298 title(\'对梯度幅度图像的局部最小区域\');
299
300 im=imextendedmin(f,2);%得到内部标记符
301 fim=f;
302 fim(im)=175;
303 subplot(233),imshow(f,[]);
304 title(\'内部标记符\');
305
306 Lim=watershed(bwdist(im));
307 em=Lim==0;
308 subplot(234),imshow(em,[]);
309 title(\'外部标记符\');
310
311 g2=imimposemin(g,im | em);
312 subplot(235),imshow(g2,[]);
313 title(\'修改后的梯度幅度值\');
314
315 L2=watershed(g2);
316 f2=f;
317 f2(L2==0)=255;
318 subplot(236),imshow(f2),title(\'最后分割的结果\');
319%控制标记符的分水岭分割过程如下:
图像分割中处理涉及到很多参数都需要自己根据具体问题不断调试,直到选出最好的参数组合为止。