大连密封材料 发表于 2026-1-29 21:44:14

matlab自编腐蚀算法,地区增长

1 自实现腐蚀使用


temp1 = ImgMask;
se = strel('disk',4);
temp1 = imerode(temp1, se);
imtool(temp1)

temp2 = temp2.*label;
temp2 = ImgMask;
my_strel = double(se.Neighborhood);
R = floor(size(my_strel,1)/2);
label = zeros(imgSize,imgSize);
for i = R+1:imgSize - R
    for j = R+1:imgSize - R
      subImg = temp2(i-R:i+R,j-R:j+R);
      if isequal(subImg.* my_strel,my_strel)
            label(i,j) = 1;
      end
    end
end
temp2 = temp2.*label;
2自实现二值图地区增长,完因素割任务

多次循环,实现任何巨细的分割任务
WINDOW_SIZE_Standard = 240;   %最大膨胀窗口的大小
threshhold_Standard = 0.3;%区域增长的判定条件,每次新增长像素>待判定像素的 30%
= RegionGrowingStepInitial(tempMaskimg,imgSize,WINDOW_SIZE_Standard,threshhold_Standard);

WINDOW_SIZE_Standard = 40; threshhold_Standard = 0.4;
= RegionGrowingStep2(tempMaskimg,output,WINDOW_SIZE_Standard,WINDOW_SIZE,threshhold_Standard,imgSize);

WINDOW_SIZE_Standard = 20;threshhold_Standard = 0.4;
= RegionGrowingStep2(tempMaskimg,output,WINDOW_SIZE_Standard,WINDOW_SIZE,threshhold_Standard,imgSize);

WINDOW_SIZE_Standard = 20;threshhold_Standard = 0.4;
= RegionGrowingStep2(tempMaskimg,output,WINDOW_SIZE_Standard,WINDOW_SIZE,threshhold_Standard,imgSize);
function = RegionGrowingStep2(tempMaskimg,output,WINDOW_SIZE_Standard,WINDOW_SIZE,threshhold_Standard,imgSize)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3.选取多个种子点,限定增长窗口,区域增长
%Select multiple seed points, limit the growth window, and expand the region
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% 3.1.存储多个种子点
    P0 = tempMaskimg;

% %    = find (WINDOW_ARRAY_fn==1);
% %   seedArray_x = [];
% %   seedArray_y = [];
% %   for i = seed_x - floor(WINDOW_SIZE/2):floor(WINDOW_SIZE/10-1):seed_x + floor(WINDOW_SIZE/2)
% %         for j = seed_y - floor(WINDOW_SIZE/2):floor(WINDOW_SIZE/10-1):seed_y + floor(WINDOW_SIZE/2)
% %             seedArray_x(end+1) = i;
% %             seedArray_y(end+1) = j;
% %         end
% %   end
    output(output > 0) = 1;
    edges = edge(output, 'Canny');
    =find(edges ~= 0);
    seedArray_x = [];
    seedArray_y = [];
    for i = 1:23:size(posx,1)
         seedArray_x(end+1) = posx(i);
         seedArray_y(end+1) = posy(i);
    end
%   figure(1);plot(seedArray_x,seedArray_y,'*');
%   figure(2);plot(posx,posy,'*');

    %%%%%%%%%% 3.2 指定滑动窗大小,
    %%%%%%%%%占比0.4以上,增长
    fprintf("************** seed point length= %d \n",size(seedArray_x,2));
    for kk = 1:size(seedArray_x,2)
      WINDOW_SIZE = 3;
      WINDOW_ARRAY_fn = zeros(imgSize,imgSize);
      seed_x = seedArray_x(kk);
      seed_y = seedArray_y(kk);
      for i = seed_x - floor(WINDOW_SIZE/2):1:seed_x + floor(WINDOW_SIZE/2)
            for j = seed_y - floor(WINDOW_SIZE/2):1:seed_y + floor(WINDOW_SIZE/2)
                WINDOW_ARRAY_fn(i,j) = 1;
            end
      end
      WINDOW_ARRAY_fn(seed_x,seed_y) = 0;
      threshhold = threshhold_Standard;
