2015-04-27 2 views
1

Mon programme trouve les valeurs de varaince d'une image à chaque fenêtre d'une image quadrillée. Le problème est que lorsque j'imprime les valeurs, elles ne correspondent pas à ce qui est affiché dans l'image de sortie. J'ai inclus un exemple d'image ci-dessous.Sortie inattendue lors de la découverte de la variance d'une image dans OpenCV -Python

Voici mon code:

#import packages 
import numpy as np 
import cv2 
import dateutil 
import llist 
from matplotlib import pyplot as plt 
import argparse 

#Read in image as grey-scale 
img = cv2.imread('images/0021.jpg', 0) 

#Set scale of grid 
scale = 6 

#Get x and y components of image 
y_len,x_len = img.shape 

variance = [] 
for y in range(scale): 
    for x in range(scale): 
     #Crop image 9*9 windows 
     cropped_img=img[(y*y_len)/scale:((y+1)*y_len)/scale,(x*x_len)/scale:((x+1)*x_len)/scale] 

     (mean,stdv) = cv2.meanStdDev(cropped_img) 
     var = stdv*stdv 
     cropped_img[:] = var 

     #Print mean_values array 
     variance.append([var]) 
variance=np.asarray(variance) 
np.set_printoptions(suppress=True, precision=3) 
print variance.reshape(1,scale,scale) 

cv2.imshow('output_var',img) 
#cv2.imwrite('images/output_var_300.jpg',img,[int(cv2.IMWRITE_JPEG_QUALITY), 90]) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Voici l'image de sortie du code ci-dessus: Scale = 6

D'après ce que je peux dire aux valeurs ci-dessous ne correspondent pas à l'image ci-dessus. Est-ce que quelqu'un a une idée de ce qui se passe ici?

print variance.reshape(1,scale,scale) 
#[[[ 17.208  43.201 215.305 1101.816 1591.606 2453.611] 
# [ 46.664 121.162 326.59  809.223 1021.599 5330.989] 
# [ 47.754  64.69  705.875 1625.177 3564.494 10148.449] 
# [ 19.153 201.864 289.258 632.737 5285.449 4257.597] 
# [ 37.621 159.51  271.725 282.291 2239.097 759.007] 
# [ 26.108  98.456  32.958 505.609 575.916  70.741]]] 

Merci d'avance.

EDIT: Voici une image de sortie plus réaliste pour ceux qui sont intéressés: scale = 300

+0

Pour autant que je puisse voir, la 'variance 'correspond à l'image de sortie, le plus petit nombre signifie couleur plus sombre, et le contraire, donc l'image est correctement dessiné. Qu'attendez-vous de voir? – bosnjak

+0

@Lawrence Ok, prenons la deuxième ligne du tableau comme exemple, "46.664" correspond au premier bloc qui est gris foncé, "5330.989" correspond au dernier bloc qui est gris clair, donc vous vous attendriez à ce que la variance soit plus faible le dessinateur la sortie, comme vous l'avez dit. Mais l'avant-dernier bloc est "1021.599" ce qui est une valeur plus faible que le dernier bloc mais il est plus léger. Si vous travaillez à travers le tableau en essayant de le faire correspondre à l'image, vous verrez qu'il ne suit pas un modèle, l'élément quatrième dans le tableau est où le modèle est brisé. –

+0

Oui, je vois ce que vous voulez dire. La première chose qui me vient à l'esprit est la normalisation. Étant donné que la représentation des couleurs est comprise entre 0 et 255 par canal, vous risquez de rencontrer certains problèmes, tels que l'encapsulation de débordement ou similaire. J'essaierais de normaliser les valeurs et de voir ce qui se passe. – bosnjak

Répondre

1

Prenons par exemple, la deuxième rangée de variance. Étant donné que les valeurs de couleur sont dans la plage 0-255 par canal, nous pouvons essayer d'emballer vos valeurs à entrer dans cette gamme:

>>> row = [46.664, 121.162, 326.59, 809.223, 1021.599, 5330.989] 
>>> wrapped = [x % 256 for x in row] 
>>> wrapped 
[46.66, 121.16, 70.58, 41.22, 253.59, 210.98] 

Et le tour est joué, il est logique maintenant. Que voulez-vous dire qu'ils ne correspondent pas?

+0

Ok et comment ferais-je cela pour tout un tableau de 2-d comme le mien? –

+0

'var = [var% 256]' c'était tout ce que j'avais à faire, placé après la ligne 'cropped_img [:] = var' –