Один из способов добиться этого - взять небольшой псевдослучайный 2D-шаблон (последовательность) и периодически повторять его, чтобы соседние фрагменты всегда зеркально отображались, создавая ощущение плавной непрерывности.
После того, как вы указаливаши требования с W(x + q0N0, y) = W(x, y)
и W(x, y + q1N1) = W(x, y);
становится ясно, что это именно то (без зеркальной части), что вы хотите.
Вы просто должны повторить случайный образец определенное количество раз в обоих направлениях.
Пример (аналогично вашему изображению, где длина периода в вертикальном направлении длиннее, чем в горизонтальном)
Код (в 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
Старый пример (с зеркалированием)
Код (в 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);
Шаблоны переворачиваются (зеркально отражаются) в одном или двух направлениях, иногда имитируя некоторую гладкость (симметрию) шаблона.