Matlab直方图函数

时间:2017-09-25 18:12:38

标签: matlab histogram

我是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

对此表示感谢。

1 个答案:

答案 0 :(得分:3)

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

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

现在解决你的实际问题。根据直方图的初始化判断,有256个可能的值,因此您的输入最有可能是uint8类型,这意味着数据中的值将仅以[0-255]为单位,步长为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的值被集中到同一个bin中。因此,您必须转换为超出uint8限制的某种类型,然后再加1以避免饱和。 double通常在此处作为默认值完成,因为它的精度高于uint8,但任何高于uint8精度的类型都是合适的。