图像处理-区域标记 Matlab-code
clc;
close all;
clear all;
I = imread('Rice.png');
BW1 =im2bw(I);
figure;
subplot(221),imshow(BW1),title('rice');
st=strel('square',3);
BW2 = imopen(BW1, st);
subplot(222),imshow(BW2),title('BW2');
% e = edge(BW2, 'sobel');
% figure,imshow(e, []),title('edge');
% 调用函数方法
%% [L, num] = bwlabel(BW2); % 进行连通域的求解,L为返回图图像大小一样的标记; num为连通域个数
% 自己实现连通域的标记
F = uint8(BW2); % flag; 第一个连通域为1,第二个为2
[c, w] = size(F);
num = 1;
queue = []; % 队列
ed=[-1 -1;0 -1;1 -1;1 0;1 1;0 1;-1 1;-1 0]; % 从左上角像素,逆时针搜索
for i=1:c
for j=1:w
if(BW2(i,j)==1 && F(i,j)==1) % 进入连通域内的一个点
queue = [queue; [i, j]]; % 该点坐标入队列
F(i,j)=num+1; % 该点标记已读
while(length(queue) > 0) %队列不空
x = queue(1,:); ni=x(1); nj=x(2); % 取队首队
[l1, l2] = size(queue);
if (l1==1)
queue = []; % 队列只有一个元素 出队
else
queue = queue(2:l1,:); % 队列存在多个元素,出队首
end
for k=1:8 %逆时针八邻域搜索
tmpi=ni+ed(k,1); %八邻域临时坐标
tmpj=nj+ed(k,2);
% 边界检查 && 是连通域 && 未被标记
if (~(tmpi<=0 || tmpi>c || tmpj<=0 || tmpj>w)) && BW2(tmpi,tmpj)==1 && F(tmpi,tmpj)==1
queue = [queue; [tmpi, tmpj]]; %入队列
F(tmpi,tmpj)=num+1; % 标记为第几个连通域
end
end
end
num = num + 1;
end
end
end
F = F-1; %背景为连通域0
num = num -1; %num从2开始的,在这里减去1
subplot(223),imshow(F,[]),title('F');
RGB_label = label2rgb(F, 'spring', 'c', 'shuffle'); % 标记的连通域转换为彩色
subplot(224),imshow(RGB_label,[]),title('RGB-L');
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d713ffded1132147c9b16b8f2d9b66d0.png#pic_center)