⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 level_conduct.m

📁 关于偏微分方程进行图像处理的电子书,对于学习动态轮廓实现图像的分割非常有用
💻 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 + -