Преобразование из двоичного в десятичное число в MATLAB - PullRequest
0 голосов
/ 12 сентября 2011

У меня проблема с преобразованием двоичного числа в десятичное (оно кажется очень длинным).

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

на что-то короче?

Ответы [ 3 ]

2 голосов
/ 12 сентября 2011

Вариант 1:

Один из способов упростить то, что вы делаете, - это сначала создать матрицу масштабных коэффициентов 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(:)));
1 голос
/ 12 сентября 2011

Я не совсем уверен, что ты там делаешь, но bin2dec делает то, что ты хочешь?

0 голосов
/ 13 сентября 2011

Я добавляю другое решение с помощью функции 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, [])

screenshot

По сравнению со вторым ответом @ gnovice , прочитайте этот совет из документации NLFILTER :

nlfilter может занять много времени для обработки больших изображений.В некоторых случаях функция colfilt может выполнять ту же самую операцию намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...