distance transform

clc 

clear 

close all

%距离变换,zsj写于2010-12-27

%程序功能:计算背景中每个点到前景像素的最短欧式距离,待写:找出每层面积,逐层扩大到扩大面积为原面积的2倍

%由于这个程序计算量大,为减少提高程序效率,前景仅仅是提取的轮廓

%所有程序都以黑色0为背景

%显示将扩大后满足条件的轮廓以红色显示

f=imread('F:/数字图象处理/segmentation/第一节骨骼轮廓.bmp');

%f=1-f;

figure

imshow(f);

title('原图像');

[m,n]=find(f==1);

I=zeros(length(m),2);

I(:,1)=m;

I(:,2)=n;

%计算f矩阵的大小

[row,col]=size(f);

%f_new=zeros(row,col);

f=uint8(f);

f_hole=f;%f_hole用来保存原图像,用来判断像素点在轮廓里面还是外面

%将f变为距离图

for i=1:row

    for j=1:col

        if(f(i,j)~=1)

            %计算f(i,j)到boundary的最小值

            f(i,j)=find_min(i,j,I);

        else

            f(i,j)=255;

        end

    end

end

figure

imshow(f)

%将指定的index的值,且在原轮廓外面的像素,h变为红色

%为了提高效率,先找出指定index的点的坐标

%然后再满足index坐标集合中找出轮廓外部的点

f_new_red=zeros(row,col,3);

f_new_red=uint8(f_new_red);

[row_index,col_index]=find(f==4);

num_index=length(row_index)

for x=1:num_index

         i=row_index(x);

         j=col_index(x);

         judge=judge_in_or_out(i,j,f_hole);

        if(judge==0)

          f_new_red(i,j,1)=255;

          f_new_red(i,j,2)=0;

          f_new_red(i,j,3)=0;

        end

 

end

figure

imshow(f_new_red);

imwrite(f_new_red,'F:/数字图象处理/segmentation/第一节骨骼_mask(index=4).bmp');

%程序功能:计算点(i,j)到I的最小距离
function min_f=find_min(i,j,I)
% i=1;
% j=2;
% I=[1,2;
%     3,4;
%     5,6;
%     7,8];
[row,col]=size(I);
%初始化一个数组保存(i,j)到I的所有距离
mat_min=zeros(1,row);
for bi=1:row
    for bj=1:col
        %计算街区距离
         x=I(bi,1);
         y=I(bi,2);
         mat_min(1,bi)=sqrt((i-x)*(i-x)+(j-y)*(j-y));
    end
end
min_f=min(mat_min);

你可能感兴趣的:(学习—知识类,distance,bi,function,2010)