[已解决] 怎么统计图片中的花朵的数量

[复制链接]
aoligei888 发表于 2021-6-1 18:19:38
新手,不是很懂,能不能告诉我应该怎么去操作,或者有大大发源代码,也是万分感激的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

最佳答案


gywxd 发表于 2021-6-1 23:37:00
%%%生成代码                                                                                                                                       

        workpic=imread('D:\work\down\11.jpg');                                                                                                
        oldpic=workpic ;                                                                                                                       
        %%%%读取需要处理的图片                                                                                                                          

        tmppic=workpic*0;                                                                                                                     
        flg= workpic(:,:,1)-workpic(:,:,2) >16.4286  &  workpic(:,:,1)-workpic(:,:,3) >16.4286  ;                                             
        %红色筛选                                                                                                                                 
        tmppic(:,:,1)=workpic(:,:,1).*uint8(flg);                                                                                             
        tmppic(:,:,2)=workpic(:,:,2).*uint8(flg);                                                                                             
        tmppic(:,:,3)=workpic(:,:,3).*uint8(flg);                                                                                             
        workpic=tmppic ;                                                                                                                       
        %%颜色过滤                                                                                                                                 

        se = strel('disk',20);                                                                                                                 
        workpic = imopen(workpic,se);                                                                                                         
        %%  开运算                                                                                                                                

        workpic=im2bw(workpic,0.03);                                                                                                           
        %%%%闸值二值化处理                                                                                                                           

        workpic=~workpic;                                                                                                                     
        %%%%图片反色处理                                                                                                                             

        [L,n]=bwlabel(~workpic,8) ;                                                                                                            
        boxlist=regionprops(L,'BoundingBox');      %寻找每个区域的最小矩形                                                                                
        centlist=regionprops(L,'Centroid');        %寻找每个区域的质心                                                                                 
        maxxs=0 ;                                                                                                                              
        minxs=1000000000000000 ;                                                                                                               
        maxn=0 ;                                                                                                                              
        minn=0 ;                                                                                                                              
        for k=1:n                                                                                                                              
            tmout=L==k;                                                                                                                        
            countxiangshu=sum(sum(tmout));                                                                                                     
            if countxiangshu > maxxs                                                                                                           
                maxxs=countxiangshu;                                                                                                           
                maxn=k;                                                                                                                        
            end                                                                                                                                
            if countxiangshu < minxs                                                                                                           
                minxs=countxiangshu;                                                                                                           
                minn=k;                                                                                                                        
            end                                                                                                                                
        end                                                                                                                                    
        imshow(workpic);                                                                                                                       
        for k=1:n                                                                                                                              
             rectangle('position',boxlist(k).BoundingBox,'edgecolor','r');  %绘制矩形框                                                            
             text(centlist(k).Centroid(1,1)-15,centlist(k).Centroid(1,2)-15,num2str(k),'Color','r');  %标注编号                                    
        end                                                                                                                                    
        rectangle('position',boxlist(maxn).BoundingBox,'edgecolor','b'); %标注最大                                                                 
        rectangle('position',boxlist(minn).BoundingBox,'edgecolor','g'); %标注最小                                                                 
            %%%标记计数 最大最小                                                                                                                       

                  第二张 先颜色过滤  然后开运算    亮度二值化   反色后 标记计数                                                                                                                           

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

2 条回复


gywxd 发表于 2021-6-1 23:13:56
本帖最后由 gywxd 于 2021-6-1 23:31 编辑

