2016-06-22 4 views
0

画像フレームのエネルギーを探したいと思います。 これは私がMatlabで計算したものです。私は、同じ画像のためのpythonでプログラムするときPythonでDWTを使用して画像フレームのエネルギーを計算すると間違った値が表示される

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

、エネルギーの値は、私のプログラムがうまくいかなかった予想0.7 170を示している

#!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機能はこの順序に依存します。だから、同じ出力を得るためにはnumpy配列を転置する必要があります。

さらに、dwt2はリストではなくnumpy配列を出力するので、MATLABのように数学演算を直接行うことができます。

さらに、sizeで画像の合計サイズを取得すると、mnを掛けなければならなくなります。

だから、これはあなたが(RGB対BGR)正しいカラーチャンネルの順序を持​​っていると仮定すると、MATLABと同等の結果を与えるべきである:

#!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 
関連する問題