bwlabel算法_matlab实现bwlabel函数

本文介绍了如何在MATLAB中实现bwlabel函数的功能,通过imbinarize将灰度图转换为二进制图像,使用二维数组模拟队列,遍历图像进行8连通区域标记。最终展示了算法实现的过程及结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始接触MATLAB图像处理,老师布置的任务-编写一个算法实现类似于bwlabel的功能

大致思路为将灰度图rice.png通过imbinarize函数转换为二进制图像,然后将米粒部分转换为白色像素255

创建一个数组临时充当队列,从矩阵(1,1)元素开始遍历矩阵,当碰到白色像素点时,将该像素点入队列,然后编号,

判断队列是否为空,不为空时,取出队首元素,判断该元素8个临近区域,如果也为白色像素点,则将该元素的值转换为米粒编号,并将该元素入队列% clear;

% close all;

a=input('Enter the picture address:','s');%例如rice.png

b=input('Enter 4 or 8:'); %4连通,8连通

c=input('Is a RGB image:','s'); %y,n

I = imread(a);

connect_type=b;

if(c=='y')

I=rgb2gray(I);

end

% I = imread('rice.png');

[height,width] = size(I);

L=imbinarize(I);

[labeled_4,numObjects_4]=bwlabel(L,4);

[labeled_8,numObjects_8]=bwlabel(L,8); %调用bwlabel查看正确结果

figure,imshow(L);

L = uint8(L);%把L由logic类型转化为uint8类型

for i = 1:height

for j = 1:width

if L(i,j) == 1

L(i,j) = 255;%把白色像素点像素值赋值为255

end

end

end

MAXSIZE = 999999;

Q = zeros(MAXSIZE,2);%用数组模拟队列,存储像素点坐标

front = 1;%指明队头的位置

rear = 1;%指明队尾的下一个位置;front=rear表示队空

flag = 0;%米粒的标号

for i = 1:height

for j = 1:width

if L(i,j) == 255%白色像素点入队列

if front == rear%队列空,找到新米粒,米粒标号加一

flag = flag+1;

end

L(i,j) = flag;%给白色像素赋值为米粒的标号

Q(rear,1) = i;

Q(rear,2) = j;

rear = rear+1;%队尾后移

while front ~= rear

%队头出队

temp_i = Q(front,1);

temp_j = Q(front,2);

front = front + 1;

%把队头位置像素点8连通邻域中未作标记的白色像素点入队,并加上米粒标号

if(connect_type==8)

if(((temp_i - 1)>0)&&((temp_j - 1)>0))

%左上角的像素点

if L(temp_i - 1,temp_j - 1) == 255

L(temp_i - 1,temp_j - 1) = flag;

Q(rear,1) = temp_i - 1;

Q(rear,2) = temp_j - 1;

rear = rear + 1;

end

end

if(((temp_i - 1)>0)&&((temp_j + 1)<=width))

%右上方的像素点

if L(temp_i - 1,temp_j + 1) == 255

L(temp_i - 1,temp_j + 1) = flag;

Q(rear,1) = temp_i - 1;

Q(rear,2) = temp_j + 1;

rear = rear + 1;

end

end

if(((temp_i + 1)<=height)&&((temp_j - 1)>0))

%左下方的像素点

if L(temp_i + 1,temp_j - 1) == 255

L(temp_i + 1,temp_j - 1) = flag;

Q(rear,1) = temp_i + 1;

Q(rear,2) = temp_j - 1;

rear = rear + 1;

end

end

if(((temp_i + 1)<=height)&&((temp_j + 1)<=width))

%右下方的像素点

if L(temp_i + 1,temp_j + 1) == 255

L(temp_i + 1,temp_j + 1) = flag;

Q(rear,1) = temp_i + 1;

Q(rear,2) = temp_j + 1;

rear = rear + 1;

end

end

end

if(((temp_i - 1)>0)&&((temp_j )>0))

%正上方的像素点

if L(temp_i - 1,temp_j) == 255

L(temp_i - 1,temp_j) = flag;

Q(rear,1) = temp_i - 1;

Q(rear,2) = temp_j;

rear = rear + 1;

end

end

if(((temp_i )>0)&&((temp_j - 1)>0))

%正左方的像素点

if L(temp_i,temp_j - 1) == 255

L(temp_i,temp_j - 1) = flag;

Q(rear,1) = temp_i;

Q(rear,2) = temp_j - 1;

rear = rear + 1;

end

end

if(((temp_i )>0)&&((temp_j + 1)<=width))

%正右方的像素点

if L(temp_i,temp_j + 1) == 255

L(temp_i,temp_j + 1) = flag;

Q(rear,1) = temp_i;

Q(rear,2) = temp_j + 1;

rear = rear + 1;

end

end

if(((temp_i + 1)<=height)&&((temp_j )>0))

%正下方的像素点

if L(temp_i + 1,temp_j) == 255

L(temp_i + 1,temp_j) = flag;

Q(rear,1) = temp_i + 1;

Q(rear,2) = temp_j;

rear = rear + 1;

end

end

end

end

end

end

figure,imshow(L);

RiceNumber = flag;%记录米粒的总个数

fprintf('%d连通米粒的总个数:' ,connect_type )

RiceNumber %输出算法结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值