2016-06-22 2 views
0

Я хочу найти энергию кадра изображения. Вот как я вычислил в Matlab.Расчет энергии кадра изображения с использованием DWT в python показывает неправильное значение

[~,LH,HL,HH] = dwt2(rgb2gray(maskedImage),'db1'); % applying dwt 
E = HL.^2 + LH.^2 + HH.^2; % Calculating the energy of each pixel. 
Eframe = sum(sum(E))/(m*n); % m,n row and columns of image. 

, когда я запрограммировал в питоне для того же изображения, значение энергии показано 170 ожидаемого 0.7 где же моя программа пойдет не так, пожалуйста, предложить

#!usr/bin/python 
import numpy as np 
import cv2 
import pywt 
im = cv2.cvtColor(maskedimage,cv2.COLOR_BGR2GRAY) 
m,n = im.shape 
cA, (cH, cV, cD) = pywt.dwt2(im,'db1') 
# a - LL, h - LH, v - HL, d - HH as in matlab 
cHsq = [[elem * elem for elem in inner] for inner in cH] 
cVsq = [[elem * elem for elem in inner] for inner in cV] 
cDsq = [[elem * elem for elem in inner] for inner in cD] 
Energy = (np.sum(cHsq) + np.sum(cVsq) + np.sum(cDsq))/(m*n) 
print Energy 

ответ

0

Проблемы с вашим анализом является то, что numpy массивы и матрицы MATLAB находятся в разных порядках (по умолчанию). Первым измерением массива 2D numpy является строка, в то время как первым измерением 2D матрицы MATLAB является столбец. Функция dwt2 зависит от этого порядка. Поэтому, чтобы получить тот же вывод dwt2, вам необходимо перенести массив numpy перед его использованием.

Кроме того, dwt2 выводит массивы numpy, а не списки, поэтому вы можете просто выполнять математические операции непосредственно на них, как в MATLAB.

Кроме того, вы можете получить общий размер изображения с помощью size, что избавит вас от необходимости умножать m и n.

Так что это должно быть дать эквивалентные результаты MATLAB, если у вас есть порядок цветовых каналов правильного (BGR против RGB):

#!usr/bin/python 
import cv2 
from pywt import dwt2 

im = cv2.cvtColor(maskedimage, cv2.COLOR_BGR2GRAY) 
_, (cH, cV, cD) = dwt2(im.T, 'db1') 
# a - LL, h - LH, v - HL, d - HH as in matlab 
Energy = (cH**2 + cV**2 + cD**2).sum()/im.size 

print Energy