图像中米粒个数的识别(2)——如何从左到右依次给米粒计数

在上文MATLAB示例——图像中米粒个数的识别中,我详细介绍了图像中米粒个数的识别以及计数相关算法及程序实现。但是我们发现,最后的结果米粒计数好像是从任意位置开始的,那要如何从最左上端开始,到右下端结束呢?

主要思路

我的主要思想是统计出标签矩阵 L中各个米粒的横纵坐标位置,将其赋值在一个元胞数组1中,然后提取出横坐标的最小值(如果按列排序则提取出纵坐标的最小值)将其存放在另一个矩阵中。
依次遍历另一个新的元胞数组2,同时寻找横坐标矩阵最小值所在的行数,将其对应的行数所在的元胞数组1中存放的数据赋值到2中。
这样就完成了排序。
这样说,可能不太明白,直接上代码演示:

程序设计

%% 从左到右依次计数
%RC元胞数组用于统计米粒的横坐标长度和纵坐标长度
for k = 1:n
    [r,c]= find(L == k);
    RC{k,1}=r;% RC{k,1}表示第k行第一列存放第k个米粒的横坐标数值
    RC{k,2}=c;% RC{k,2}表示第k行第二列存放第k个米粒的纵坐标数值
end

%统计RC元胞数组中第一列中的最小值(行最小值)
for jj=1:n    
      RR(jj,1)=min(RC{jj,1});  
end

%对RC根据从小到大进行排序赋值给RC2
for jjj=1:n
    [~,kkk]=min(RR);%找到RR的最小值的行坐标
    RR(kkk,1)=Inf;%最小值赋值为无穷大,方便找到次小值
    %排序
    RC2{jjj,1}=RC{kkk,1};
    RC2{jjj,2}=RC{kkk,2};
end
figure(3),imshow(f);title('顺序排序');%输出从左上开始排序的图像
hold on;
for k = 1:n
    r=RC2{k,1};c=RC2{k,2};
    rbar = mean(r);%计算均值
    cbar = mean(c);
    %lengthh(k,1) = max(RC2{k,1})-min(RC2{k,1});%计算条码的高
    %lengthh(k,2) = max(RC2{k,2})-min(RC2{k,2});%计算条码的长
    plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);% 标注o
    plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w');     % 标注*
    text(cbar,rbar,num2str(k),'Color','red','FontSize',14); % 标注标号
end

输出图像:
在这里插入图片描述

可以看到,图像中米粒大小从左到右进行了顺序排序。

如果我们想要自上而下排序,则只需要修改将RC{jj,1}改为RC{jj,2}即可。

在这里插入图片描述
输出图像:
在这里插入图片描述

ok,以上便是全部内容了,如果对你有所帮助,记得点个赞呦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wendy_ya

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

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

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

打赏作者

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

抵扣说明:

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

余额充值