文档

校正非均匀照明

这个例子展示了如何纠正图像中的不均匀照明,以便于识别图像中的单个米粒。然后,您可以了解颗粒的特征,并轻松计算图像中所有颗粒的统计信息。

第一步:读取图像

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结构。使用regionpropscc求面积。

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)“米粒面积直方图”);

这个话题有用吗?