Python:IndexError:列表索引超出范围如何解决此错误?

时间:2018-04-16 05:32:33

标签: python-3.x

我正在使用双边滤镜来完成我的工作。我收到了以下错误:

  

src = cv2.imread(str(sys.argv [1]),0)IndexError:列出索引   范围

代码:双边bilter

 import numpy as np
 import cv2
 import sys
 import math 


def distance(x, y, i, j):
    return np.sqrt((x-i)**2 + (y-j)**2)


def gaussian(x, sigma):
    return (1.0 / (2 * math.pi * (sigma ** 2))) * math.exp(- (x ** 2) / (2 * sigma ** 2))


def apply_bilateral_filter(source, filtered_image, x, y, diameter, sigma_i, sigma_s):
    hl = diameter/2
    i_filtered = 0
    Wp = 0
    i = 0
    while i < diameter:
        j = 0
        while j < diameter:
            neighbour_x = x - (hl - i)
            neighbour_y = y - (hl - j)
            if neighbour_x >= len(source):
                neighbour_x -= len(source)
            if neighbour_y >= len(source[0]):
                neighbour_y -= len(source[0])
            gi = gaussian(source[neighbour_x][neighbour_y] - source[x][y], sigma_i)
            gs = gaussian(distance(neighbour_x, neighbour_y, x, y), sigma_s)
            w = gi * gs
            i_filtered += source[neighbour_x][neighbour_y] * w
            Wp += w
            j += 1
        i += 1
    i_filtered = i_filtered / Wp
    filtered_image[x][y] = int(round(i_filtered))


def bilateral_filter_own(source, filter_diameter, sigma_i, sigma_s):
    filtered_image = np.zeros(source.shape)

    i = 0
    while i < len(source):
        j = 0
        while j < len(source[0]):
            apply_bilateral_filter(source, filtered_image, i, j, filter_diameter, sigma_i, sigma_s)
            j += 1
        i += 1
    return filtered_image


if __name__ == "__main__":
    src = cv2.imread(str(sys.argv[1]), 0)
    filtered_image_OpenCV = cv2.bilateralFilter(src, 5, 12.0, 16.0)
    cv2.imwrite("original_image_grayscale.png", src)
    cv2.imwrite("filtered_image_OpenCV.png", filtered_image_OpenCV)
    filtered_image_own = bilateral_filter_own(src, 5, 12.0, 16.0)
    cv2.imwrite("filtered_image_own.png", filtered_image_own)

2 个答案:

答案 0 :(得分:1)

sys.argv[1]正在索引命令行参数列表的第一个元素。如果您在运行程序时没有提供参数,例如python yourfilename.py testingIndexError将被抛出。请注意,列表的第0个元素是脚本的文件名。

使用print(sys.argv)下面的if __name__ == "__main__":进行调试,以查看sys.argv列表的内容。

另外,请注意,参数是作为字符串传递的,因此str()强制转换是多余的。

答案 1 :(得分:0)

似乎某些内容并不像您期望的那样,IndexError: list index out of range表示您的列表src = cv2.imread(str(sys.argv[1]), 0)中没有2个元素,只有1个元素存在。

尝试调试代码:

if __name__ == "__main__":
    print('This is the type of my sys.argv', type(sys.argv))
    print('This is str(sys.argv) as full list --> ', str(sys.argv)) # my guess is that it will give only 1 item in the list, maybe you first need to do some splitting or etc, but the end result will be seen from you'r debugging :)
    print('This is str(sys.argv[0]) first itme from list --> ', str(sys.argv[0]))

    # add break point here
    src = cv2.imread(str(sys.argv[1]), 0)
    filtered_image_OpenCV = cv2.bilateralFilter(src, 5, 12.0, 16.0)
    cv2.imwrite("original_image_grayscale.png", src)
    cv2.imwrite("filtered_image_OpenCV.png", filtered_image_OpenCV)
    filtered_image_own = bilateral_filter_own(src, 5, 12.0, 16.0)
    cv2.imwrite("filtered_image_own.png", filtered_image_own)