%%%生成代码                                                                                                                           

        workpic=imread('D:\work\down\hua22.jpg');                                                                                 
        oldpic=workpic ;                                                                                                           
        %%%%读取需要处理的图片                                                                                                              

        se = strel('disk',20);                                                                                                     
        workpic = imopen(workpic,se);                                                                                                   
        %%  开运算                                                                                                                    

        workpic=im2bw(workpic,0.44521);                                                                                            
        %%%%闸值二值化处理                                                                                                               

        workpic=~workpic;                                                                                                         
        %%%%图片反色处理                                                                                                                 

        [L,n]=bwlabel(~workpic,8) ;                                                                                                
        boxlist=regionprops(L,'BoundingBox');      %寻找每个区域的最小矩形                                                                    
        centlist=regionprops(L,'Centroid');        %寻找每个区域的质心                                                                     
        maxxs=0 ;                                                                                                                  
        minxs=1000000000000000 ;                                                                                                   
        maxn=0 ;                                                                                                                  
        minn=0 ;                                                                                                                  
        for k=1:n                                                                                                                  
            tmout=L==k;                                                                                                            
            countxiangshu=sum(sum(tmout));                                                                                         
            if countxiangshu > maxxs                                                                                               
                maxxs=countxiangshu;                                                                                               
                maxn=k;                                                                                                            
            end                                                                                                                    
            if countxiangshu < minxs                                                                                               
                minxs=countxiangshu;                                                                                               
                minn=k;                                                                                                            
            end                                                                                                                    
        end                                                                                                                        
        imshow(workpic);                                                                                                           
        for k=1:n                                                                                                                  
             rectangle('position',boxlist(k).BoundingBox,'edgecolor','r');  %绘制矩形框                                                
             text(centlist(k).Centroid(1,1)-15,centlist(k).Centroid(1,2)-15,num2str(k),'Color','r');  %标注编号                        
        end                                                                                                                        
        rectangle('position',boxlist(maxn).BoundingBox,'edgecolor','b'); %标注最大                                                     
        rectangle('position',boxlist(minn).BoundingBox,'edgecolor','g'); %标注最小                                                     
            %%%标记计数 最大最小                                                                                                           





第一张可以这样处理 先开运算 然后 用亮度闸值生成二值图   然后计数                                                                                                           

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

gywxd 发表于 2021-6-1 23:37:00
%%%生成代码                                                                                                                                       

        workpic=imread('D:\work\down\11.jpg');                                                                                                
        oldpic=workpic ;                                                                                                                       
        %%%%读取需要处理的图片                                                                                                                          

        tmppic=workpic*0;                                                                                                                     
        flg= workpic(:,:,1)-workpic(:,:,2) >16.4286  &  workpic(:,:,1)-workpic(:,:,3) >16.4286  ;                                             
        %红色筛选                                                                                                                                 
        tmppic(:,:,1)=workpic(:,:,1).*uint8(flg);                                                                                             
        tmppic(:,:,2)=workpic(:,:,2).*uint8(flg);                                                                                             
        tmppic(:,:,3)=workpic(:,:,3).*uint8(flg);                                                                                             
        workpic=tmppic ;                                                                                                                       
        %%颜色过滤                                                                                                                                 

        se = strel('disk',20);                                                                                                                 
        workpic = imopen(workpic,se);                                                                                                         
        %%  开运算                                                                                                                                

        workpic=im2bw(workpic,0.03);                                                                                                           
        %%%%闸值二值化处理                                                                                                                           

        workpic=~workpic;                                                                                                                     
        %%%%图片反色处理                                                                                                                             

        [L,n]=bwlabel(~workpic,8) ;                                                                                                            
        boxlist=regionprops(L,'BoundingBox');      %寻找每个区域的最小矩形                                                                                
        centlist=regionprops(L,'Centroid');        %寻找每个区域的质心                                                                                 
        maxxs=0 ;                                                                                                                              
        minxs=1000000000000000 ;                                                                                                               
        maxn=0 ;                                                                                                                              
        minn=0 ;                                                                                                                              
        for k=1:n                                                                                                                              
            tmout=L==k;                                                                                                                        
            countxiangshu=sum(sum(tmout));                                                                                                     
            if countxiangshu > maxxs                                                                                                           
                maxxs=countxiangshu;                                                                                                           
                maxn=k;                                                                                                                        
            end                                                                                                                                
            if countxiangshu < minxs                                                                                                           
                minxs=countxiangshu;                                                                                                           
                minn=k;                                                                                                                        
            end                                                                                                                                
        end                                                                                                                                    
        imshow(workpic);                                                                                                                       
        for k=1:n                                                                                                                              
             rectangle('position',boxlist(k).BoundingBox,'edgecolor','r');  %绘制矩形框                                                            
             text(centlist(k).Centroid(1,1)-15,centlist(k).Centroid(1,2)-15,num2str(k),'Color','r');  %标注编号                                    
        end                                                                                                                                    
        rectangle('position',boxlist(maxn).BoundingBox,'edgecolor','b'); %标注最大                                                                 
        rectangle('position',boxlist(minn).BoundingBox,'edgecolor','g'); %标注最小                                                                 
            %%%标记计数 最大最小                                                                                                                       

                  第二张 先颜色过滤  然后开运算    亮度二值化   反色后 标记计数                                                                                                                           

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复此楼
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表