第十一章 表示与描述

来源:互联网 发布:ubuntu系统下安装win7 编辑:程序博客网 时间:2024/06/08 01:21

    • 单元数组
      • 结构
      • 工具函数
      • 提取区域及其边界的函数
    • 表示
      • 链码
        • 弗雷曼链码及其某些变化
      • 使用最小周长多边形的多边形近似
      • 使用minperpoly
      • 标记
      • 边界线段

单元数组

单元数组:可以储存各种类型的对象

  • image_stats
    输出一幅图像的平均亮度、维数、行的平均亮度和列的平均亮度,则可以使用“标准”方法写函数
function [AI, dim, AIrows, AIcols] = image_stats(f)dim = size(f);AI = mean2(f);AIrows = mean(f, 2);AIcols = mean(f, 1);

若使用单元数组,则可以改成:

function G = image_stats(f)G{1} = size(f);G{2} = mean2(f);G{3} = mean(f, 2);G{4} = mean(f, 1);

单元数组也可以是多维的

function H = image_stats2(f)H(1, 1) = {size(f)};H(1, 2) = {mean2(f)};H(2, 1) = {mean(f, 2)};H(2, 2) = {mean(f, 1)};

结构

function s = image_stats(f)s.dim = size(f);s.AI = mean2(f);s.AIrows = mean(f, 2);s.AIcols = mean(f, 1);
Q幅图像组成一个大小为M * N * Q的数组
function s = image_stats(f)K = size(f);for k = 1:K(3)    s(k).dim = size(f(:, :, k));    s(k).AI = mean2(f(:, :, k));    s(k).AIrows = mean(f(:, :, k), 2);    s(k).AIcols = mean(f(:, :, k), 1);end

其中s 是一个结构,s本身是一个标量,它与本例中的4个域相关。

工具函数

  • imfill 该函数对于二值图像和灰度图像的作用不同

    gB = imfill(fB, locations, conn)在输入二值图像 fB 的背景像素上从参数locations指定的点开
    始,执行填充操作。
    gB = imfill(fB, conn, ‘holes’)
    g = imfill(fI, conn, ‘holes’)
    将填充输入灰度图像fI 的孔洞

  • 函数find 可以和 bwlabel一起使用,返回构成某个指定对象的像素的坐标向量。

    [gB, num] = bwlabel(fB)
    产生了多个连续区域(即num > 1)
    则使用一下语法可以获得第二个区域的坐标:
    [r, c] = find(g == 2)

  • 函数sortrows

    对数组进行排序
    z = sortrows(S)
    S 必须是矩阵或列向量

  • 函数unique

    既对数组进行排序,又去除重复行
    [z, m, n] = unique(S, ‘rows’)

  • 函数circshift

    z = circshift(S, [ud lr])对数组进行向上、向下或侧移指定位置数的移位操作
    ud 是 S 向上 或向下移位的元素数量
    若S 是一幅图像,则circshift 就是对图像进行的卷动操作或平移操作。

提取区域及其边界的函数

  • bwlabel计算一幅二值图像中所有连接分量

    [L,num] = bwlabel(f,conn)
    f为输入图像,conn指定期望的连接性(4或8)默认为8,num是找到的连接分量数,L是标记矩阵,它给每个连接分量分配区间[1,num]内的一个唯一整数。

  • bwperim产生一幅包括边界的二值图像

    g = bwperim(f,conn)
    返回一幅二值图像g,该图像仅包含f中所有区域的边界像素,conn指定背景的连接性,4连接(默认)或8连接。

  • bwboundaries提取二值图像中的所有区域的真实边界坐标

    B = bwboundaries(f,conn,options)
    conn相当于边界本身,且具有值4或8(默认),参数options的值为‘holes’,’noholes’。第一个值,提取区域和孔洞的边界;第二个提取区域及其子区域的边界。若参数中仅包含f,conn中的一个值,options默认值为‘holes’。

  • bound2im(b,M,N)生成一幅大小为M*N的二值图像g,在b中的坐标处其值为1,背景处为0。

    g = bound2im(b,M,N)
    b = cat(1,B{:})

  • bound2eight,bound2four

    b8 = bound2eight(b)
    bound2four
    从边界b中删除4(8)连接的像素,而保留8(4)连接的像素。要求b是闭合的,按顺时针方向或逆时针方向顺序排序的连接像素集合。

  • 函数bsubsamp

    [s, su] = bsubsamp(b, gridsep)
    网格的行由gridsep个像素隔开,输出s 是一个比b有更少的点的边界,点的数目由gridsep的值确定,su 是按比例取得的边界点的集合,这样可使坐标的转换趋于一致。

  • connectpoly

    z = connectpoly(s(:,1), s(:, 2))
    用此函数将图像的点重新连接起来,s 是二次取样后的边界的坐标

  • intline

    [x, y] = intline(x1, x2, y1, y2)
    处理边界时,计算连接两点的一条直线的整数坐标。

