• 大小: 5KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: Matlab
  • 标签: Matlab  棒材计数  

资源简介

用matlab编写的面积法图像处理识别图中棒材个数,图片名称为0,且应放于与程序所在同一目录

资源截图

代码片段和文件信息


function mianji()
global TotalRow
global TotalCol
global ImageLable

%%%%%%% 处理图像 %%%%%%%
%I为原始图像
I=imread(‘0.jpg‘);
I1=rgb2gray(I);%灰度化
I2=medfilt2(I1[33]);%中值滤波

thresh=graythresh(I2);
I3=im2bw(I2thresh);%I3为二值化后的图像

se=strel(‘disk‘2);
ImOpen=imopen(I3se);%开运算

%%%%% 连通域贴标签 %%%%%%
%计算连通域的数量number
[TotalRowTotalCol]=size(ImOpen);%获得图像的总行数TotalRow总列数TotalCol
ImageLable=double(ImOpen);%获得空标签
number=1;%连通域的个数赋初值0
seed=0;%种子数赋初值0

for row=1:TotalRow
    for col=1:TotalCol
        K=zeros(10002);%K为存放种子点坐标的2列矩阵
        %寻找一个连通域中的第一个种子像素
        if ImageLable(rowcol)==1 
            seed=1;
            K(11)=row;K(12)=col;
            number=number+1;
            ImageLable(rowcol)=number;%标记
        end
        %进行区域生长
        while seed~=0 %直到所有的种子都生长过才会停止while循环
            R=K(seed1);C=K(seed2); %选取K的最后一个为生长用种子
            seed=seed-1;%使用过的种子下次不再使用
            %八连通情况下判断种子邻域是否物体
            for rr=-1:1
                for cc=-1:1
                    if R+rr>=1 && C+cc>=1 && R+rr<=TotalRow && C+cc<=TotalCol && ImageLable(R+rrC+cc)==1;%不考虑边缘
                        ImageLable(R+rrC+cc)=number;%标记
                        seed=seed+1;
                        K(seed1)=R+rr;K(seed2)=C+cc;
                    end % if R+rr>=1...的end
                end % for cc=-1:1的end
            end % for rr=-1:1的end
        end % while seed~=0的end
    end % for col=1:TotalCol的end
end % for row=1:TotalRow 的end
number=number-1;

LableMax=number+1;%标签最大值

%%%%%% 求最佳平均面积 %%%%%%
%step1:计算每个连通域的面积
Area=[];%Area为存放面积的数组
Center=zeros(number2);%Center为存放中心点的矩阵
for LableNum=2:LableMax %标签数值是从2到LableMax
    a=LableNum-1;
    %拷贝过来的findarea函数开始
    
        Arrr=0;%连通域的“质量”每个像素质量为1
XSum=0;%连通域的横坐标之和
YSum=0;%连通域的纵坐标之和

for x=1:TotalRow
    for y=1:TotalCol
        if (ImageLable(xy)==LableNum)%选取标签图像中标签为LableNum的像素
            XSum=XSum+x;%求目标连通域横坐标和
            YSum=YSum+y;%求目标联通域纵坐标和
            Arrr=Arrr+1;%求目标连通域“总质量”,即像素总数
       end
    end
end

centerX=round(XSum/Arrr);
centerY=round(YSum/Arrr);
Area(a)=Arrr;
Center(a1)=centerX;
Center(a2)=centerY;


  %拷贝过来的findarea函数结束   
    
end
%step2:据算法得到最接近实际的面积均值
%AreaAver=areaaver(Area);
%拷贝过来的areaaver函数 开始
AreaOrder=sort(Area‘ascend‘

评论

共有 条评论