我想从具有以下上下文的伪随机二进制序列中生成二维周期模式:
周期模式满足方程式(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}生成将生成矩形的二进制值模式。
答案 0 :(得分:0)
一种实现该目标的方法是采用一个小的伪随机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;
最后,在两个嵌套但非常简单的for循环中,重复了基本模式
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);
有时会在一个或两个方向上翻转(镜像)图案,以模拟图案的某种平滑度(对称性)。