как использовать дискретное косинусное преобразование (DCT) в opencv

dct не выполняет преобразование должным образом в opencv.

imf = np.float32 (блок)
dct = cv2.dct (imf)

           [[154,123,123,123,123,123,123,136],
           [192,180,136,154,154,154,136,110],
           [254,198,154,154,180,154,123,123],
           [239,180,136,180,180,166,123,123],
           [180,154,136,167,166,149,136,136],
           [128,136,123,136,154,180,198,154],
           [123,105,110,149,136,136,180,166],
           [110,136,123,123,123,136,154,136]] 

этот блок изображения при преобразовании с помощью кода, показанного выше

[162.3 ,40.6, 20.0... [30.5 ,108.4...

это должен быть результат,

[1186.3 , 40.6, 20.0... [30.5, 108.4 ....

но нашел вот такой Результат. для образца блока https://www.math.cuhk.edu.hk/~lmlui/dct.pdf


person Hakan Murat Aksüt    schedule 21.04.2019    source источник


Ответы (1)


DCT работает нормально. Разница между тем, что вы получили, и тем, что вы ожидаете, заключается в том, что этот конкретный пример фактически выполняет ДПФ на M, а не на исходном изображении, I. В этом случае, как показано в документе, M = I - 128. Единственная разница в вашем примере заключается в том, что вы не вычитаете эту часть, поэтому значения все больше. В косинусном преобразовании или преобразовании Фурье первый коэффициент («смещение постоянного тока», как его иногда называют) имеет более высокое значение, потому что значения вашего изображения просто больше. Но поэтому все остальные коэффициенты такие же. Если вы берете изображение и просто добавляете часть или вычитаете часть из всего изображения в равной степени, коэффициенты преобразования будут такими же, за исключением самого первого.

Из стандартного определения DCT:

Определение DCT

Здесь вы можете видеть, что для первого коэффициента с k = 0, что внутри функции косинуса, вы просто получаете 0, а cos (0) = 1. Таким образом, X_0 как показано на этом рисунке, это просто сумма всех значений x_n. Обычно это значение может быть масштабировано чем-то, относящимся к N, чтобы оно было чем-то вроде среднего. При этом он снова относится к термину X_0, являющемуся «смещением постоянного тока», которое вы увидите, описанным как «среднее значение сигнала», или, другими словами, насколько далеко сигнал от 0. Это очень полезно иметь в качестве одного из коэффициентов преобразования косинуса / Фурье, поскольку тогда он может полностью описывать сигнал; все другие коэффициенты описывают частотный состав, поэтому они ничего не говорят о том, насколько значения отличаются от 0, но первый коэффициент, смещение постоянного тока, сообщает вам сдвиг !

person alkasm    schedule 22.04.2019
comment
хорошо спасибо, но есть ли на то причина? или зачем сделали вычитание 128? - person Hakan Murat Aksüt; 22.04.2019