2017-04-09 12 views
0

私は現在、2つの画像を比較して、それらがどれほど似ているかを確認する必要のあるアプリケーションの一部に取り組んでいます。これは、2つの画像を白黒ピクセル数を数えて2進数に変換し、最終的に白ピクセルの数を画像内に存在するピクセルの総数で除算することによって行われます。Matlab - 画像の背景を無視する

私が今直面している問題は、私が使用している画像の背景が「類似性スコア」に向かっており、不正確な結果になっているためです。私はこの問題をどのように解決するかについてのアイデアを持っていますが、私は実際にどのように実践するか分かりません。

たとえば、これがイメージファイルであり、ピクセル値であるとします。

0000000000 
0000110000 
0001001000 
0011001100 
0001001000 
0000110000 
0000000000 

私の考えは、画像の背景に含まれる黒画素の数を検出するために、ダウンまで、最大下、右から左へ、左から右へそれぞれ行と列を検索することです。そして、うまくいったん白いピクセルを検出すると、その行/列の検索を停止し、次の行へ移動します。最後に、検索が完了すると、バックグラウンドがどれくらいの黒ピクセルを占めているかを知ることができます。その結果、私の総計からその価値を引き離すことができます。これにより、より正確な読みが可能になります。

このように検索する方法はわかりませんし、これらのオブジェクト(以下の例)にも含まれているため、画面上のすべての黒いピクセルを重要なので取り除きたくありません。誰かがこのようにする方法を知っているのですか、さらに簡単な方法を知っていますか?

現在のコード:

for i = 1:length(jpgFiles) 
    baseFileName = jpgFiles(i).name; 
    fullFileName = fullfile(referenceFolder, baseFileName); 

    %Reading in the images & converting the images to Black & White 
    a = im2bw(imread(firstImage)); 
    b = im2bw(imread(fullFileName)); 
    compiledImage = a==b; 
    fprintf(1, 'Reading %s\n', fullFileName); 

    axes(handles.axes4); 
    disp(compiledImage); %Displays the values if the pixels match 

    [X, Y] = find(a ~= b); %Find coordinates for which the two images are equal 
    imshow(a); %Show first image 
    hold on %Retains the current plot and certain axes properties 
    plot(Y, X, 'y.'); %Overlay those coordinates 
    hold off %Resets axes properties to their default before drawing new plots 

    %Getting the values of white and black pixels 
    blackCount = sum(sum(a==b ==0)); 
    whiteCount = sum(sum(a==b)); 
    disp('Black Count:'); 
    disp(blackCount); 
    disp('White Count:'); 
    disp(whiteCount); 

    %Calculating the percentage 
    maxTotal = blackCount + whiteCount; 
    decimalValue = whiteCount/maxTotal; 
    percentageValue = sprintf('%.0f%%',100*decimalValue); 
    disp(decimalValue); 
    disp(percentageValue); 

    %Title settings and delay, if needed 
    title('Strongest Features (Yellow Hides Any Discrepancies)', 'fontweight', 'bold'); %Sets the title 
    drawnow; 
    %pause(5); 

    %Adding into the image array 
    imageArray{j} = baseFileName; 
    j = j + 1; 

    %Adding into the popular features array 
    popFeaturesArray{i} = 100*decimalValue; 
    i = i + 1; 
end 

画像例:

enter image description here enter image description here

答えて

0

あなたには、いくつかの形態学的操作でそれを行うことができます。

c1 = rgb2gray(imread('c1.png')); 
bw = imfill(imclose(c1 ~= 0,ones(3)),'holes'); 
bw = bwareafilt(bw,2); 
% plotting 
A = imoverlay(bw,(c1 > 0).*bw,'b'); 
imshow(A) 

bwが前景です。

編集 - あなたはあなたの代わりに行うことができますbwareafilt持っていない場合:

n = 2; % keep the two largest areas 
cc = bwconncomp(bw); 
pixels = cc.PixelIdxList; 
sizes = cellfun(@numel,pixels); 
[~,idxs] = sort(sizes,'descend'); 
pixels = cell2mat(pixels(idxs(1:min(n,end)))'); 
bw(:) = false; 
bw(pixels) = true; 

enter image description here

+0

は(問題ランニングbwareafiltを手に入れた)、私は私の大学は、Matlabのバージョンを持っているとは思いませんこのコマンドが含まれている私は恐れている – iBenParry

+0

私は私の答えで 'bwareafilt'の代替を追加 – user2999345