如果你只是想返回從0到255之間的256個元素的矢量,這樣做:
c = 0 : 255;
但是,如果你想c
僅僅是遏制那些存在圖像中的強度,嘗試做如下:
c = 0 : 255;
c(histogram == 0) = [];
這消除了強度在c
那裏有沒有直方圖計數。
如果我能挑剔你的代碼,計算直方圖會遍歷每個可能的強度更有效的方式,使用邏輯索引和計算sum
。另外,我認爲你的意思是返回直方圖,而不是圖像。您的圖像存儲在h
中,但您的直方圖存儲在histogram
中。因此,您的函數聲明應該返回histogram
而不是h
。
因此,嘗試這樣的事情:
function [histogram,c] = myimhist(im)
h = imread(im);
%// Change
histogram = zeros(1, 256);
for idx = 0 : 255
histogram(idx) = sum(sum(h == idx));
end
c = 0 : 255;
% c(histogram == 0) = []; %// Depending on what you want
subplot(1,2,1);
imshow(h);
title('Original Image');
subplot(1,2,2);
bar(histogram);
title('Histogram of image');
end
你有一個不必要的鑄造uint8
當你顯示圖像。您的圖片將會是uint8
。這當然假設您的直方圖計算僅限於[0-255]
,應該是這種情況,因爲這是您的代碼假定的情況。
上面的代碼將遍歷所有可能的亮度,找到圖像中與亮度相等的位置並總結所有出現的位置。我們需要使用兩個sum
調用,因爲在矩陣上調用sum
會發現每列的總和。要找到矩陣的總和,我們將在此結果上調用sum
。
如果你想使用循環逃跑都在一起,可以考慮使用bsxfun
有兩個sum
電話:
function [histogram,c] = myimhist(im)
h = imread(im);
pix_counts = bsxfun(@eq, h, permute(c, [3 1 2]));
histogram = squeeze(sum(sum(pix_counts, 1), 2));
c = 0 : 255;
% c(histogram == 0) = []; %// Depending on what you want
subplot(1,2,1);
imshow(h);
title('Original Image');
subplot(1,2,2);
bar(histogram);
title('Histogram of image');
end
bsxfun
與eq
功能被使用,使得我們創建計數的3D矩陣其中每個切片都會告訴您圖像中與特定強度匹配的那些像素的位置。因此,第一個切片會告訴您與強度0匹配的位置,第二個切片會告訴您與強度1匹配的位置等等。完成後,我們需要做的就是逐個添加每個切片中的元素。這可以通過首先對每個片的行進行求和,然後對最後一列求和。不管你先做什麼操作都沒關係。你甚至可以首先對列進行總結,然後是最後一行。結果是一個3D矢量,我們希望這是一個一維矢量,這就是爲什麼使用squeeze
。
好的,但我怎樣才能在命令行上顯示變量C?我有很多其他矩陣信息 – Cieja
顯示它? 'DISP(C);'?只需在MATLAB中調用函數:'[h,c] = myimhist(im)'。 'c'會存儲你的矢量。 – rayryeng
@Cieja - 你是否想要返回一個向量,使它只告訴你圖像中存在的強度,還是隻想返回範圍從[0-255]的向量而不管圖像如何? – rayryeng