二值化轮廓图像轮廓点坐标顺时针获取matlab程序

由一副二值化轮廓图像,经过8邻域扫描,得到顺时针方向各个轮廓点的坐标。

%由一幅2值化的汉字轮廓图像顺时针或逆时针获取轮廓坐标
edgeIm = imread('D:\EdgeIm.bmp');
%figure, imshow(edgeIm);

%edgeIm中非零元素的坐标,即轮廓坐标
[i, j] = find(edgeIm);

%轮廓点数
numPoints = size(i, 1);
curNum = 0;

%初始搜索点坐标
currentR = i(1, 1);
currentC = j(1, 1);

%初始化轮廓点坐标
points = zeros(numPoints, 2);

%开始搜索
curNum = curNum + 1;
points(curNum,:) = [currentR, currentC];
edgeIm(currentR, currentC) = 0;

while curNum ~= numPoints;
    if edgeIm(currentR, currentC-1) == 1;
        curNum = curNum + 1;
        currentC = currentC - 1;
        points(curNum,:) = [currentR, currentC];
        edgeIm(currentR, currentC) = 0;
    
        
        elseif edgeIm(currentR-1, currentC-1) == 1;
            curNum = curNum + 1;
            currentR = currentR - 1;
            currentC = currentC - 1;
            points(curNum,:) = [currentR, currentC];
            edgeIm(currentR, currentC) = 0;
            
        elseif edgeIm(currentR-1, currentC) == 1;
            curNum = curNum + 1;
            currentR = currentR - 1;
            points(curNum,:) = [currentR, currentC];
            edgeIm(currentR, currentC) = 0;
            
        elseif edgeIm(currentR-1, currentC+1) == 1;
            curNum = curNum + 1;
            currentR = currentR - 1;
            currentC = currentC + 1;
            points(curNum,:) = [currentR, currentC];
            edgeIm(currentR, currentC) = 0;
            
        elseif edgeIm(currentR, currentC+1) == 1;
            curNum = curNum + 1;
            currentC = currentC + 1;
            points(curNum,:) = [currentR, currentC];
            edgeIm(currentR, currentC) = 0;
            
        elseif edgeIm(currentR+1, currentC+1) == 1;
            curNum = curNum + 1;
            currentR = currentR + 1;
            currentC = currentC + 1;
            points(curNum,:) = [currentR, currentC];
            edgeIm(currentR, currentC) = 0;
            
        elseif edgeIm(currentR+1, currentC) == 1;
            curNum = curNum + 1;
            currentR = currentR + 1;
            points(curNum,:) = [currentR, currentC];
            edgeIm(currentR, currentC) = 0;
            
        else edgeIm(currentR+1, currentC-1) == 1;
            curNum = curNum + 1;
            currentR = currentR + 1;
            currentC = currentC - 1;
            points(curNum,:) = [currentR, currentC];
            edgeIm(currentR, currentC) = 0;
    end
end


  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值