-1

2 進数を 10 進数に変換する際に問題があります (非常に長いようです)。

%% 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)

この行を変更することは可能ですか

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;

もっと短いものに?

4

3 に答える 3

2

オプション1:

実行していることを単純化する 1 つの方法は、最初にスケール ファクター (つまり 2 のべき乗) の 3 行 3 列の行列を作成し、ループの前に初期化することです。

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

次に、ループ内のすべてをこれらのベクトル化された操作に置き換えることができます。

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

オプション 2:

または、両方のループを完全に削除し、NLFILTERへのこの単一の呼び出しに置き換えて、マトリックスを取得できると思いますLBP

LBP = nlfilter(I2,[3 3],@(x) sum((x(:) > x(5)).*scale(:)));
于 2011-09-12T15:53:33.930 に答える
1

あなたがそこで何をしているのか正確にはわかりませんが、あなたが望むことをしbin2decていますか?

于 2011-09-12T15:32:26.040 に答える
0

COLFILT関数を使用して別のソリューションを追加しています。

カスタム関数を使用して処理するマトリックスの列にすべてのスライディング ウィンドウを配置し、結果を元のマトリックスに再配置します。内部的には、IM2COLおよびCOL2IM関数を使用します。

以下に例を示します。

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, [])

スクリーンショット

@gnoviceの 2 番目の回答と比較して、 NLFILTERドキュメントからこのヒントを読んでください。

nlfilter は、大きな画像を処理するのに時間がかかる場合があります。場合によっては、関数 colfilt を使用すると、同じ操作をより高速に実行できます。

于 2011-09-13T01:41:29.667 に答える