distance transform

    技术2022-06-25  57

    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);


    最新回复(0)