2016-06-22 12 views
0

Ich möchte die Energie des Bildrahmens zu finden. So habe ich in Matlab berechnet.Berechnung der Energie von Bildrahmen mit DWT in Python zeigt falschen Wert

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

, wenn ich für das gleiche Bild in Python programmierte, wird der Wert der Energie 170 gezeigt für erwartete 0,7 wo falsch mein Programm ging bitte

#!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 

Antwort

0

das Problem bei der Analyse deutet darauf hin, dass Numpy-Arrays und MATLAB-Matrizen sind in verschiedenen Reihenfolgen (standardmäßig). Die erste Dimension eines 2D-Nummernfelds ist die Zeile, während die erste Dimension einer 2D-MATLAB-Matrix die Spalte ist. Die Funktion dwt2 hängt von dieser Reihenfolge ab. Um also die gleiche Ausgabe von dwt2 zu erhalten, müssen Sie das numpy Array transponieren, bevor Sie es verwenden.

Weiter, dwt2 Ausgaben numpy Arrays, nicht Listen, so können Sie einfach mathematische Operationen direkt auf sie tun, wie Sie in MATLAB tun.

Außerdem können Sie die Gesamtgröße des Bildes mit size erhalten, so dass Sie nicht m und n multiplizieren müssen.

So sollte diese gleichwertige Ergebnisse zu MATLAB geben werden, vorausgesetzt, Sie die Reihenfolge der Farbkanäle korrekt (BGR vs. RGB) haben:

#!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