MATLAB直方图功能



我是MATLAB的新手,对于我的教授,我的课程写(实际上是完成)一个自定义MATLAB功能,用于从一组数据中生成直方图。本质上,正在创建一个新的向量,即L正在使用2D矩阵M的信息进行更新。L的第一列包含来自M(i,j)的信息,在第二列中包含数据集中的M(i,j)的计数(总数)。我需要一些方向,即接下来继续进行。

下面是我到目前为止的地方:

function L = hist_count(M)
L = [ [0:255' zeros(256,1) ];
for i = 1:size(M,1)
    for j = 1:size(M,2)
        L(double(M(i,j))+1,2) = <<finish code here>>;
    end
end
figure;
plot(L(:1),L(:2));

<<finish code here>>部分是我卡住的地方。我了解所有内容,直到我需要使用信息来更新L的地步。

表示感谢。

注意:您对直方图L的初始化的括号不匹配。 删除代码中的第二个[括号。另外,0:255向量的创建不正确。执行0:255'的单个常数为255,这意味着它仍将创建0:255的水平向量,这将使代码失败。您应该用paranthess围绕该矢量的创建,然后转置该结果。因此:

L = [ (0:255)' zeros(256,1) ];

现在进入您的实际问题。从直方图的初始化来看,有256个可能的值,因此您的输入很可能是uint8类型,这意味着您的数据中的值仅在[0-255]中以1个步骤为1。请回想一下直方图记录了总数时间您会看到一个值。在这种情况下,您有一个两列矩阵,第一列告诉您要检查的值,第二列告诉您您在数据中看到了多少次。因此,每一行都告诉您您在数据中检查了哪些值以及您在数据中看到该值的次数。请注意,计数全部初始化为零,因此逻辑是,每次您看到一个值时,都需要访问与数据点相对应的正确行,然后将该值增加1。

因此,该行只是仅访问当前计数并在其中添加1 ...然后将其存储回:

L(double(M(i,j))+1,2) = L(double(M(i,j))+1,2) + 1;

M(i,j)是您2D数据中位置(i,j)的值。您最后一个问题是为什么将强度施加到double并添加1?您将其投放到double,因为输入可能是整数类型。这意味着超出类型动态范围的任何值都会饱和。因为您的输入是类型uint8,所以任何255以上的值都将饱和至255。在MATLAB中,我们将矩阵的行和列索引为1的行和列,并且由于值可能在值0处启动,这对应于您的直方图第1行。因此,您必须被1。例如,当我们达到uint8类型255的最极端情况时,使用本机uint8向此添加1时,将饱和到255,这意味着254和255的值被插入相同的垃圾箱。因此,您必须转换为延伸超出uint8限制的某种类型,然后添加1个以避免饱和。double通常在这里作为默认值进行,因为它的精度高于uint8,但是任何高于uint8的类型都是合适的。

最新更新