1

私は白黒の画像I0(512 x 512)を持っています。最初のkピクセルを取り除き、結果の画像のヒストグラムを計算する必要があります。ヒストグラムがあまりにも異なっている

私に説明してください:最初のkピクセルを考慮せずに画像I0のヒストグラムを構築する必要があります。

これは私のコードです:

k = 8; 

% compute the histogram of the entire image I0 
[vecComp, histComp] = histKtoEnd(I0, 0, k); 

% compute the histogram of the image I0 without the first k pixel  
[vecWithoutKPixel, histWithoutKPixel] = histKtoEnd(I0, k, k); 

:二つのヒストグラムを表示するには

function [vecWithoutKPixel, hist] = histKtoEnd(image, k, colorDepth) 
    % image to row vector 
    imageVec = reshape(image.', [], 1); 
    l = length(imageVec); 

    % I "delete" the first k pixel 
    vecWithoutKPixel = imageVec((k+1) : l-1); 
    vecWithoutKPixel(end+1) = imageVec(l); 

    % inizialization 
    hist = zeros(1, 2^colorDepth); 

    % create the vector of occurrences 
    for i = 0 : (2^colorDepth - 1) 
     grayI = (vecWithoutKPixel == i); 
     hist(1, i+1) = sum(grayI(:)); 
    end 
end 

を行います

subplot(1, 2, 1); 
bar(0:2^k-1, histComp, 'r'); 
title('Histogram of the entire image'); 
axis([minColor, maxColor, 0, numberOfPixels]); 
subplot(1, 2, 2); 
bar(0:2^k-1, histWithoutKPixel, 'r'); 
title('Histogram of the image without the first k pixels'); 
axis([minColor, maxColor, 0, numberOfPixels]); 

と私が手: enter image description here

ご覧のとおり、ヒストグラムは非常に異なりますが、違いはわずか8ピクセルであるため、少ししか違いがありません。

どこが間違っていますか?

もwarkspaceに新しく作成された変数は、これらの寸法を有する:

vecComp -> 262144 x 1 uint8 
histComp -> 1 x 256 double 
vecWithoutKPixel -> 65528 x 1 uint8 
histWithoutKPixel -> 1 x 256 double 

これは非常に奇妙です。私は持っている必要があります:

vecComp -> 262144 x 1 
vecWithoutKPixel -> 262136 x 1 

誰かが私を助けることができますか? は、私はDICOM画像およびコマンドinfo = dicominfo(filename)で働いている


は、だから私は問題が画像であるとは思わない

size = info.FileSize; % 262582; 
colorType = info.ColorType; % grayscale 

を取得していただきありがとうございます。

私はラインvecWithoutKPixel(end+1) = imageVec(l);にbrakpointを置けば、私はimageVecは262144×1 UINT8され、その取得:

function [vecWithoutKPixel, hist] = histKtoEnd(image, k, colorDepth) 
    % image to row vector 
    imageVec = reshape(image.', [], 1); 
    l = length(imageVec); 

    size(imageVec) % 262144 x 1 

    % I "delete" the first k pixel 
    vecWithoutKPixel = imageVec((k+1) : l-1); 
    vecWithoutKPixel(end+1) = imageVec(l); 

    % inizialization 
    hist = zeros(1, 2^colorDepth); 

    % create the vector of occurrences 
    for i = 0 : (2^colorDepth - 1) 
     grayI = (vecWithoutKPixel == i); 
     hist(1, i+1) = sum(grayI(:)); 
    end 
end 

私はvecWithoutKPixel = imageVec((k+1) : l);でコマンドvecWithoutKPixel = imageVec((k+1) : l-1); vecWithoutKPixel(end+1) = imageVec(l);を変更した場合、私はvecWithoutKPixel = []ことを取得します。

+0

'vecWithoutKPixel = imageVec((k + 1):l-1);'行にブレークポイントを設定し、 'size(imageVec)'を使って 'imageVec'の寸法を確認できますか?また、1) '(k + 1):(l-1)'が違うかもしれませんし、2)なぜ最後の要素を "削除"して戻したのですか? – Yvon

+0

そして、 'imageVec = image(:);'を試してください – Yvon

+0

実際の問題は画像データにあります。私はあなたがB/W画像を扱っていると信じていますが、MatlabではRGBA画像として保存されています。これは元の画像のサイズで見ることができます。あなたはまずそれを真のB/Wに変換しなければなりません。 – Yvon

答えて

1

は「ランダム画像」を作成I0=randi(255,100,100)を使用して、あなたのコードを実行すると、このようなプロットを生成します: Histogram of randomly created imagehistKtoEnd機能にライン

vecWithoutKPixel = uint8(vecWithoutKPixel); 

を追加

てみてください 私はこのプロットを正しく表示するように見え、変数のディメンションも正確です:

vecComp 10000x1 double 
vecWithoutKPixel 9992x1 double 

したがって、私たちの問題はあなたのコードではなく、あなたのイメージです。あなたのイメージは他の人によって以前に言及されたグレーレベルではありません。しかし、@ Reachardのようにいくつかの変数をuint8にキャストするのではなく、画像をdoubleにキャストする必要があります。あなたの画像がrgb値の場合はI0=double(rgb2gray(I0));、それ以外の理由でちょうどuint8の場合はI0=double(I0)を使用し、それを関数に渡します。お役に立てれば。

0

イメージデータは元々uint8フォーマットであり、ある時点でdoubleに変換されるというのが問題だと思います。 (あなたが整数でデータを比較するため)そのため、histKtoEnd

grayI = (vecWithoutKPixel == i); 

ラインは、おそらく唯一のuint8データで動作します。

function [vecWithoutKPixel, hist] = histKtoEnd(image, k, colorDepth) 
    % image to row vector 
    imageVec = reshape(image.', [], 1); 
    l = length(imageVec); 

    % I "delete" the first k pixel 
    vecWithoutKPixel = imageVec((k+1) : l-1); 
    vecWithoutKPixel(end+1) = imageVec(l); 

    % inizialization 
    hist = zeros(1, 2^colorDepth); 

    % create the vector of occurrences 
    for i = 0 : (2^colorDepth - 1) 
     vecWithoutKPixel = uint8(vecWithoutKPixel); % Cast to integer 
     grayI = (vecWithoutKPixel == i); 
     hist(1, i+1) = sum(grayI(:)); 
    end 
end 
+0

お返事ありがとうございます。あなたが提案した変更を適用しようとしましたが、私はいつも同じ問題があります... – beth

関連する問題