【Matlab学习手记】区域边界拾取

Matlab提供了bwboundaries函数确定区域边界。

  • 测试图

  • 代码:
function [Pm, Fm] = My_RegionBoundary(Jm)
% 区域生长后确定区域的边界
% 输入:
%    Jm:感兴趣区域值为1,其余部分值为零
% 输出:
%    Pm:边界坐标,第一列为横向,第二列为纵向
%    Fm:边界点
[xlen, ylen] = size(Jm);
J = zeros(xlen + 2, ylen + 2);   % 防止出现边界问题
for i = 2 : xlen + 1
    for j = 2 : ylen + 1
        J(i, j) = Jm(i - 1, j - 1);
    end
end
F = zeros(xlen + 2, ylen + 2);     % 标记J中已经选择的边界点
P = zeros((xlen + 2)*(ylen + 2), 2);   % 边界坐标
% 确定第一个边界点A,按行选择,从左至右
flag = 0;
for i = 1 : xlen + 2
    for j = 1 : ylen + 2
        if J(i, j) == 1 
            m = i;     % 初始点
            n = j;
            flag = 1;
            break;
        end
    end
    if flag
        break;
    end
end
% 初始化
i = m;
j = n;
dir = 7;
flag = 1;
count = 0;
while 1   % 从初始点开始遍历,直到满足退出条件
    xx = i;
    yy = j;
    if mod(dir, 2) == 0
        dir = mod(dir + 7, 8);
    else
        dir = mod(dir + 6, 8);
    end
    switch dir
        case 0
            j = j + 1;
        case 1
            i = i - 1;
            j = j + 1;
        case 2
            i = i - 1;
        case 3
            i = i - 1;
            j = j - 1;
        case 4
            j = j - 1;
        case 5
            i = i + 1;
            j = j - 1;
        case 6
            i = i + 1;
        case 7
            i = i + 1;
            j = j + 1;
    end
    while abs(J(i, j) - 1) > 0.1
        dir = mod(dir + 1, 8);
        i = xx;
        j = yy;
        switch dir
            case 0
                j = j + 1;
            case 1
                i = i - 1;
                j = j + 1;
            case 2
                i = i - 1;
            case 3
                i = i - 1;
                j = j - 1;
            case 4
                j = j - 1;
            case 5
                i = i + 1;
                j = j - 1;
            case 6
                i = i + 1;
            case 7
                i = i + 1;
                j = j + 1;
        end    
    end
    if flag == 1
        p = i;
        q = j;
        xx = i;
        yy = j;
        flag = 0;
    end
    F(i, j) = 1;
    xxx = i;
    yyy = j;
    count = count + 1;
    P(count, 2) = xxx;
    P(count, 1) = yyy;
    if m == xx && n == yy && p == xxx && q == yyy
        break;
    end
end
% 输出的时候还原一下
Fm = F(2 : end - 1, 2 : end - 1);
Pm = P(P(:, 1) > 0, :) - 1;

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值