MATLAB-图像处理-使用matlab计算图片内物体的个数(分水岭算法)

基于形态学处理+分水岭变换实现图像的分割及计算图片内物体的个数

原图
分水岭算法处理结果图

 编码解决思路

1. 读取图片并灰度化处理 

clc;clear;close all;
%读入图片 灰度处理
figure
img=imread('C:\Users\Administrator\Desktop\黄豆.png'); %读取到一张图片
subplot(121)
imshow(img);title('原图','fontsize',16);
axis on
subplot(122)
grayImg=rgb2gray(img);
imshow(grayImg);title('灰度','fontsize',16)
axis on

 

 2. 自适应阈值二值化处理后并取反运算

%% 二值化处理后取反运算
figure
Th=graythresh(grayImg);
binaryImg1=imbinarize(grayImg,Th);%自适应阈值
binaryImg2=imcomplement(binaryImg1);
subplot(121);imshow(binaryImg1);title('自适应阈值','fontsize',16);axis on
subplot(122);imshow(binaryImg2);title('图像求反运算','fontsize',16);axis on

 

 3. 图像形态学处理

%% 图像形态学处理:腐蚀后开运算
se =strel('disk',5,4) ;%创建一个指定半径5的平面圆盘形的结构元素,N可以被忽略,此时缺省值是4
rodeImg=imerode(binaryImg2,se);%腐蚀
openImg=imopen(rodeImg,se);%开运算
figure;
subplot(121);imshow(rodeImg);title('腐蚀','fontsize',16)
subplot(122);imshow(openImg);title('开运算','fontsize',16)

 

 4. 二值图像的距离变换、分水岭变换

%% 二值图像的距离变换 分水岭变换
figure
distBinary = -bwdist(~openImg);%二值图像的距离变换
imshow(distBinary,[])
figure
Ld = watershed(distBinary);
imshow(label2rgb(Ld))
距离变换
分水岭变换

       理想情况下,对imextendedmin的以下调用应该只产生大致位于要分割的单元格中间的小点。将使用imshowpair将蒙版叠加在原始图像上。修改距离变换,使其仅在所需位置具有最小值,然后重复上述分水岭步骤。 

%理想情况下,对imextendedmin的以下调用应该只产生大致位于要分割的单元格中间的小点。
%将使用imshowpair将蒙版叠加在原始图像上。
figure
mask = imextendedmin(distBinary,0.95);
imshowpair(openImg,mask,'blend')
%修改距离变换,使其仅在所需位置具有最小值,然后重复上述分水岭步骤。
distBinary2 = imimposemin(distBinary,mask);
Ld2 = watershed(distBinary2);
openImg2 = openImg;
openImg2(Ld2 == 0) = 0;
figure
imshow(openImg2)

  

 程序运行结果

 MATLAB程序源代码(全部代码)

clc;clear;close all;
%读入图片 灰度处理
figure
img=imread('C:\Users\Administrator\Desktop\黄豆.png'); %读取到一张图片
subplot(121)
imshow(img);title('原图','fontsize',16);
axis on
subplot(122)
grayImg=rgb2gray(img);
imshow(grayImg);title('灰度','fontsize',16)
axis on

%% 二值化处理
figure
Th=graythresh(grayImg);
binaryImg1=imbinarize(grayImg,Th);%自适应阈值
binaryImg2=imcomplement(binaryImg1);
subplot(121);imshow(binaryImg1);title('自适应阈值','fontsize',16);axis on
subplot(122);imshow(binaryImg2);title('图像进行求反运算','fontsize',16);axis on

%% 图像形态学处理:腐蚀后开运算
se =strel('disk',5,0) ;%创建一个指定半径5的平面圆盘形的结构元素,此时缺省值是4
% se =strel('square',5);
% se =strel('rectangle',[6 2]);
rodeImg=imerode(binaryImg2,se);%腐蚀
openImg=imopen(rodeImg,se);%开运算
figure;
subplot(121);imshow(rodeImg);title('腐蚀','fontsize',16)
subplot(122);imshow(openImg);title('开运算','fontsize',16)

%% 二值图像的距离变换 分水岭变换
figure
distBinary = -bwdist(~openImg);%二值图像的距离变换
imshow(distBinary,[])
figure
Ld = watershed(distBinary);
imshow(label2rgb(Ld))

%理想情况下,对imextendedmin的以下调用应该只产生大致位于要分割的单元格中间的小点。
%将使用imshowpair将蒙版叠加在原始图像上。
figure
mask = imextendedmin(distBinary,0.95);
imshowpair(openImg,mask,'blend')

%修改距离变换,使其仅在所需位置具有最小值,然后重复上述分水岭步骤。
distBinary2 = imimposemin(distBinary,mask);
Ld2 = watershed(distBinary2);
openImg2 = openImg;
openImg2(Ld2 == 0) = 0;
figure
imshow(openImg2)
[B,L,N]=bwboundaries(openImg2,4);
disp(['图中共有',num2str(N),'个连通分量' ]);
fig=figure;
image(img);
hold on;
for k=1:length(B)
    boundary=B{k};
    if(k>N)
        plot(boundary(:,2),boundary(:,1),'r','LineWidth',2); %显示内部边界
    else
        plot(boundary(:,2),boundary(:,1),'y','LineWidth',2); %显示外部边界
    end
