본문 바로가기

Graphics Note

asymptotic discrete spot noise (ADSN)

discrete spot noise는, 굉-장히 쉽게 말해서 n개의 점(혹은 바이너리이미지)을 찍어 새로운 텍스쳐를 합성하는것이다.

참조한 논문[1]의 설명을 빌려오자면...

[math]h[/math]가 주기성을 가진 이미지이고 [math]X_p, p=1,2,...[/math]는 독립 동일 분포 (independent identically distributed: i.i.d.) 확률 변수 (random variable), 그리고 [math]\Omega[/math]는 균일 분포 이미지 도메인이라 할 때, [math]h[/math]에 연관된 order n의 DSN은 아래와 같이 정의된다.

[math!]f_n (x) = \sum_{p=1}^{n}{h (x- X_p )}, ~~x \in \Omega[/math!]

당연한 소리지만 n이 커질수록 텍스쳐같은 느낌이 짙어진다.


asymptotic discrete spot noise (ADSN)는 DSN의 확장된 형태인데, 중심 극한 정리에 기반하여 DSN을 정규화할 수 있고, 이를 ADSN이라 부른다.

다시 한번 논문의 설명을 빌리자면...

[math]X[/math]를 [math]\Omega[/math]의 균일 확률 변수라 하고 [math]H(x) = h(x - X)[/math]라 하자. [math]H[/math]의 기댓값은, [math]m[/math]이 [math]h[/math]의 평균이고, [math]\mathbf{1}[/math]이 모든 요소가 1인 행렬일 때, [math]\mathbb{E}(H) = m\mathbf{1}[/math]와 같이 표현된다. 비슷하게 [math]H[/math]의 분산은 [math]h[/math]의 자기 상관 계수 (autocorrelation)과 같은데, 즉, 모든 [math](x,y) \in \Omega^2[/math]에 대하여 아래와 같이 표현된다.

[math!]\begin{equation} Cov(H(x), H(y)) = C_h (x,y), \\ C_h (x,y) = \frac{1}{MN} \sum_{u \in \Omega} (h(x-u)-m)(h(y-u)-m) \end{equation}[/math!]

중심극한정리는 임의의 순열 [math]n^{-1/2}(f_n - nm \mathbf{1})[/math]를 [math]NM[/math]차원의 정규 분포 [math]\mathcal{N}(0, C_h )[/math]로 수렴하게 만든다. 이 정의로부터 [math]h[/math]에 연관된 ADSN은 정규분포 [math]\mathcal{N}(0, C_h )[/math]를 따른다고 말할 수 있다.


음.. 아래는 위 정의로부터 ADSN을 구현한 코드이다.

주기요소의 분리는 [3]의 논문을 참조하여.. 구현한 [4]의 코드를 참고하였고, ADSN의 생성은 [4]와 달리 논문[1]의 Ⅱ.ADSN 섹션의 C.Simulation of the ADSN 파트를 따랐다.


function adsn = genADSN( img )

    % 주기요소 분리

    img = double(img);

    [sz,sz, chsz] = size(img);

    

    z = zeros(1,1,chsz); %패딩

    fe = [   z,        img(1,:,:),         z      ; ...

         img(:,1,:),       img,       img(:,end,:); ...

             z,        img(end,:,:),       z      ];


    laplacian = @(x)4*x - ( circshift(x,[0 1]) + circshift(x,[1 0]) + ...

        circshift(x,[-1 0]) + circshift(x,[0 -1]) );

    d = laplacian(fe);

    d = d(2:end-1, 2:end-1,:);


    [X, Y] = meshgrid(0:sz-1, 0:sz-1);

    U = 4 - 2*cos(2*X*pi/sz) - 2*cos(2*Y*pi/sz);

    P = fft2(d)./repmat(U, [1,1,chsz]);

    P(1,1,:) = sum(sum(img,1),2);

    p = real(ifft2(P));


    % ADSN 합성

    Y = randn(sz);

    adsn = zeros(sz,sz,chsz);

    for ch=1:chsz 

        m = mean2(p(:,:,ch));

        h_ = (p(:,:,ch) - m);

        adsn(:,:,ch) = real(  ifft2(fft2(h_).*fft2(Y))  ) / sz + m;

    end

    

    % [4]의 코드

    %{

    w = randn(sz)/sz;

    w = w - mean(w(:)) + 1/sz^2;

    adsn = zeros(sz,sz,chsz);

    for ch=1:chsz

        adsn(:,:,ch) = real(ifft2(fft2(p(:,:,ch)).*fft2(w)));

    end 

    %}

end


좌상단 이미지는 원본 텍스쳐이고, 나머지는 위 코드로 생성한 ADSN이다.


 

 



참조한 논문 및 사이트


[1] Bruno Galerne, Yann Gousseau, and Jean-Michel Morel, "Random Phase Textures: Theory and Synthesis, IEEE Transactions on Image Processing, voㅣ. 20, no. 1, pp. 257-267 2011


[2] J. J. van Wijk, “Spot noise texture synthesis for data visualization,” in

Proc. SIGGRAPH, New York, 1991, pp. 309–318.


[3] L. Moisan, Periodic plus Smooth Image Decomposition,Journal of Mathematical Imaging and Vision, vol 39:2, pp. 161-179, 2011.


[4] http://nbviewer.ipython.org/github/gpeyre/numerical-tours/blob/master/matlab/graphics_1_synthesis_gaussian.ipynb

'Graphics Note' 카테고리의 다른 글

OpenGL 강좌 - 2. 삼각형 그리기(설정)  (0) 2015.05.25
OpenGL 강좌 - 1. 소개와 준비  (24) 2015.05.23
random phase noise  (0) 2014.12.10
implementing EPA in 3D  (0) 2014.05.29
implementing GJK in 3D  (0) 2014.05.24