zoukankan      html  css  js  c++  java
  • Matlab DIP(瓦)ch11表示与描述练习

         这一章主要是练习一些图像的表示和描述,内容主要包括图像的一些常用表示方法,比如说链码,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%主分量分解过程如下:

         图像的表示和描述对后面做计算机视觉处理起来很大的作用。当然针对不同的研究对象其表示和描述的特点也不同。

  • 相关阅读:
    最新的Delphi版本号对照
    SuperObject生成示例
    Why does Delphi XE7 IDE hangs and fails on out of memory exception?
    使用 TRESTClient 与 TRESTRequest 作为 HTTP Client(转)
    Delphi提取PDF文本
    (3)PyCharm中Flask工程逆向生成数据库表
    (2)PyCharm开发Flash项目之蓝图构建
    (1)PyCharm开发工具安装Flask并创建helloworld程序
    使用localStorage写一个简单的备忘录
    一个Redis实例适合存储不同应用程序的数据吗?
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2429227.html
Copyright © 2011-2022 走看看