2017-02-25 58 views
0

我想創建一個圖像的直方圖,但不考慮第一個k像素。直方圖的圖像,但不考慮前k個像素

例如:50x70圖像和k = 40,直方圖是在最後的3460像素上計算的。圖像的第一個40像素被忽略。 掃描k像素的順序是光柵掃描順序(從左上角開始,按行逐行)。

另一個例子是這樣,在那裏k=3enter image description here

顯然我不能分配一個值,以那些k像素否則直方圖將是不正確。老實說,我不知道如何開始。

我該怎麼做? 感謝這麼多的方式

回答

2

矢量化解決方案,您的問題將是

function [trimmedHist]=histKtoEnd(image,k) 
imageVec=reshape(image.',[],1);   % Transform the image into a vector. Note that the image has to be transposed in order to achieve the correct order for your counting 
imageWithoutKPixels=imageVec(k+1:end); % Create vector without first k pixels 
trimmedHist=accumarray(imageWithoutKPixels,1); % Create the histogram using accumarray 

如果你有你的workingdirectory該功能你可以使用

image=randi(4,4,4) 
k=6; 
trimmedHistogram=histKtoEnd(image,k) 

嘗試。

編輯:如果你只需要劇情,你也可以將功能的第4行中使用histogram(imageWithoutKPixels)我寫

+0

我真的沒想過把圖像轉換成矢量。 因爲我想在屏幕上看到生成的圖像,我想把結果向量轉換成數組'vec2mat(vecWithoutKPixel,width)',其中'width'是原始圖像的寬度。 有更好的方法來做到這一點?有可能做到這一點? – beth

+1

@valerie你想看到什麼結果圖像?沒有產生的圖像,圖像將是相同的。您只是創建了圖像的直方圖,然後您可以使用「直方圖」函數查看該圖像。但是你不會改變原始圖像上的任何東西。當然,您可以將生成的矢量(直方圖)轉換爲圖像寬度的數組,但它不會與圖像具有相同的長度,因爲直方圖具有與圖像中顏色一樣多的單元格,並且圖像數組具有與圖像具有像素一樣多的單元格。 – Max

+1

或者你想看到沒有前k個像素的圖像?如果是這樣,'k'必須始終是圖像所具有的列的倍數。然後,您可以使用'imshow(image((1 + k/size(image,2)):end,:))繪製沒有前k個像素的圖像' – Max

1

一個可以這樣:

histogram = zeros(1,256); 
skipcount = 0; 
for i = 1:size(image,1) 
    for j = 1:size(image,2) 
     skipcount = skipcount + 1; 
     if (skipcount > 40) 
      histogram(1,image(i,j)+1) = histogram(1,image(i,j)+1) + 1; 
     end 
    end 
end 

如果您需要跳過的頂部線條一些確切的數字,那麼你可以跳過昂貴條件檢查和剛剛開始從外環適當的指數。

+0

不使用循環就可以實現。循環很慢。 –

+0

迭代所有像素是緩慢的。您只能迭代灰度值的數量。 –

+0

@TonyTannous你不需要任何循環。看到我的回答 – Max

1
Vec = image(:).'; 
Vec = Vec(k+1:end); 

Hist = zeros(1, 256); 

for i=0:255 
    grayI = (Vec == i); 
    Hist(1, i+1) = sum(grayI(:)); 
end 

前兩行掛斷第k個像素,使他們不會在計算中考慮。

然後你檢查你有多少個0並將它保存在數組中。對於所有灰度級都是一樣的。

在hist向量中,在第i個單元格中,將出現灰度級(i-1)的發生次數。

+0

你應該解釋你的代碼或告訴它如何解決這個問題。可能這就是爲什麼這被標記爲低質量。 –