Matlab的BwLabel实现

连通区域分析中常需要找出一幅图像中的连通区域,matlab自带的Belabel函数即可,在此写了一个功能相同的函数,方便以后将其移植到其他平台上,用的是Two pass算法

function [ outImg, labels ] = MyBwLabel( inputImg )
%MyBwLabel 自制的连通区域分析函数
%   [ outImg, labels ] = MyBwLabel( inputImg )
%   inputIg: 输入的图像,要求是二值化图像,且最大值为1
%   outputImg: 输出的图像,不同的连通区域的;label不同
%   labels:连通区域的个数
%
%   example : a = false(400);
%             a(rand(400) > 0.5) = true;
%             [b , l] = MyBwLabel(a);
%             imshow(b , [])
    if ~islogical(inputImg)
        error( '========do not support the data type!!============' )
    end
    labels = 1;
    outImg = double( inputImg );
    markFlag = false( size(inputImg) );
    [height , width] = size( inputImg );

    %% first pass
    for ii = 1:height
        for jj = 1:width
            if inputImg(ii,jj) > 0  % 若是前景点,则进行统计处理
                neighbors = [];  % 记录符合要求的邻域中的前景点,三列依次是行、列、值
                if (ii-1 > 0)
                    if (jj-1 > 0 && inputImg(ii-1,jj-1) > 0)
                        neighbors = [neighbors ; ii-1 , jj-1 , outImg(ii-1,jj-1)];
                    end
                    if inputImg(ii-1,jj) > 0
                        neighbors = [neighbors ; ii-1 , jj , outImg(ii-1,jj)];
                    end
                elseif (jj-1) > 0 && inputImg(ii,jj-1) > 0
                    neighbors = [neighbors ; ii , jj-1 , outImg(ii,jj-1)];
                end

                if isempty(neighbors)
                    labels = labels + 1;
                    outImg(ii , jj) = labels;
                else
                    outImg(ii ,jj) = min(neighbors(:,3));
                end

            end
        end
    end

    %% second pass
    [r , c] = find( outImg ~= 0 );
    for ii = 1:length( r )
        if r(ii)-1 > 0
            up = r(ii)-1;
        else
            up = r(ii);
        end
        if r(ii)+1 <= height
            down = r(ii)+1;
        else
            down = r(ii);
        end
        if c(ii)-1 > 0
            left = c(ii)-1;
        else
            left = c(ii);
        end
        if c(ii)+1 <= width
            right = c(ii)+1;
        else
            right = c(ii);
        end

        tmpM = outImg(up:down , left:right);
        [r1 , c1] = find( tmpM ~= 0 );
        if ~isempty(r1)
            tmpM = tmpM(:);
            tmpM( tmpM == 0 ) = [];

            minV = min(tmpM);
            tmpM( tmpM == minV ) = [];
            for kk = 1:1:length(tmpM)
                outImg( outImg == tmpM(kk) ) = minV;
            end

        end
    end

    u = unique(outImg);
    for ii = 2:1:length(u)
        outImg(outImg == u(ii)) = ii-1;
    end
    labels = length( u ) - 1;
end
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MATLAB中的bwlabel函数用于将二值图像中的连通区域标记为不同的整数值。该函数的语法如下: [L, num] = bwlabel(BW, n) 其中,BW是二值图像,n是可选参数,表示连接方式。默认情况下,n为8,表示8连通。如果n为4,则表示4连通。 函数的输出包括: L:标记后的图像,每个连通区域的像素值都被标记为不同的整数值。 num:连通区域的数量。 例如,下面的代码将对一个二值图像进行标记,并输出标记后的图像和连通区域的数量: BW = imread('binary_image.png'); [L, num] = bwlabel(BW); imshow(L); disp(num); 该函数在图像处理中常用于分割图像中的不同区域,或者提取图像中的特定目标。 ### 回答2: Matlabbwlabel函数是一个二值图像处理函数,主要用于获取二进制图像中像素连通区域的标签。该函数可以将二值图像分割为不同的连通区域,每个连通区域都赋予唯一的标签,标签的值从1开始,依次递增。bwlabel函数的完整语法格式如下: [L, num] = bwlabel(BW, N) 其中,BW表示二值图像矩阵,N表示像素连通时采用的连接模式,取值范围为4或8。L是一个与BW大小相同的矩阵,存储每个像素的标签,num表示图像中像素连通区域的数量。 bwlabel函数的实现原理是遍历图像中的每个像素,并将像素与其周围的相邻像素进行比较,根据像素值的变化将属于同一连通区域的像素进行标记。标记的方式可以采用广度优先搜索或深度优先搜索。 使用bwlabel函数时,需要注意以下几点: 1.输入图像必须是二值图像,即像素值只有0或1,如果是灰度图像需要先进行二值化处理; 2.连接模式的选择必须与图像的实际情况相符,通常情况下采用8连通模式进行像素连接; 3.bwlabel函数返回的标签矩阵L是整数类型,每个像素的值对应于其所属连通区域的标签值; 4.如果图像中存在孤立的像素(即像素值为1但未与其他像素相连通),则会将其单独标记为一个连通区域,标签值为2; 总之,Matlabbwlabel函数在图像分割、目标检测、物体识别等领域有着广泛的应用,可以方便地进行像素连通区域的标记和计数。在使用bwlabel函数时,需要灵活选择连接模式,避免因不正确的连接模式导致分割结果错误。 ### 回答3: MATLABbwlabel函数主要用于二进制图像中像素连通分量的标记,即将一张二值图像中的每个连通区域用不同的数码进行标记,相同的数码表示同属于一个连通分量。 该函数的语法格式为: [L, num] = bwlabel(BW, n) 其中,BW表示要进行标记的二值图像,n是可选的操作参数,表示要识别的相邻像素的连接性,n可以取值为4或8。L是输出矩阵,它与输入图像大小相同,每个像素与相应地标记连接。num表示二值图像中连通分量的数量。 该函数的实现步骤如下: 1. 对于输入的二值图像BW,设定标记值count为0,创建一个标记矩阵L,其大小与BW相同。 2. 对于BW中的每个像素点,如果其值为1且其未被标记,则将其视为该连通分量的起始像素,将count+1,并以该count值对该连通分量进行标记。 3. 对于起始像素,使用递归方式进行像素的四向或八向查找,将相邻的像素标记为相同的标记值。在标记完该连通分量后,返回到上一个起始像素,进行下一个连通分量的标记。 4. 返回标记矩阵L和连通分量数量num。 bwlabel函数的使用可以帮助我们进行目标识别、形态分析等操作,是图像处理中非常常用的函数之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

littletomatodonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值