Уменьшение размера матрицы в 2D с помощью KNN - PullRequest
0 голосов
/ 11 ноября 2018

У меня большая двоичная матрица. Я хочу уменьшить размер этой матрицы с помощью knn-аппроксимации. Моя идея состоит в том, чтобы сгруппировать матрицу в группы из 4 соседей и заменить группу на 1, если число 1 в группе больше или равно количеству нулей.

Чтобы быть конкретным, пусть матрица будет

1 0 0 1 0 
0 1 1 0 0 
1 1 0 0 0 
0 1 1 1 0
0 0 1 1 0
1 0 0 1 0

Сначала я хочу создать группу окрестностей как

1 0 |0 1| 0| 
0 1 |1 0| 0|
------------
1 1 |0 0| 0| 
0 1 |1 1| 0|
------------
0 0 |1 1| 0|
------------

и затем последняя матрица, которую я хочу сгенерировать:

1 1 0
1 1 0
0 1 0

, заменив группу баллом большинства. Как я могу эффективно сделать это MATLAB?

1 Ответ

0 голосов
/ 11 ноября 2018

Изначально я пытался заставить его работать, используя imresize, но не мог получить его без "хаков" (во всех моих "правильных" попытках он был выключен на 1).

imresize(M, ceil(size(M)/2), 'bilinear') >= 0.4 % This works but is hacky and not recommended!

Тем не менее, я могу придумать, как решить эту проблему с помощью двумерной свертки. Обратите внимание, что я дополняю массив (для которого требуется набор инструментов), чтобы упростить этап индексации в конце:

function C = q53247013(M)

if nargin < 1

  M = [
    1 0 0 1 0 
    0 1 1 0 0 
    1 1 0 0 0 
    0 1 1 1 0
    0 0 1 1 0
    1 0 0 1 0];

end

% Constants:
BLK_SZ = 2;
A = ones(BLK_SZ);

% Pad array if needed (note: this WILL require modification if BLK_SZ > 2 ):    
padBottom = rem(size(M,BLK_SZ),1);
padRight = rem(size(M,BLK_SZ),2);
M = padarray(M, [padBottom, padRight], 'replicate', 'post');

% Perform convolution:    
C = conv2(M, A, 'valid') >= ceil(BLK_SZ^2 / 2);

% Remove every other row and column:
C = C(1:2:end, 1:2:end);

Другой альтернативой является функция blockproc:

C = blockproc(M, [2 2], @(x)sum(x.data(:))) >= 2;
...