在python中使用DWT计算图像帧的能量显示错误的值

时间:2016-06-22 14:43:04

标签: python matlab dwt

我想找到图像帧的能量。 这就是我在Matlab中的计算方法。

[~,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.

当我在python中为同一图像编程时,Energy的值显示为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

1 个答案:

答案 0 :(得分:0)

分析的问题是numpy数组和MATLAB矩阵的顺序不同(默认情况下)。 2D numpy数组的第一维是行,而2D MATLAB矩阵的第一维是列。 dwt2函数取决于此顺序。因此,为了获得dwt2的相同输出,您需要在使用之前转置numpy数组。

此外,dwt2输出numpy数组,而不是列表,所以你可以像在MATLAB中一样直接对它们进行数学运算。

此外,您可以使用size获取图片的总大小,从而使您不必再乘以mn

所以这应该给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