블로그 이미지
앨리삵

앨리삵입니다.

Rss feed Tistory
Graphics Note 2014.12.11 17:54

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. 소개와 준비  (23) 2015.05.23
asymptotic discrete spot noise (ADSN)  (0) 2014.12.11
random phase noise  (0) 2014.12.10
implementing EPA in 3D  (0) 2014.05.29
implementing GJK in 3D  (0) 2014.05.24
TOTAL 279,217 TODAY 183

티스토리 툴바