Вылічыць каэфіцыенты дыскрэтнай косінуснай пераўтварэння з малюнка з OpenCV

Я спрабую выкарыстоўваць OpenCV 2.3 Python абгортку для вылічэнні DCT для малюнка. Як мяркуецца, малюнкі == Numpy масівы == матрыцы CV, таму я думаў, што гэта павінна працаваць:

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 павінны быць у стане высветліць, пераўтварэнне.

Што адпаведны спосаб пераўтварыць малюнак для DCT з выкарыстаннем CV2?

3

4 адказы

Вось рашэнне, якое я атрымаў ад форумаў 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
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 прыклад. Гэта павінна даць вам адчуць, як выкарыстоўваць ТСП а.

Дзякуючы. Тым не менш, я ведаю, як гэта зрабіць з дапамогай рэзюмэ. Маё пытанне заключаецца ў тым, каб зрабіць гэта з дапамогай CV2. Ці гэта група планавання OpenCV захаваць як рэзюмэ і CV2 модуляў на нявызначаны тэрмін?
дададзена аўтар Cerin, крыніца
Акрамя таго, ваш прыклад не працуе з выхадам з cv2.imread ().
дададзена аўтар Cerin, крыніца

Там, здаецца, не будзе які-небудзь просты спосаб зрабіць гэта з 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)
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()
0
дададзена