%         while threshhold >= 0.4&& WINDOW_SIZE < 50
      while threshhold >= threshhold_Standard&& WINDOW_SIZE < WINDOW_SIZE_Standard
            TOTAL = WINDOW_SIZE*2 + (WINDOW_SIZE - 2)*2;
            result = P0.*WINDOW_ARRAY_fn;%imtool(result)
             = find (result==1);
            SATISFIED_pixel = length(posx);   
            threshhold = SATISFIED_pixel/TOTAL;

            %%%%%%% old window
            WINDOW_ARRAY_fn = zeros(imgSize,imgSize);
            for i = seed_x - floor(WINDOW_SIZE/2):1:seed_x + floor(WINDOW_SIZE/2)
                for j = seed_y - floor(WINDOW_SIZE/2):1:seed_y + floor(WINDOW_SIZE/2)
                  WINDOW_ARRAY_fn(i,j) = 1;
                end
            end

            %%%%% new window
            WINDOW_SIZE = WINDOW_SIZE+ 2;
            WINDOW_ARRAY_fn0 = zeros(imgSize,imgSize);
            for i = seed_x - floor(WINDOW_SIZE/2):1:seed_x + floor(WINDOW_SIZE/2)
                for j = seed_y - floor(WINDOW_SIZE/2):1:seed_y + floor(WINDOW_SIZE/2)
                  WINDOW_ARRAY_fn0(i,j) = 1;
                end
            end
            WINDOW_ARRAY_fn0(WINDOW_ARRAY_fn == 1) = 0;
            WINDOW_ARRAY_fn0(seed_x,seed_y) = 0;

            WINDOW_ARRAY_fn = WINDOW_ARRAY_fn0;

    %      fprintf("WINDOW_SIZE = %d \n",WINDOW_SIZE);
      end

      WINDOW_ARRAY_out = zeros(imgSize,imgSize);
      for i = seed_x - floor(WINDOW_SIZE/2):1:seed_x + floor(WINDOW_SIZE/2)
            for j = seed_y - floor(WINDOW_SIZE/2):1:seed_y + floor(WINDOW_SIZE/2)
                WINDOW_ARRAY_out(i,j) = 1;
            end
      end
      output = output + WINDOW_ARRAY_out;
    %   imtool(output);
% %         fprintf("************** kk = %d \n",kk);
% %         fprintf("WINDOW_SIZE = %d \n",WINDOW_SIZE);

    end
    fprintf("************** finish \n");
end

function = RegionGrowingStepInitial(tempMaskimg,imgSize,WINDOW_SIZE_Standard,threshhold_Standard)
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1.在图像的中心区域的一定范围内,选取一个像素值不为0的种子点
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    R_seed = 30;
    seed_x = 0;
    seed_y = 0;
    for i = floor(imgSize/2 - R_seed/2):1:floor(imgSize/2 + R_seed/2)
      for j = floor(imgSize/2 - R_seed/2):1:floor(imgSize/2 + R_seed/2)
            if(tempMaskimg(i,j) ==1)
                seed_x = i;
                seed_y = j;
                break;
            end
      end
    end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2.区域增长
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%初始化
    P0 = tempMaskimg;
    WINDOW_SIZE = 3;
    WINDOW_ARRAY_fn = zeros(imgSize,imgSize);
    for i = seed_x - floor(WINDOW_SIZE/2):1:seed_x + floor(WINDOW_SIZE/2)
      for j = seed_y - floor(WINDOW_SIZE/2):1:seed_y + floor(WINDOW_SIZE/2)
            WINDOW_ARRAY_fn(i,j) = 1;
      end
    end
    WINDOW_ARRAY_fn(seed_x,seed_y) = 0;
    threshhold = threshhold_Standard;
   
    %%%%%%%%%%%%获得初始连通区域
%   while threshhold >= 0.3 && WINDOW_SIZE < 240
    while threshhold >= threshhold_Standard&& WINDOW_SIZE < WINDOW_SIZE_Standard
      TOTAL = WINDOW_SIZE*2 + (WINDOW_SIZE - 2)*2;
      result = P0.*WINDOW_ARRAY_fn;%imtool(result)
       = find (result==1);
      SATISFIED_pixel = length(posx);   
      threshhold = SATISFIED_pixel/TOTAL;

      %%%%%%% old window
      WINDOW_ARRAY_fn = zeros(imgSize,imgSize);
      for i = seed_x - floor(WINDOW_SIZE/2):1:seed_x + floor(WINDOW_SIZE/2)
            for j = seed_y - floor(WINDOW_SIZE/2):1:seed_y + floor(WINDOW_SIZE/2)
                WINDOW_ARRAY_fn(i,j) = 1;
            end
      end

      %%%%% new window
      WINDOW_SIZE = WINDOW_SIZE+ 2;
      WINDOW_ARRAY_fn0 = zeros(imgSize,imgSize);
      for i = seed_x - floor(WINDOW_SIZE/2):1:seed_x + floor(WINDOW_SIZE/2)
            for j = seed_y - floor(WINDOW_SIZE/2):1:seed_y + floor(WINDOW_SIZE/2)
                WINDOW_ARRAY_fn0(i,j) = 1;
            end
      end
      WINDOW_ARRAY_fn0(WINDOW_ARRAY_fn == 1) = 0;
      WINDOW_ARRAY_fn0(seed_x,seed_y) = 0;

      WINDOW_ARRAY_fn = WINDOW_ARRAY_fn0;

%      fprintf("WINDOW_SIZE = %d \n",WINDOW_SIZE);
    end

    WINDOW_ARRAY_out = zeros(imgSize,imgSize);
    for i = seed_x - floor(WINDOW_SIZE/2):1:seed_x + floor(WINDOW_SIZE/2)
      for j = seed_y - floor(WINDOW_SIZE/2):1:seed_y + floor(WINDOW_SIZE/2)
            WINDOW_ARRAY_out(i,j) = 1;
      end
    end
    output = WINDOW_ARRAY_out;
end



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
页: [1]
查看完整版本: matlab自编腐蚀算法,地区增长