2011-10-28 119 views
2

我正在嘗試使用OpenCV 2.3 Python包裝來計算圖像的DCT。據稱,圖片== numpy的陣列== CV矩陣,所以我想這應該工作:用OpenCV計算圖像的離散餘弦變換

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

然而,這引發錯誤:

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

那麼,當您將圖像加載爲灰度圖時,實際上它是以每像素8位而不是32位浮點值讀入的。

這裏是你會怎麼做:

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