end
% figure(7);
% imshow(grayImg);
%% 单个枸杞面积
STATS=regionprops(L,'Area');%获得每个联通域的面积大小,保存在数组area中
area=[STATS.Area];%每个连通区域的面积

centroid = regionprops(L,'Centroid');%'Centroid'每个区域的质心(重心)
for i=1:N
    hold on
    plot(centroid(i,1).Centroid(1,1),centroid(i,1).Centroid(1,2), 'ro','MarkerFaceColor','r');
end
status=regionprops( L,'BoundingBox');%regionprops统计被标记的区域的面积分布,显示区域总数。'Bounding
for i=1:N
    rectangle('position',status(i).BoundingBox,'edgecolor','g','LineWidth',1);%绘制矩形,边框颜色为黄色
    text(centroid(i,1).Centroid(1,1)-15,centroid(i,1).Centroid(1,2)-15, num2str(i),'Color', 'm','fontsize',16);  
end
 disp(['图中枸杞数量为:',num2str(N) ]);
% 
% magnifyOnFigure(fig, 'displayLinkStyle', 'straight',...%显示连接线为一条实线
%                     'EdgeColor', 'k',...%边框颜色
%                     'magnifierShape', 'rectangle',...%放大的形状为矩形,默认为矩形
%                     'frozenZoomAspectratio', 'on',...%强制在X轴和Y轴上使用相同的缩放倍数,以保持纵横比
%                     'edgeWidth', 1);%边框线宽
% magnifyOnFigure(fig, 'displayLinkStyle', 'straight',...%显示连接线为一条实线
%                     'EdgeColor', 'k',...%边框颜色
%                     'magnifierShape', 'rectangle',...%放大的形状为矩形,默认为矩形
%                     'frozenZoomAspectratio', 'on',...%强制在X轴和Y轴上使用相同的缩放倍数,以保持纵横比
%                     'edgeWidth', 1);%边框线宽

  • 13
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: k-means 聚类算法是一种用于图像处理算法,它可以将给定的像素点聚类成不同的类别,从而用于图像分割等应用。在该算法中,需要先指定初始类别数 k,然后根据像素点之间的距离,将它们分配到不同的类别中。接着,再计算每个类别中所有像素点的中心点,并将这些中心点作为新的聚类中心,反复迭代直至收敛。该算法的核心是通过最小化各个类别内像素点与中心点之间的距离,来达到将像素点聚类的目的。 ### 回答2: MATLAB是一种高级计算机编程语言和框架,它具有强大的图像处理功能。K-means聚类算法是一种常见的图像处理算法,主要用于对图像进行分割和分类。 K-means算法的基本原理是将n个数据点分为k个不同的聚类,每个点都应该分配到相应的聚类,以使得聚类之间的总方差最小化。在图像处理中,K-means算法被用于对图像像素的RGB值进行聚类,从而将图像分成k个部分。K-means算法可以通过以下步骤实现: 1. 随机选择k个像素作为初始聚类中心 2. 计算每个像素与每个聚类中心之间的距离 3. 将每个像素分配到距离最近的聚类中心 4. 更新每个聚类中心的位置,计算它们的平均值 5. 重复步骤2-4,直到聚类中心不再发生变化 在MATLAB中,可以使用K-means函数轻松实现图像的聚类。首先,将图像读入MATLAB中,并将其转换为灰度图像。然后,使用K-means函数对像素进行聚类。最后,将聚类结果与原始图像进行比较,以获得最终的分割结果。 K-means算法的优点是速度快,适用于大型数据集。但是,它也有一些缺点,例如对于数据分布的不敏感性和可能获取到局部最小值。为了避免这些问题,可以使用其他更高级的聚类算法,例如DBSCAN或谱聚类。 总之,MATLAB的K-means聚类算法图像处理中一种快速有效的算法。它能够处理大量像素,并将图像分割成不同的部分,使得图像分析和处理更加容易和有效。 ### 回答3: K-Means聚类算法是一种常用的图像处理算法,主要用于图像的分割和处理。该算法基于聚类的思想,将相似的图像像素进行分组,以便于更好地进行处理。 在Matlab中,K-Means聚类算法可以通过使用“imsegkmeans”函数来实现。该函数可以根据输入的图像和聚类数目对图像进行分割。聚类数目的选择非常重要,应该根据实际的需求和应用来进行选择。 实现K-Means聚类算法的过程包括以下几个步骤: 1. 读入图像,将其转换为灰度图像格式(如果不是灰度图像)。 2. 设定聚类数目,以便于将图像分为相应的聚类。 3. 将图像中的像素点转换为聚类中心坐标,每个聚类都有一个中心点。 4. 计算每个像素点与所有聚类中心点的欧几里得距离,然后将像素点划分到距离最近的聚类中心。 5. 根据每个聚类的像素点计算新的聚类中心,重复执行步骤4和5,直到聚类中心不再发生变化为止。 6. 绘制分割后的图像,将不同的聚类用不同的颜色进行标识。 K-Means聚类算法图像处理中的应用非常广泛,可以用于图像分割、去噪、图像压缩等。在实际应用中,需要根据实际情况进行优化和调整,以获得更好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值