纠正不均匀照明和分析前景对象
这个例子展示了如何增强图像作为分析前的预处理步骤。在本例中,您更正了不均匀的背景照明,并将图像转换为二值图像,以便于识别前景对象(单个米粒)。然后,您可以分析对象,例如找到每粒米的面积,并且可以计算图像中所有对象的统计信息。
预处理图像
将图像读入工作区。
I = imread(“rice.png”);imshow(我)
图像中心的背景照明比底部的更亮。对图像进行预处理,使背景照明更加均匀。
作为第一步,使用形态学开放去除所有前景(米粒)。打开操作删除不能完全包含结构元素的小对象。定义一个半径为15的圆盘形结构元素,它完全适合一粒米。
Se = strel(“磁盘”15)
se = strel是一个圆盘形状的结构元素,其属性:邻域:[29x29 logical]维数:2
要执行形态开口,请使用imopen
构造元素。
background = imopen(I,se);imshow(背景)
减去背景近似图像,背景
,由原图,我
,并查看结果图像。从原始图像中减去调整后的背景图像后,得到的图像具有统一的背景,但现在对分析来说有点暗。
I2 = I -背景;imshow (I2)
使用imadjust
增加处理后图像的对比度I2
通过在低强度和高强度下饱和1%的数据,并通过拉伸强度值来填充uint8
动态范围。
I3 = imadjust(I2);imshow (I3)
注意,前面的两个步骤可以用一个步骤替换imtophat
它首先计算形态开口然后从原始图像中减去它。
I2 = imtophat(I,strel('disk',15));
创建已处理图像的二进制版本,以便使用工具箱函数进行分析。使用imbinarize
函数将灰度图像转换为二值图像。方法从图像中去除背景噪声bwareaopen
函数。
bw = imbinalize (I3);Bw = bwareaopen(Bw,50);imshow (bw)
识别图像中的对象
现在您已经创建了原始图像的二进制版本,您可以对图像中的对象进行分析。
找到二值图像中所有连接的组件(对象)。结果的准确性取决于对象的大小、连通性参数(4、8或任意值),以及是否有任何对象在接触(在这种情况下,它们可以被标记为一个对象)。二值图像中的一些米粒bw
是感人。
Cc = bwconncomp(bw,4)
cc =带字段的结构:连接性:4 ImageSize: [256 256] NumObjects: 95 PixelIdxList: {1x95 cell}
cc.NumObjects
Ans = 95
查看图中标记为50的米粒。
Grain = false(size(bw));grain(cc.PixelIdxList{50}) = true;imshow(粮食)
通过创建一个标签矩阵,然后将其显示为伪彩色索引图像,从而可视化图像中所有连接的组件。
使用labelmatrix
的输出创建标签矩阵bwconncomp
.请注意,labelmatrix
将标签矩阵存储在对象数量所需的最小数值类中。
标签= labelmatrix(cc);谁标签
名称大小字节类属性标签256x256 65536 uint8
使用label2rgb
选择色图、背景色,以及标签矩阵中的对象如何映射到色图中的颜色。在伪彩色图像中,标识标签矩阵中的每个对象的标签映射到关联的颜色映射矩阵中的不同颜色。
RGB_label = label2rgb(标签,“春天”,“c”,“洗牌”);imshow (RGB_label)
计算区域统计信息
计算图像中每个物体的面积使用regionprops
.每一粒米粒都是一个相连的组成部分cc
结构。
Graindata = regionprops(cc,“基本”)
graindata =95×1包含字段的struct数组:区域质心边界框
创建一个新向量grain_areas
,其中保存了每个颗粒的面积测量。
grain_areas = [graindata.Area];
求第50个分量的面积。
grain_areas (50)
Ans = 194
找到并显示面积最小的颗粒。
[min_area, idx] = min(grain_areas)
Min_area = 61
Idx = 16
Grain = false(size(bw));grain(cc.PixelIdxList{idx}) = true;imshow(粮食)
使用柱状图
命令创建米粒面积的直方图。
直方图(grain_areas)标题(“米粒面积直方图”)
另请参阅
imopen
|bwareaopen
|bwconncomp
|regionprops
|imadjust
|imbinarize
|label2rgb
|labelmatrix
|imread
|imshow