我是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
。
对此表示感谢。
答案 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
精度的类型都是合适的。