2017-04-09 110 views
0

我正在研究應用程序的一部分,我現在需要將兩個圖像比較在一起,並檢查它們與另一個圖像的相似程度。目前通過將兩個圖像轉換爲二進制數來計算黑色和白色像素的數量,然後最終將白色像素的數量除以圖像內存在的像素總數。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