表示

链码

链码通过一个指定长度与方向的直线段的连接序列来表示一个编号方案加以编码
这里写图片描述

  • fchcode计算一个保存在数组b中的np*2个已排序边界点集的Freeman链码

c = fchcode(b, conn, dir)
c是一个包含以下域的结构
c.fcc = Freeman链码(1*np)
c.diff = 代码c.fcc的一阶差分(1*np)
c.mm = 最小幅度的整数(1*np)
c.diffmm = 链码c.mm的一阶差分(1*np)
c.x0y0 = 链码开始处的坐标(2*np)

参数dir指定输出代码的方向:’same’表示与b中点的方向相同。’reverse’则表示相反。

弗雷曼链码及其某些变化

f=imread('Fig010.tif');subplot(231),imshow(f);title('freeman原图');h=fspecial('average',9);%9*9平滑算子g=imfilter(f,h,'replicate');%滤波subplot(232),imshow(g);title('freeman中值滤波后图像');g=im2bw(g,0.5);%将原图像转换为二值图像subplot(233),imshow(g);title('freeman图像阈值处理后');%函数boundaries(BW,CONN,DIR)表示的是跟踪目标的边界,返回值为一个p*1的数组单元,p为目标的个数%每一个单元又是一个Q*2的矩阵,即Q个点的x,y坐标B=boundaries(g);%函数cellfun(FUN,C)是指对一个单元数组中的每一个单元应用函数FUNd=cellfun('length',B);%求B中每一个目标边界的长度,所以返回值d是一个向量 [max_d,k]=max(d);%返回向量d中最大的值,存在max_d中,k为其索引。v=B{k(1)};%如果最大边界不止一条,则取出其中的一条即可。v是一个坐标数组[M,N]=size(g);%函数bound2im(b,M,N,x0,y0)是生成一副二值图像,大小为M*N,x0和y0是b中最小的x和y轴坐标g=bound2im(v,M,N,min(v(:,1)),min(v(:,2)));subplot(234),imshow(g);title('取出最大边界后图像');% [S, SU] = bsubsamp(B, GRIDSEP)指的是对边界B进行子采样,每个GRIDSEP个点采样一次%输出S是采样后的值,输出SU是归一化的边界,什么意思?[s,su]=bsubsamp(v,50);g2=bound2im(s,M,N,min(s(:,1)),min(s(:,2)));subplot(235),imshow(g2);title('蒋采样后的边界图像');%connectpoly(X,Y)函数是按照坐标(X,Y)顺时针或者逆时针连接成多边形cn=connectpoly(s(:,1),s(:,2));g2=bound2im(cn,M,N,min(cn(:,1)),min(cn(:,2)));subplot(236),imshow(g2);title('连接成多边形图像');

这里写图片描述

使用最小周长多边形的多边形近似

MPP:一种用于多边形近似的特殊方法:寻找一个区域或者一条边界的最小周长多边形(MMP)。
这里写图片描述

查找一个区域的MMP的步骤

