2011-10-28 8 views
2

OpenCV 2.3 Python 래퍼를 사용하여 이미지의 DCT를 계산하려고합니다.OpenCV를 사용하여 이미지의 이산 코사인 변환

그러나
import cv2 
img1 = cv2.imread('myimage.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE) 
img2 = cv2.dct(img1) 

,이 오류가 발생합니다 : 기발한 이미지가 == CV 행렬, 그래서 내가 생각 == NumPy와 배열이 작동합니다 내가 오류를 실현

cv2.error: /usr/local/lib/OpenCV-2.3.1/modules/core/src/dxt.cpp:2247: error: (-215) type == CV_32FC1 || type == CV_64FC1 in function dct 

를 입력 중 하나를해야 의미 32 비트 또는 64 비트 단일 채널 부동 소수점 매트릭스 그러나 그 방법은 그레이 스케일을 지정할 때 내 이미지가로드되어야하는 방법이거나 적어도 CV2가 변환을 알아낼 수 있도록 충분히 가까이 있어야한다고 생각했습니다.

cv2를 사용하여 DCT 용 이미지를 변환하는 적절한 방법은 무엇입니까?

답변

0

cv2에서이 작업을 수행하는 쉬운 방법이없는 것 같습니다. 내가 찾을 수있는 가장 가까운 솔루션입니다 :

import cv, cv2 
import numpy as np 

img1 = cv2.imread('myimage.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE) 
h, w = img1.shape[:2] 
vis0 = np.zeros((h,w), np.float32) 
vis0[:h, :w] = img1 
vis1 = cv2.dct(vis0) 
img2 = cv.CreateMat(vis1.shape[0], vis1.shape[1], cv.CV_32FC3) 
cv.CvtColor(cv.fromarray(vis1), img2, cv.CV_GRAY2BGR) 

cv.SaveImage('output.jpg', img2) 
1

이미지를 회색조로로드하면 사실 32 비트 부동 소수점 값이 아니라 픽셀 당 8 비트로 읽습니다. 여기

당신은 어떻게 할 것입니다 :

또한
img1_32f = cv.CreateImage(cv.GetSize(img1), cv.IPL_DEPTH_64F, 1) 
cv.Scale(img1, img1_32f, 1.0, 0.0) 

에서, dft.py 예를 보라. 이렇게하면 dft도 사용하는 방법에 대한 느낌을 줄 것입니다.

+0

감사합니다. 그러나, 나는 cv를 사용하여이를 수행하는 방법을 안다. 내 질문은 cv2를 사용하여이를 수행하는 방법이었다. 아니면 OpenCV 팀이 cv 모듈과 cv2 모듈을 무기한 유지 관리 할 계획입니까? – Cerin

+0

또한, 예제는 cv2.imread()의 출력과 작동하지 않습니다. – Cerin

0

NumPy와는 다른 순서의 배열 사이에 작업을위한 슬라이스 연산자를 가지고있다.

import cv2 
import cv2.cv as cv 
import numpy as np 

img1 = cv2.imread('myimage.jpg') 
# or use cv2.CV_LOAD_IMAGE_GRAYSCALE 
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 
cv2.imshow('input', img1) 
w,h = img1.shape 
# make a 32bit float for doing the dct within 
img2 = np.zeros((w,h), dtype=np.float32) 
print img1.shape, img2.shape 
img2 = img2+img1[:w, :h] 
dct1 = cv2.dct(img2) 
key = -1 
while(key < 0): 
    cv2.imshow("DCT", dct1) 
    key = cv2.waitKey(1) 
cv2.destroyAllWindows() 
1

여기는 openCV 포럼에서 얻은 해결책이며 효과가있었습니다.

img = cv2.imread(fn, 0)  # 1 chan, grayscale! 
imf = np.float32(img)/255.0 # float conversion/scale 
dst = cv2.dct(imf)   # the dct 
img = np.uint8(dst)*255.0 # convert back 
관련 문제