如何从伪随机二进制序列生成如下图所示的2D周期性模式?

时间:2019-06-05 05:40:46

标签: image-processing random

我想从具有以下上下文的伪随机二进制序列中生成二维周期模式:

周期模式满足方程式(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 :(得分:0)

一种实现该目标的方法是采用一个小的伪随机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;

最后,在两个嵌套但非常简单的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

旧示例(带有镜像)

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

有时会在一个或两个方向上翻转(镜像)图案,以模拟图案的某种平滑度(对称性)。