Frage

Ich habe ein Problem beim Konvertieren der Binärdatei in eine Dezimalzahl (sie scheint sehr lang zu sein).

%% Read

clear all;
close all;
clc;
I=imread('test.png');
imshow(I);

%% Crop
I2 = imcrop(I);
figure, imshow(I2)
w=size(I2,1);
h=size(I2,2);
%% LBP
for i=2:w-1
    for j=2:h-1
        J0=I2(i,j);
        I3(i-1,j-1)=I2(i-1,j-1)>J0;
        I3(i-1,j)=I2(i-1,j)>J0;
        I3(i-1,j+1)=I2(i-1,j+1)>J0; 
        I3(i,j+1)=I2(i,j+1)>J0;
        I3(i+1,j+1)=I2(i+1,j+1)>J0; 
        I3(i+1,j)=I2(i+1,j)>J0; 
        I3(i+1,j-1)=I2(i+1,j-1)>J0; 
        I3(i,j-1)=I2(i,j-1)>J0;
        LBP(i,j)=I3(i-1,j-1)*2^8+I3(i-1,j)*2^7+I3(i-1,j+1)*2^6+I3(i,j+1)*2^5+I3(i+1,j+1)*2^4+I3(i+1,j)*2^3+I3(i+1,j-1)*2^2+I3(i,j-1)*2^1;
    end
end
figure,imshow(I3)
figure,imhist(LBP)

Ist es möglich, diese Zeile zu ändern

LBP(i,j)=I3(i-1,j-1)*2^8+I3(i-1,j)*2^7+I3(i-1,j+1)*2^6+I3(i,j+1)*2^5+I3(i+1,j+1)*2^4+I3(i+1,j)*2^3+I3(i+1,j-1)*2^2+I3(i,j-1)*2^1;

zu etwas kürzerem?

War es hilfreich?

Lösung

Option 1:

Eine Möglichkeit, Ihre Arbeit zu vereinfachen, besteht darin, zunächst eine 3-mal-3-Matrix von Skalierungsfaktoren (d. h. Zweierpotenzen) zu erstellen und vor Ihren Schleifen zu initialisieren:

scale = 2.^[8 7 6; 1 -inf 5; 2 3 4];

Dann können Sie alles in Ihrer Schleife durch folgende vektorisierte Operationen ersetzen:

temp = (I2(i-1:i+1,j-1:j+1) > I2(i,j)).*scale;
LBP(i,j) = sum(temp(:));

Option 2:

Alternativ können Sie meiner Meinung nach beide Schleifen vollständig entfernen und durch diesen einzelnen Aufruf von NLFILTER , um Ihren Matrix-LBP zu erhalten:

LBP = nlfilter(I2,[3 3],@(x) sum((x(:) > x(5)).*scale(:)));

Andere Tipps

Ich bin mir nicht ganz sicher, was Sie dort tun, aber bin2dec tun, was Sie wollen?

Ich füge eine weitere Lösung mit dem COLFILT hinzu Funktion.

Dabei werden alle Schiebefenster in Spalten einer Matrix platziert, die wir mit einer benutzerdefinierten Funktion verarbeiten. Anschließend wird das Ergebnis in der ursprünglichen Matrix neu angeordnet. Intern werden die IM2COL und COL2IM -Funktionen.

Hier ist ein Beispiel:

I = imread('coins.png');
fun = @(b) sum( bsxfun(@times, 2.^(8:-1:1)', ...
           bsxfun(@gt, b([1 4 7 8 9 6 3 2],:), b(5,:))) );
II = colfilt(I, [3 3], 'sliding', fun);
imshow(II, [])

Screenshot

Im Vergleich zu @gnovice Lesen Sie diesen Tipp aus der NLFILTER -Dokumentation :

nlfilter kann lange dauern, um große Bilder zu verarbeiten. In manchen Fällen, Die Colfilt-Funktion kann denselben Vorgang viel schneller ausführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top