1

画像フレームのエネルギーを見つけたい。これは私が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でプログラムすると、エネルギーの値が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
4

1 に答える 1

1

解析の問題は、numpy 配列と MATLAB 行列の順序が (既定で) 異なることです。2D numpy 配列の最初の次元は行ですが、2D MATLAB 行列の最初の次元は列です。関数はこのdwt2順序に依存します。したがって、 の同じ出力を得るにはdwt2、numpy 配列を使用する前に転置する必要があります。

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

さらに、 を使用してイメージの合計サイズを取得できるため、とsizeを乗算する必要がなくなります。mn

したがって、カラー チャネルの順序が正しい (BGR と RGB) と仮定すると、これは 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
于 2016-06-22T16:01:39.070 に答える