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