Erreur :AttributeError: 'NoneType' object has no attribute '

Résolu

Bonsoir

j'ai exécuté le code d'une m'étrique de qualité d"image psnr 

je comprends pas l'erreur ,a la ligne 13 j'ai besoin d'aide svp

erreur : ligne13 height, width, channel = s.shape

le code :

 
import math
import cv2
import csv
import os

def read_bmp(image_name):
   return cv2.imread(image_name+'.bmp')

def calculate_psnr(n):
   s = read_bmp('source/s'+n)
   r = read_bmp('recovery/rs'+n)

   height, width, channel = s.shape
   size = height*width

   sb,sg,sr = cv2.split(s)
   rb,rg,rr = cv2.split(r)

   mseb = ((sb-rb)**2).sum()
   mseg = ((sg-rg)**2).sum()
   mser = ((sr-rr)**2).sum()

   MSE = (mseb+mseg+mser)/(3*size)
   psnr = 10*math.log10(255**2/MSE)
   return round(psnr,2)

def write_csv(n,data):
   with open('PSNR-result/'+n+'.csv', 'w', newline='') as myfile:
      wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
      wr.writerow(data)

for i in range(6):
   print("Creating CSV of PSNR-result",i+1,"...",sep="")
   write_csv(str(i+1),[calculate_psnr(str(i+1))])

os.system("pause")

cordialement
Windows / Chrome 106.0.5249.168

4 réponses

  1. Salut,

    s et r ne sont pas définis lors de l'appel mais dans la fonction, supprime les paramètres s et r 

    def PSNR():
        ....
    
    
    value = PSNR()
    1. bonsoir

      je te remercie bcp

      problème résolu

      salutations

  2. Moi non plus je ne comprend pas ...
    Tu passes en paramètre à ta fonction PSNR les variables  s  et  r  et tu les redéfinis dans la fonction.
    Ces objets ne semblent pas exister au moment de l'appel.

    1. bonjour 

      j'ai corrigé le code pour l'importation des images mais j'ai encore un message d'erreur 

       value = PSNR(s, r)
      NameError: name 's' is not defined

      pourtant le s est definie comme image original

      voici le code :

      
      
      
      def PSNR(s, r):
      
         s = cv2.imread("original_image.png")
         r = cv2.imread("compressed_image.png")
      
         height, width, channel = s.shape
         size = height*width
      
         sb,sg,sr = cv2.split(s)
         rb,rg,rr = cv2.split(r)
      
         mseb = ((sb-rb)**2).sum()
         mseg = ((sg-rg)**2).sum()
         mser = ((sr-rr)**2).sum()
      
         MSE = (mseb+mseg+mser)/(3*size)
         psnr = 10*math.log10(255**2/MSE)
         return round(psnr,2)
      
      def main():
      
          value = PSNR(s, r)
          # Affichage du psnr
          print(f"PSNR value is {value} dB")
      
      
      if __name__ == "__main__":
          main()
      

      que dois je comprendre ? un coup de main svp

      merci 

      cordialement

      1. La fonction read_bmp() ne retourne rien, donc elle retourne None
        Donc, l'attribut shape ne s'applique à "rien"

        Que retourne cv2.imread(image_name+'.bmp')  ?

        1. bonsoir

          merci bien j'ai compris qu'il faut enlever les paramètres 

          good night