在上文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,以上便是全部内容了,如果对你有所帮助,记得点个赞呦~