机器学习Day5--影像处理的应用--统计图中有几颗米
MATLAB影像处理的简单应用--统计图中有多少颗米,本次使用MATLAB内置的rice.png作为实验材料。先从基本的影像处理函数开始,一步步实现功能的实现及调优。
MATLAB影像处理的简单应用--统计图中有多少颗米,本次使用MATLAB内置的rice.png作为实验材料。先从基本的影像处理函数开始,一步步实现功能的实现及调优。

准备阶段:
1.显示灰度影像的柱形图:
%图片为MATLAB中内置的测试图像
I = imread('rice.png');
imhist(I);
eg.

2.将图像二值化处理(Gray-level to Binary):
%MATLAB中内置的函数,用与求出灰度图像最佳阈值
level = graythresh(I);
%以最佳阈值为基准,二值化图像
bw = im2bw(I,level);
%展开一个(1*2)的网格
subplot(1,2,1);imshow(I);%位置一放rice.png
subplot(1,2,2);imshow(bw);%位置二房二值化结果
eg.

从图中不难发现,使用自动化函数二值化的效果并不理想,不仅出现了许多噪点,并且图像底部部分米也消失了。这是因为拍摄图像时的光照不均导致的,亮的地方就会在灰度图像中表现得更白一些。接下来来减少环境因素带来的影响。
3. 背景估算(Background Estimation):
imopen()是MATLAB图像处理工具箱中的形态学开运算函数,用于去除小物体、平滑物体边界并保持整体形状不变。
这种操作特别适用于:
-
去除小噪声点(小于结构元素的孤立点)
-
断开细连接(比结构元素窄的连接部分)
-
平滑物体轮廓(保持大物体形状基本不变)
-
背景估计(对于不均匀背景的图像)
BG = imopen(I,strel('disk',15));
imshow(BG)
eg.
4.背景减除(Background Subtraction):
%减除背景
I2 = imsubtract(I,BG);
%展开网格
subplot(1,2,1);imshow(bw);
%重新计算最佳阈值
level2 = graythresh(I2);
%二值化处理
bw2 = im2bw(I2,level2);
%展开网格
subplot(1,2,2);imshow(bw2);
eg.
目前为止,我们已经得到了一张经过较为全面处理后的图像了,接下来开始功能实现部分。
功能实现阶段:
实现算法:
1.准备一个新的矩阵(Label matrix)用来接收被标记的大米的位置。

2. 遍历二值化图像(Binary image)找出其中值为1的像素(Pixel),在标记矩阵中相同位置处赋值。

3. 当找到第一个目标像素时向(下/右)寻找是否还有目标像素,若有,则赋相同值。


4. 重复上诉操作:


算法很简单, 读者可以自行尝试,这里我们使用MATLAB内置的函数来实现:
5.bwlabel(二值化图像,连通性):
连通性:4(上下左右)或8(包括对角线)
%[标记矩阵(以逻辑矩阵的格式保存),区块数]
[labeled,numObjects] = bwlabel(bw2,8)
eg.

至此我们已经得知图中共有99颗米。
[Extend]
1.以RGB图像输出:
%转换函数
RGB_label = label2rgb(labeled);
%展开网格
subplot(1,2,1);imshow(labeled);
subplot(1,2,2);imshow(RGB_label);
eg.

2.区块属性:
regionprops()是MATLAB图像处理工具箱中用于计算图像区域属性的核心函数,当使用basic参数时,函数返回包含以下字段的结构体数组:
-
Area:区域内像素总数
-
Centroid:区域的质心坐标[x,y]
-
BoundingBox:包围区域的最小矩形[x,y,width,height]
Bigdata = regionprops(labeled,'basic');
eg.


3.绘制大米面积区间柱状图:
% 提取所有区域的面积数据
areas = [Bigdata.Area];
% 设置面积区间 (10为步长)
binEdges = 0:10:max(areas)+10; % 从0开始,每10个像素一个区间
% 绘制频数分布直方图
figure;
h = histogram(areas, binEdges);
xlabel('面积区间(像素)');
ylabel('区域个数');
title('按面积区间的区域分布');
grid on;
eg.

figure;
bar(areas);
xlabel('区域编号');
ylabel('面积(像素数)');
title('各连通区域面积分布');
grid on;
eg.

结合这两张图,我们发现还是有一些异常值——过大(两颗米重叠在一起)、过小(图片边缘的也算进来了)。所以通常在影像处理完后,我们往往还需要接上数据清洗步骤。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)