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图像处理工具箱中的形态学开运算函数,用于去除小物体、平滑物体边界并保持整体形状不变。

这种操作特别适用于:

  1. 去除小噪声点(小于结构元素的孤立点)

  2. 断开细连接(比结构元素窄的连接部分)

  3. 平滑物体轮廓(保持大物体形状基本不变)

  4. 背景估计(对于不均匀背景的图像)

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参数时,函数返回包含以下字段的结构体数组:

  1. Area:区域内像素总数

  2. Centroid:区域的质心坐标[x,y]

  3. 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.

        结合这两张图,我们发现还是有一些异常值——过大(两颗米重叠在一起)、过小(图片边缘的也算进来了)。所以通常在影像处理完后,我们往往还需要接上数据清洗步骤。 

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