校正非均匀照明
这个例子展示了如何纠正图像中的不均匀照明,以便于识别图像中的单个米粒。然后,您可以了解颗粒的特征,并轻松计算图像中所有颗粒的统计信息。
第一步:读取图像
I = imread(“rice.png”);imshow(我)
步骤2:利用形态学开口估计背景
请注意,图像中心的背景照明比底部的更亮。使用imopen
估计背景照明。
background = imopen(I,strel(“磁盘”、15));将背景近似值显示为曲面图冲浪(double(background(1:8:end,1:8:end))),zlim([0 255]);Ax = gca;斧子。YDir =“反向”;
第三步:从原始图像中减去背景图像
I2 = I -背景;imshow (I2)
请注意,步骤2和步骤3一起可以被使用的单个步骤所取代imtophat
它首先计算形态开口然后从原始图像中减去它。
I2 = imtophat(I,strel('disk',15));
第四步:增加图像对比度
I3 = imadjust(I2);imshow (I3);
步骤5:阈值图像
通过对调整后的图像进行阈值,创建一个新的二值图像。去除背景噪音bwareaopen
.
bw = imbinalize (I3);Bw = bwareaopen(Bw, 50);imshow (bw)
步骤6:识别图像中的物体
这个函数bwconncomp
查找二进制图像中所有连接的组件(对象)。结果的准确性取决于对象的大小、连通性参数(4、8或任意值),以及是否有任何对象在接触(在这种情况下,它们可能被标记为一个对象)。一些米粒进去了bw
是感人。
Cc = bwconncomp(bw, 4)
cc =带字段的结构:连接性:4 ImageSize: [256 256] NumObjects: 95 PixelIdxList: {1x95 cell}
步骤7:检查一个物体
每个不同的对象都被标记为相同的整数值。显示第50个连接组件的颗粒。
Grain = false(size(bw));grain(cc.PixelIdxList{50}) = true;imshow(粮食);
步骤8:查看所有对象
可视化连接组件的一种方法是创建一个标签矩阵,然后将其显示为伪彩色索引图像。
使用labelmatrix
的输出创建标签矩阵bwconncomp
.请注意,labelmatrix
将标签矩阵存储在对象数量所需的最小数值类中。
标签= labelmatrix(cc);谁标签
名称大小字节类属性标签256x256 65536 uint8
在伪彩色图像中,标识标签矩阵中每个对象的标签映射到相关色度矩阵中的不同颜色。使用label2rgb
选择色图、背景色,以及标签矩阵中的对象如何映射到色图中的颜色。
RGB_label = label2rgb(标签,@spring,“c”,“洗牌”);imshow (RGB_label)
步骤9:计算每个对象的面积
每一粒米粒都是一个相连的组成部分cc
结构。使用regionprops
在cc
求面积。
Graindata = regionprops(cc,“基本”)
graindata =95x1带字段的结构体数组:区域质心边界框
的第50个元素的面积,使用点表示法来访问的第50个元素中的area字段graindata
结构数组。
graindata(50)。区域
Ans = 194
步骤10:计算基于区域的统计信息
创建一个新向量grain_areas
,其中保存了每个颗粒的面积测量。
grain_areas = [graindata.Area];
找出面积最小的颗粒。
[min_area, idx] = min(grain_areas)
Min_area = 61
Idx = 16
Grain = false(size(bw));grain(cc.PixelIdxList{idx}) = true;imshow(粮食);
步骤11:创建区域的直方图
图直方图(grain_areas)“米粒面积直方图”);
这个话题有用吗?