python中的图像处理循环/属性错误' NoneType'

时间:2018-04-23 14:13:31

标签: python opencv

我有近900张.jpg图像(通过在帧中分割视频获得,每张图像是116ko),我想使用" Mean Squared将每个帧与第一帧(= frame0)进行比较错误&#34 ;.

加载两个图像并进行比较非常容易,但是(至少对我来说)写一个加载和比较我的图像的循环要困难得多。 我的目标只是列出所有"均方误差" (MSE)中的值。

的问题:

我不需要同时加载或打开所有图像,但我不知道如何在处理时间内加载图像。

我的图片与我的.py文件位于同一文件夹中。

当我运行我的代码时,它会返回:

  

追踪(最近一次通话):     文件" C:\ Users \ Susie \ Documents \ programmes_python \ python \ images_video \ comparaison-images2.py",第46行,在       compare_images(frame0,frame0)     文件" C:\ Users \ Susie \ Documents \ programmes_python \ python \ images_video \ comparaison-images2.py",第24行,在compare_images中       s = ssim(imageA,imageB)     在compare_ssim中的文件" C:\ Python27 \ lib \ site-packages \ skimage \ measure_structural_similarity.py",第151行       " win_size超出图像范围。如果输入是多通道"   ValueError:win_size超出图像范围。如果输入是多通道(彩色)图像,请设置multichannel = True。

# import the necessary packages
from skimage.measure import compare_ssim as ssim
import numpy as np
import cv2
from os import listdir
from os.path import isfile, join

def mse(imageA, imageB):
    # the 'Mean Squared Error' between the two images is the
    # sum of the squared difference between the two images
    err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)
    err /= float(imageA.shape[0] * imageA.shape[1])

    # return the MSE, the lower the error, the more "similar"
    # the two images are
    return err

def compare_images(imageA, imageB):
    # compute the mean squared error and structural similarity
    # index for the images
    m = mse(imageA, imageB)
    s = ssim(imageA, imageB)
    mse_list.append(m)
    ssim_list.append(s)
    print (mse_list)
    print (ssim_list)


# load the images and convert the images to grayscale
frame0 = cv2.imread("frame0.jpg")

mypath='C:\Users\Susie\Documents\programmes_python\python\images_video'
onlyfiles = [ f for f in listdir(mypath) if isfile(join(mypath,f)) ]
images = np.empty(len(onlyfiles), dtype=object)

for n in range(1, len(onlyfiles)):
  images[n] = cv2.imread( join(mypath,onlyfiles[n]) )
  images[n] = cv2.cvtColor(images[n], cv2.COLOR_BGR2GRAY)


# compare the images
mse_list = []
ssim_list = []
compare_images(frame0, frame0)

for n in range(1, len(onlyfiles)):
    compare_images(frame0, images[n])

2 个答案:

答案 0 :(得分:1)

我想提一下编程错误:

<强> 1。属性错误:

确保.py文件和图像集合存在于同一文件夹中。如果不是,请专门提及例如路径。 mypath='C:/Users/Susie/Documents/programmes_python/python/images_video

<强> 2。价值错误:

多通道图像与单通道图像进行比较会引发此错误。确保图像大小相同且通道数相同。

犯错误是学习的一步!!!

答案 1 :(得分:0)

由于您使用的是灰度图像,因此需要通过添加0参数来指定它,如下所示:

frame0 = cv2.imread("frame0.jpg", 0)

查看OpenCV文档以获取更多详细信息:https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html