[英]Matlab Histogram Function
我是Matlab的新手,為了完成一項任務,我的教授正在編寫一個自定義Matlab函數,用於從一組數據生成直方圖。 基本上正在創建一個新的矢量, L
正在用來自2D矩陣M
的信息進行更新。 L
的第一列包含來自M(i,j)
的信息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
的水平向量,這將使代碼失敗。 你應該用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的值被集中到同一個垃圾箱。 因此,您必須轉換為超出uint8
限制的某種類型,然后再加1以避免飽和。 double
通常在這里作為默認值完成,因為它具有比uint8
更高的精度,但任何高於uint8
的精度類型都是合適的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.