Как сгенерировать двухмерный периодический шаблон, как показано ниже, из псевдослучайной двоичной последовательности? - PullRequest
0 голосов
/ 05 июня 2019

Я хочу сгенерировать двухмерный периодический шаблон из псевдослучайной двоичной последовательности, подобной этой, в следующем контексте:

Периодический шаблон удовлетворяет уравнениям (1) и (2)

W (x + q0N0, y) = W (x, y);q0, N0> 1 (1)

W (x, y + q1N1) = W (x, y);q1, N1> 1, (2)

, где N0 и N1 определяют периодичность повторений, а q0 и q1 - число повторений в горизонтальном и вертикальном направлениях.Генерация из псевдослучайных значений {-1, 1} создает прямоугольный двоичный шаблон.

2D periodic pattern

1 Ответ

0 голосов
/ 05 июня 2019

Один из способов добиться этого - взять небольшой псевдослучайный 2D-шаблон (последовательность) и периодически повторять его, чтобы соседние фрагменты всегда зеркально отображались, создавая ощущение плавной непрерывности.

После того, как вы указаливаши требования с W(x + q0N0, y) = W(x, y) и W(x, y + q1N1) = W(x, y); становится ясно, что это именно то (без зеркальной части), что вы хотите.

Вы просто должны повторить случайный образец определенное количество раз в обоих направлениях.

Пример (аналогично вашему изображению, где длина периода в вертикальном направлении длиннее, чем в горизонтальном)

enter image description here

Код (в Matlab)

% base pattern
N0 = 20;
N1 = 5;
base = rand([N0, N1]) > 0.5; % pseudo-random

% periodically repeating the pattern
Q0 = 5;
Q1 = 20;
pattern = zeros([N0*Q0,N1*Q1]);
for q0 = 1 : Q0
    for q1 = 1 : Q1
        pattern((q0-1)*N0+1:q0*N0, (q1-1)*N1+1:q1*N1) = base;
    end
end

% save
imwrite(pattern, 'test.jpg');

% display
imagesc(pattern);
axis image;
colormap(gray);

В первых строках просто вычисляется случайный двоичный шаблон определенного размера N0 x N1

% base pattern
N0 = 20;
N1 = 5;
base = rand([N0, N1]) > 0.5; % pseudo-random

Затем следует определение количества повторенийшаблон в каждом направлении

Q0 = 5;
Q1 = 20;

Наконец, в двух вложенных, но довольно простых для циклов базовом шаблоне повторяется

pattern = zeros([N0*Q0,N1*Q1]);
for q0 = 1 : Q0
    for q1 = 1 : Q1
        pattern((q0-1)*N0+1:q0*N0, (q1-1)*N1+1:q1*N1) = base;
    end
end

Вычислениеиз индексов (где разместить базовые шаблоны) соответствует вашим требованиям уравнения

(q0-1)*N0+1:q0*N0, (q1-1)*N1+1:q1*N1

Старый пример (с зеркалированием)

enter image description here

Код (в Matlab)

% base pattern
N = 20;
base = rand(N) > 0.5; % pseudo-random

% multiplying the pattern
M = 4;
pattern = zeros(N*M);
for i = 1 : M
    for j = 1 : M
        b = base;
        % mirroring the base
        if mod(i, 2) == 1
            flip(b, 2);
        end
        if mod(j, 2) == 1
            flip(b, 1);
        end
        pattern((i-1)*N+1:i*N, (j-1)*N+1:j*N) = b;
    end
end

% save
imwrite(pattern, 'test.jpg');

% display
imagesc(pattern);
axis image;
colormap(gray);

Шаблоны переворачиваются (зеркально отражаются) в одном или двух направлениях, иногда имитируя некоторую гладкость (симметрию) шаблона.

...