获取细胞联合体。
获取细胞联合体的内部区域。
使用函数boundaries以4连接顺时针坐标序列的形式获得步骤2中的区域的边界。
使用函数fchcode获得该4连接序列的Freeman链码。
从链码中获得凸顶点(黑点)与凹顶点(白点)。
使用黑点作为顶点构造一个初始多边形,删除位于该多边形之外的任何白顶点(在多边形边界上的白顶点将保留)。
用剩余的黑白点作为顶点构造一个多边形。
删除所有为凹顶点的黑点。
重复步骤7与步骤8,直到变化停止。此时,所有角度为180°的顶点均将删除。剩下的点就是该MMP的顶点。

使用minperpoly

f=imread('Fig011.tif');subplot(231),imshow(f);title('原图像');b=boundaries(f,4,'cw');%找出B的边界,顺时针4邻接b=b{1};%因为这幅图比较特殊,它只有一个边界物体[M,N]=size(f);xmin=min(b(:,1));ymin=min(b(:,2));bim=bound2im(b,M,N,xmin,ymin);%将边界物体转换成边界图像subplot(232),imshow(bim);title('找出的边界图像');% [X, Y] = minperpoly(F, CELLSIZE)为计算二值图像的最小周长多边形[x,y]=minperpoly(f,2);%2为用于形成边界方形的大小,x和y是MPP上顶点的坐标b2=connectpoly(x,y);%将顶点依次连接成多边形b2=bound2im(b2,M,N,xmin,ymin);subplot(233),imshow(b2);title('使用大小为2*2的方形边界单元获得的MPP');[x,y]=minperpoly(f,3);b3=connectpoly(x,y);b3=bound2im(b3,M,N,xmin,ymin);subplot(234),imshow(b3);title('使用大小为3*3的方形边界单元获得的MPP');[x,y]=minperpoly(f,4);b4=connectpoly(x,y);b4=bound2im(b4,M,N,xmin,ymin);subplot(235),imshow(b4);title('使用大小为4*4的方形边界单元获得的MPP');[x,y]=minperpoly(f,8);b8=connectpoly(x,y);b8=bound2im(b8,M,N,xmin,ymin);subplot(236),imshow(b8);title('使用大小为8*8的方形边界单元获得的MPP');

这里写图片描述
使用更大的方形边界得到的MPP
这里写图片描述

标记

标记是边界的一维函数表示。

  • signature可用于查找给定边界的标记

    [st, angle, x0, y0] = signature(b, x0, y0)
    x0 y0 是一个点坐标

  • cart2pol

    [THETA, RHO] = cart2pol(X, Y)
    函数signature 使用函数 cart2pol 将笛卡儿 坐标转换为极坐标
    XY是包含笛卡尔坐标的坐标向量

  • pol2cart将极坐标转换为笛卡儿坐标

    [X, Y] = pol2cart(THETA, RHO)

fsq = imread('Fig013.tif');>> bSq = bwboundaries(fsq,'noholes');>> [distSq,angleSq] = signature(bSq{1});>> plot(angleSq,distSq);>> subplot(121),imshow(fsq),title('不规则边界');>> subplot(121),plot(angleSq,distSq);,title('对应标记');>> subplot(121),imshow(fsq),title('不规则边界');subplot(122),plot(angleSq,distSq);,title('对应标记');

这里写图片描述
这里写图片描述

边界线段

表示一个平面区域的结构形状的一种重要方法是将它简化为图形,可以通过一种细化(骨骼化)算法得到该区域的骨骼

计算染色体的骨骼

f=imread('Fig012.tif');subplot(231),imshow(f);title('人体染色体原始图');f=im2double(f);%不再是二值图像了h=fspecial('gaussian',25,25);g=imfilter(f,h,'replicate');subplot(232),imshow(g);title('高斯平滑后的图像');g=im2bw(g,1.5*graythresh(g));%其中的graythresh()函数为自动阈值,处理后g为二值图像了subplot(233),imshow(g);title('经阈值处理后');s=bwmorph(g,'skel',Inf);%提取骨骼,bwmorph为二进制形态学处理函数subplot(234),imshow(s);title('骨骼化后图像');s1=bwmorph(s,'spur',8);%删除毛刺subplot(235),imshow(s1);title('8次去毛刺后');s2=bwmorph(s1,'spur',7);%删除毛刺subplot(236),imshow(s2);title('再7次去毛刺后');

这里写图片描述

阅读全文
1 0