2016-10-18 8 views
0

저는 matlab에서 Zhao Koch 스테 가노 그래피 방법을 파이썬으로 다시 작성하려고합니다. 시작시 바로 붙어 있습니다.파이썬에서 2D 이산 코사인 변환을 구현 한 Issiue

처음 두 절차들은 매트랩 그대로 :

단계 1 :

A = imread(casepath); # Reading stegonography case image and aquiring it's RGB values. In my case it's a 400x400 PNG image, so it gives a 400x400x3 array. 

단계 2 :

D = dct2(A(:,:,3)); # Applying 2D DCT to blue values of the image 

파이썬 코드 유사체 :

from scipy import misc 
from numpy import empty,arange,exp,real,imag,pi 
from numpy.fft import rfft,irfft 

arr = misc.imread('casepath')# 400x480x3 array (Step 1) 
arr[20, 30, 2] # Getting blue pixel value 

def dct(y): #Basic DCT build from numpy 
    N = len(y) 
    y2 = empty(2*N,float) 
    y2[:N] = y[:] 
    y2[N:] = y[::-1] 

    c = rfft(y2) 
    phi = exp(-1j*pi*arange(N)/(2*N)) 
    return real(phi*c[:N]) 


def dct2(y): #2D DCT bulid from numpy and using prvious DCT function 
    M = y.shape[0] 
    N = y.shape[1] 
    a = empty([M,N],float) 
    b = empty([M,N],float) 

    for i in range(M): 
     a[i,:] = dct(y[i,:]) 
    for j in range(N): 
     b[:,j] = dct(a[:,j]) 

    return b 

D = dct2(arr) # step 2 anlogue 

그러나 , 내가 execu하려고 할 때 코드에 다음과 같은 오류가 나타납니다.

Traceback (most recent call last): 
File "path to .py file", line 31, in <module> 
D = dct2(arr) 
File "path to .py file", line 25, in dct2 
a[i,:] = dct(y[i,:]) 
File "path to .py file", line 10, in dct 
y2[:N] = y[:] 
ValueError: could not broadcast input array from shape (400,3) into shape (400) 

아마도 누군가 내가 잘못하고있는 것을 나에게 설명 할 수 있을까요?

추가 정보 : OS : 윈도우 10 프로 64 비트 파이썬 : 2.7.12 scipy : 0.18.1 NumPy와 : 1.11.2 베개 : 3.4.1

+1

numpy와 scipy에서 ['dct()'] (http://stackoverflow.com/questions/34890585/in-scipy-why-doesnt-idctdcta-equal-to-a)에 직접 액세스 할 수 있습니다. 너 자신을 굴리는 대신에 흥미가 있니? – Reti43

+0

감사합니다. 단지 그것에 대해 알지 못했습니다. 그것이 잘 작동하는 것 같습니다. –

답변

1

코드는 잘 작동하지만, Matlab에서 dct2()처럼 2D 배열 만 허용하도록 설계되었습니다. 당신의 arr이 3D 배열이기 때문에 대신 또는 바퀴를 개혁하고, 내 댓글에서 언급 한 바와 같이, 당신은

D = dct2(arr[...,2]) 

을하고 싶은, 사용 (빠른) 내장 dct() scipy 패키지.

내 댓글에있는 링크에서 코드를 효과적으로 당신에게 제공이 :

import numpy as np 
from scipy.fftpack import dct, idct 

def dct2(block): 
    return dct(dct(block.T, norm='ortho').T, norm='ortho') 

def idct2(block): 
    return idct(idct(block.T, norm='ortho').T, norm='ortho') 

그러나 다시, 당신이 개별적으로 각 색상 평면이 함수를 호출해야 것을 강조해야합니다. Scipy의 dct()은 행복하게 모든 N 차원 배열을 허용하고 마지막 축에서 변형을 적용합니다. 이것이 픽셀의 행과 열이 아닌 색상 평면이기 때문에 잘못된 결과를 얻게됩니다. 예, axis 입력 매개 변수를 사용하여 문제를 해결할 수있는 방법이 있지만이 대답을 불필요하게 지나치게 복잡하게 만들지는 않겠습니다. 위의 코드 조각에서 norm='ortho' 매개 변수를 생략하면 여기에 포함 된 다양한 DCT 구현에 관한


, 버전 및 scipy의 구현은 동일한 결과를 제공합니다. 그러나 그 매개 변수가 포함되면, scipy의 변환은 Matlab의 변환에 동의합니다.