Расчет DCT с OpenCV - PullRequest
       35

Расчет DCT с OpenCV

3 голосов
/ 09 ноября 2011

Я пытаюсь использовать функцию dct () в OpenCV для вычисления дискретного косинусного преобразования, но получаю странные результаты.

Мой скрипт:

import os, sys
import cv, cv2
import numpy as np

fn1 = 'original.jpg'
img1 = cv2.imread(fn1, 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.ShowImage('',img2)
cv2.waitKey()
cv.SaveImage('saved.jpg', img2)

Кажется, что это работает без ошибок, но изображение, показанное ShowImage (), и изображение, сохраненное SaveImage (), выглядят очень разными К сожалению, я не могу найти какие-либо примеры изображений с обработкой DCT, поэтому я не уверен, что, если либо, является правильным.

Исходное изображение: original

Показанное изображение DCT: shown

Сохраненное изображение DCT: saved

Почему такая разница между отображаемым и сохраненным изображениями DCT? Что правильно?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Похоже, вы отобразили сложный вывод DCT.И поскольку вы пытались сохранить 2-канальное изображение (DCT выводит 2 канала - один для реального, другой для мнимой части), он сохранил только реальную часть (которая как-то близка к величине).

Итак, из вашего вывода DCT используйте функции magnitude () и phase () для извлечения полезной информации.Отобразите их отдельно,

И, самое главное, внимательно прочитайте о DCT (http://en.wikipedia.org/wiki/Discrete_cosine_transform), чтобы вы знали, что делаете.

1 голос
/ 06 апреля 2012

сохраненное изображение на самом деле такое же, но значения фиксируются на [0..255] и преобразуются в байт (numpy.uint8) перед его сохранением в формате JPEG.отрицательные значения равны нулю, а значения выше 255 равны 255.

cv2.imshow("before_save", vis1)
vis1[vis1>255] = 255
vis1[vis1<0] = 0
cv2.imshow("saved", vis1.astype(np.uint8))
...