簡體   English   中英

Matlab直方圖函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM