📄 level_conduct.m
字号:
function level_conduct( image_name ,N ,L,out_filename )
% 函数功能:统计图像的水平线的各组成部分的测度(所包围象素点,将测度小于L的水平线抹掉.
% 输入参数:image_name 图像文件名
% N 阈值水平集的灰度 0~254
% L 测度阀值
% out_filename 输出文件名
if nargin<3
disp('请按参数说明正确输入参数!!');
return;
end
image_I=imread(image_name); % 读取图像
[size_r,size_c]=size(image_I); % 图像大小
bimage=zeros(size_r,size_c); % 水平集矩阵
for row=1:size_r
for col=1:size_c
if image_I(row,col) > N % 水平集二值图像
bimage(row,col)=1;
end
end
end
subplot(1,2,1);
imshow(bimage,[]);
title('原水平集');
% -----------------------
bimage=seek_point_sum(bimage,L); % 统计各块的点数
subplot(1,2,2);
imshow(bimage,[]);
title('处理后的水平集');
imwrite(uint8(bimage),out_filename);
%---------------------------------------------end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function b_image=seek_point_sum(b_image,threshold)
% 用堆栈对二值图像进行处理,求值为1的区域的点数
% 输入参数: b_image 二值化图象
[size_r,size_c]=size(b_image); % 图像大小
flag_image=zeros(size_r,size_c); % 标志图像 为1表示该点已经扫描过
erase_matrix=zeros(size_r,size_c); % 标志须删除掉的点
for row=1:size_r
for col=1:size_c
if b_image(row,col)==1 & flag_image(row,col)==0 % 求每一点所在的区域 白点
sum=0;
flag_matrix=zeros(size_r,size_c); % 一种子所在的四连通区域各元素位置的标志矩阵
stack_r=[ row ]; % 行列堆栈初始化
stack_c=[ col ];
while length(stack_r)~=0 % FILO
index=length(stack_r); % 取元素
jyl_r=stack_r(index);
jyl_c=stack_c(index);
stack_r=stack_r(1:index-1); % 删除元素
stack_c=stack_c(1:index-1);
if flag_image(jyl_r,jyl_c)==0 % 避免重复计数
sum=sum+1;
flag_image(jyl_r,jyl_c)=1;
flag_matrix(jyl_r,jyl_c)=1;
end
%--------四连通--------------------
if (jyl_r-1)>0
if b_image( jyl_r-1,jyl_c)==1 & flag_image( jyl_r-1,jyl_c)==0 % 上 未扫描 白点
stack_r=[stack_r,jyl_r-1];
stack_c=[stack_c,jyl_c];
end
end
if (jyl_r+1)<=size_r
if b_image( jyl_r+1,jyl_c)==1 & flag_image( jyl_r+1,jyl_c)==0 % 下
stack_r=[stack_r,jyl_r+1];
stack_c=[stack_c,jyl_c];
end
end
if (jyl_c-1)>0
if b_image(jyl_r,jyl_c-1 )==1 & flag_image(jyl_r,jyl_c-1 )==0 % 左
stack_r=[stack_r,jyl_r];
stack_c=[stack_c,jyl_c-1 ];
end
end
if (jyl_c+1)<=size_c
if b_image(jyl_r,jyl_c+1 )==1 & flag_image(jyl_r,jyl_c+1 )==0 % 右
stack_r=[stack_r,jyl_r];
stack_c=[stack_c,jyl_c+1];
end
end
% --------------------------------
end
if sum<=threshold
erase_matrix=max( erase_matrix,flag_matrix );
end
end
end
end
for row=1:size_r
for col=1:size_c
if erase_matrix(row,col)==1
b_image(row,col)=0;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -