灰度图像处理——连通分量提取(Matlab)

clc;
clear all;
close all;
%提取连通分量测试图像,用来检测食物中的外来物
I=im2double(imread('D:\Gray Files\9-18a.tif'));
%获得图像大小
[M,N]=size(I);
%存放腐蚀后的图像
%设定提取门限,根据经验设定
th=0.808;
%将原图像根据上述门限进行二值处理,大于等于门限为1,小于为0
ind=find(I>=th);
I(ind)=1;
ind=find(I<th);
I(ind)=0;
%获得值为1的x,y坐标
[rows,cols]=find(I==1);
%将x,y坐标点组合成下标矩阵
index=cat(2,rows,cols);
%5*5结构元素
n=5;
B=ones(n,n);
n_l=floor(n/2);
%对边界图进行扩充,四周各加2行、2列0(与结构元素的大小相对应),目的是为了处理边界点
I_pad=padarray(I,[n_l,n_l]);
%将下标矩阵加2
index=index+2;
%保存所有连通对象集
Objs={};
%设定递归上限
set(0,'RecursionLimit',10000);
%递归寻找连通对象
while 1
    %取出下标矩阵中的第一个值
    if isempty(index)
        break;
    end
    %取出下标矩阵中的第一个对象
    p=index(1,:);
    A=FindConnectedPoint(p,I_pad,index,n_l);  
    %将边界线对象保存至对象集
    Objs=cat(1,Objs,A{1,1}-n_l);
    index=A{1,2}; 
    I_pad=A{1,3};        
end
%显示连通对象
J=zeros(M,N);
if ~isempty(Objs)
    for i=1:size(Objs,1)
        Obj=Objs{i,1};
        for j=1:size(Obj,1)
            J(Obj(j,1),Obj(j,2))=1;
        end
    end
end
imshow(J)

FindConnectedPoint函数如下:

function R=FindConnectedPoint(p,Beta_pad,ind,n_l)
    %保存边界坐标对象
    Obj=[];
    %以p为中心点,从边界图中取出3*3大小的块区域
    Block=Beta_pad(p(1,1)-n_l:p(1,1)+n_l,p(1,2)-n_l:p(1,2)+n_l);
    Obj=p;
    %将图像中的p点置零
    Beta_pad(p(1,1),p(1,2))=0;
    %将块区域中的p点置零
    Block(n_l+1,n_l+1)=0;
    A=cell(1,3);
    %将p点从下标矩阵中删除
    for j=1:size(ind,1)
        if ind(j,:)==p
            ind(j,:)=[];
            break;
        end
    end
    %寻找块区域中为1的点的下标
    [rows,cols]=find(Block==1);
    ind_sub=cat(2,rows,cols);
    if ~isempty(ind_sub)
        %确定块中数值为1的点的坐标
        for i=1:size(ind_sub,1) 
            p_next=[];
            if ind_sub(i,1)<=n_l+1
                p_next(1,1)=p(1,1)-abs(n_l+1-ind_sub(i,1));
                if ind_sub(i,2)<=n_l+1                    
                    p_next(1,2)=p(1,2)-abs(n_l+1-ind_sub(i,2));
                else
                    p_next(1,2)=p(1,2)+abs(n_l+1-ind_sub(i,2));                    
                end
            else
                p_next(1,1)=p(1,1)+abs(n_l+1-ind_sub(i,1));
                if ind_sub(i,2)<=n_l+1                    
                    p_next(1,2)=p(1,2)-abs(n_l+1-ind_sub(i,2));
                else
                    p_next(1,2)=p(1,2)+abs(n_l+1-ind_sub(i,2));                    
                end                
            end
            if Beta_pad(p_next(1,1),p_next(1,2))~=0                        
                A=FindConnectedPoint(p_next,Beta_pad,ind,n_l);
                Obj=cat(1,A{1,1},Obj);   
            end                       
            %更新下标矩阵
            ind=A{1,2};
            Beta_pad=A{1,3};
        end
    end
    %返回结果
    R={Obj,ind,Beta_pad};
end

 

基于MATLAB的HSV颜色空间用于图像处理时,可以有效地从复杂的背景中提取出特定的颜色信息。HSV模型将色彩分为色调(Hue)、饱和度(Saturation)以及亮度(Value),这使得它非常适合人类对颜色感知的理解,并且有助于简化某些计算机视觉任务。 为了使用MATLAB进行HSV图像特征提取,您可以按照下面几个步骤操作: ### 1. 将RGB转换成HSV 首先需要把原始输入图片由红绿蓝三原色表示的空间转到HSV空间上。这是因为大多数数字摄像头采集的数据都是以RGB格式存储的,在这种情况下直接做分割效果往往不好;而经过变换之后再选择合适的阈值就能更好地分离目标区域了。 ```matlab rgbImage = imread('your_image_file.jpg'); % 加载图像文件 hsvImage = rgb2hsv(rgbImage); % RGB 转换为 HSV 空间 ``` ### 2. 应用阈值选取感兴趣区(ROI) 接下来就是设定合理的范围来选出感兴趣的物体或部分。例如如果你想要找到所有的红色元素,则可以根据已知条件给出H分量的大致区间作为参考标准;对于S、V同样如此,但有时候也可能不需要特别严格的限制它们的具体数值——视具体情况而定。 假设我们要找蓝色的目标物: ```matlab lowerBound = [0.55, 0.4, 0.3]; % 设定下限 (针对 H,S,V) upperBound = [0.7 ,1.0, 1.0 ]; % 设定上限 % 创建掩膜矩阵mask mask = all(hsvImage >= lowerBound & hsvImage <= upperBound, 3); ``` ### 3. 分析并计算统计特性 最后一步是利用生成好的二进制图来进行形态学运算或其他数学描述方法得到最终的结果。比如面积大小、周长长度等几何属性都可用于定量分析;此外还可以进一步探索灰度直方图分布情况等等更多层面的信息挖掘工作。 ```matlab labelMatrix = bwlabel(mask); % 连通组件标记化 props = regionprops(labelMatrix,'Area','Centroid'); areas = cat(1, props.Area); figure; imshow(mask); hold on; for i=1:length(props) plot(props(i).Centroid(1), props(i).Centroid(2), 'ro', 'MarkerFaceColor', 'r'); end title(['Detected Objects Count:', num2str(length(props))]); hold off; ``` 通过上述过程我们就可以很好地完成一次基础版HSV颜色空间下的图像特征检测啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值