Python 属性错误:';numpy.ndarray和#x27;对象没有属性';转换为';索引器错误:列表索引超出范围

Python 属性错误:';numpy.ndarray和#x27;对象没有属性';转换为';索引器错误:列表索引超出范围,python,Python,属性错误可能已经在前面发布了,但是在我找到解决方案的情况下,我遇到了另一个错误,指出我的列表索引超出范围。我是Python初学者,致力于破解图像验证码。我已使用此处提供的代码- 基于此,我添加了几行来运行它 lineremovation.py from PIL import Image,ImageFilter from scipy.misc import toimage from operator import itemgetter from skimage import measure imp

属性错误可能已经在前面发布了,但是在我找到解决方案的情况下,我遇到了另一个错误,指出我的列表索引超出范围。我是Python初学者,致力于破解图像验证码。我已使用此处提供的代码-

基于此,我添加了几行来运行它

lineremovation.py

from PIL import Image,ImageFilter
from scipy.misc import toimage
from operator import itemgetter
from skimage import measure
import numpy as np
import copy
import heapq
import cv2
import matplotlib.pyplot as plt
from scipy.ndimage.filters import median_filter


#----------------------------------------------------------------

class preprocessing:
    def pre_proc_image(self,img):
        #img_removed_noise=self.apply_median_filter(img)
        img_removed_noise=self.remove_noise(img)
        p1,p2,LL=self.get_line_position(img_removed_noise)
        img=self.remove_line(p1,p2,LL,img_removed_noise)
        img=median_filter(np.asarray(img),1)
        return img

    def remove_noise(self,img):
        img_gray=img.convert('L')
        w,h=img_gray.size
        max_color=np.asarray(img_gray).max()
        pix_access_img=img_gray.load()
        row_img=list(map(lambda x:255 if x in range(max_color-15,max_color+1) else 0,np.asarray(img_gray.getdata())))
        img=np.reshape(row_img,[h,w])
        return img

    def apply_median_filter(self,img):
        img_gray=img.convert('L')
        img_gray=cv2.medianBlur(np.asarray(img_gray),3)
        img_bw=(img_gray>np.mean(img_gray))*255
        return img_bw

    def eliminate_zeros(self,vector):
        return [(dex,v) for (dex,v) in enumerate(vector) if v!=0 ]

    def get_line_position(self,img):
        sumx=img.sum(axis=0)
        list_without_zeros=self.eliminate_zeros(sumx)
        min1,min2=heapq.nsmallest(2,list_without_zeros,key=itemgetter(1))
        l=[dex for [dex,val] in enumerate(sumx) if val==min1[1] or val==min2[1]]
        mindex=[l[0],l[len(l)-1]]
        cols=img[:,mindex[:]]
        col1=cols[:,0]
        col2=cols[:,1]
        col1_without_0=self.eliminate_zeros(col1)
        col2_without_0=self.eliminate_zeros(col2)
        line_length=len(col1_without_0)
        dex1=col1_without_0[round(len(col1_without_0)/2)][0]
        dex2=col2_without_0[round(len(col2_without_0)/2)][0]
        p1=[dex1,mindex[0]]
        p2=[dex2,mindex[1]]
        return p1,p2,line_length

    def remove_line(self,p1,p2,LL,img):
        m=(p2[0]-p1[0])/(p2[1]-p1[1]) if p2[1]!=p1[1] else np.inf
        w,h=len(img),len(img[0])
        x=list(range(h))
        y=list(map(lambda z : int(np.round(p1[0]+m*(z-p1[1]))),x))
        img_removed_line=list(img)
        for dex in range(h):
            i,j=y[dex],x[dex]
            i=int(i)
            j=int(j)
            rlist=[]
            while i>=0:
                f1=i
                if img_removed_line[i][j]==0 and img_removed_line[i-1][j]==0:
                    break
                rlist.append(i)
                i=i-1

            i,j=y[dex],x[dex]
            i=int(i)
            j=int(j)
            while True:
                f2=i
                if img_removed_line[i][j]==0 and img_removed_line[i+1][j]==0:
                    break
                rlist.append(i)
                i=i+1
            if np.abs(f2-f1) in [LL+1,LL,LL-1]:
                rlist=list(set(rlist))
                for k in rlist:
                    img_removed_line[k][j]=0

        return img_removed_line

if __name__ == '__main__':
    img = cv2.imread("captcha.png")
    p = preprocessing()
    imgNew = p.pre_proc_image(img)
    cv2.imshow("Image", imgNew)
    cv2.waitKey(0)
while i>=0:
    f1=i
        if img_removed_line[i][j]==0 and img_removed_line[i-1][j]==0:
            break
        rlist.append(i)
        i=i-1
i,j=y[dex],x[dex]
i=int(i)
j=int(j)
while i<len(img_removed_line)-1:
    f2=i
        if img_removed_line[i][j]==0 and img_removed_line[i+1][j]==0:
            break
        rlist.append(i)
        i=i+1
最初尝试上面的代码时,我得到了错误

Traceback (most recent call last):
  File "lineRemoval.py", line 98, in <module>
    imgNew = p.pre_proc_image(img)
  File "lineRemoval.py", line 18, in pre_proc_image
    img_removed_noise=self.remove_noise(img)
  File "lineRemoval.py", line 25, in remove_noise
    img_gray=img.convert('L')
AttributeError: 'numpy.ndarray' object has no attribute 'convert'
但是,在这之后,我的数组超出了索引

Traceback (most recent call last):
  File "lineRemoval.py", line 98, in <module>
    imgNew = p.pre_proc_image(img)
  File "lineRemoval.py", line 20, in pre_proc_image
    img=self.remove_line(p1,p2,LL,img_removed_noise)
  File "lineRemoval.py", line 83, in remove_line
    if img_removed_line[i][j]==0 and img_removed_line[i+1][j]==0:
IndexError: list index out of range
回溯(最近一次呼叫最后一次):
文件“lineremovation.py”,第98行,在
imgNew=p.pre\u proc\u image(img)
pre_proc_图像中的文件“lineremovation.py”,第20行
img=自身移除线(p1、p2、LL、img移除噪声)
文件“lineremovation.py”,第83行,在remove_行
如果img_已移除_线[i][j]==0且img_已移除_线[i+1][j]==0:
索引器:列表索引超出范围
无法确定错误所在,while条件是否需要更改,或者是前一个更改导致了错误,或者是其他原因

更新

我已经更改了while循环的条件,但是对于I>=0的初始while循环条件,情况类似

lineremovation.py

from PIL import Image,ImageFilter
from scipy.misc import toimage
from operator import itemgetter
from skimage import measure
import numpy as np
import copy
import heapq
import cv2
import matplotlib.pyplot as plt
from scipy.ndimage.filters import median_filter


#----------------------------------------------------------------

class preprocessing:
    def pre_proc_image(self,img):
        #img_removed_noise=self.apply_median_filter(img)
        img_removed_noise=self.remove_noise(img)
        p1,p2,LL=self.get_line_position(img_removed_noise)
        img=self.remove_line(p1,p2,LL,img_removed_noise)
        img=median_filter(np.asarray(img),1)
        return img

    def remove_noise(self,img):
        img_gray=img.convert('L')
        w,h=img_gray.size
        max_color=np.asarray(img_gray).max()
        pix_access_img=img_gray.load()
        row_img=list(map(lambda x:255 if x in range(max_color-15,max_color+1) else 0,np.asarray(img_gray.getdata())))
        img=np.reshape(row_img,[h,w])
        return img

    def apply_median_filter(self,img):
        img_gray=img.convert('L')
        img_gray=cv2.medianBlur(np.asarray(img_gray),3)
        img_bw=(img_gray>np.mean(img_gray))*255
        return img_bw

    def eliminate_zeros(self,vector):
        return [(dex,v) for (dex,v) in enumerate(vector) if v!=0 ]

    def get_line_position(self,img):
        sumx=img.sum(axis=0)
        list_without_zeros=self.eliminate_zeros(sumx)
        min1,min2=heapq.nsmallest(2,list_without_zeros,key=itemgetter(1))
        l=[dex for [dex,val] in enumerate(sumx) if val==min1[1] or val==min2[1]]
        mindex=[l[0],l[len(l)-1]]
        cols=img[:,mindex[:]]
        col1=cols[:,0]
        col2=cols[:,1]
        col1_without_0=self.eliminate_zeros(col1)
        col2_without_0=self.eliminate_zeros(col2)
        line_length=len(col1_without_0)
        dex1=col1_without_0[round(len(col1_without_0)/2)][0]
        dex2=col2_without_0[round(len(col2_without_0)/2)][0]
        p1=[dex1,mindex[0]]
        p2=[dex2,mindex[1]]
        return p1,p2,line_length

    def remove_line(self,p1,p2,LL,img):
        m=(p2[0]-p1[0])/(p2[1]-p1[1]) if p2[1]!=p1[1] else np.inf
        w,h=len(img),len(img[0])
        x=list(range(h))
        y=list(map(lambda z : int(np.round(p1[0]+m*(z-p1[1]))),x))
        img_removed_line=list(img)
        for dex in range(h):
            i,j=y[dex],x[dex]
            i=int(i)
            j=int(j)
            rlist=[]
            while i>=0:
                f1=i
                if img_removed_line[i][j]==0 and img_removed_line[i-1][j]==0:
                    break
                rlist.append(i)
                i=i-1

            i,j=y[dex],x[dex]
            i=int(i)
            j=int(j)
            while True:
                f2=i
                if img_removed_line[i][j]==0 and img_removed_line[i+1][j]==0:
                    break
                rlist.append(i)
                i=i+1
            if np.abs(f2-f1) in [LL+1,LL,LL-1]:
                rlist=list(set(rlist))
                for k in rlist:
                    img_removed_line[k][j]=0

        return img_removed_line

if __name__ == '__main__':
    img = cv2.imread("captcha.png")
    p = preprocessing()
    imgNew = p.pre_proc_image(img)
    cv2.imshow("Image", imgNew)
    cv2.waitKey(0)
while i>=0:
    f1=i
        if img_removed_line[i][j]==0 and img_removed_line[i-1][j]==0:
            break
        rlist.append(i)
        i=i-1
i,j=y[dex],x[dex]
i=int(i)
j=int(j)
while i<len(img_removed_line)-1:
    f2=i
        if img_removed_line[i][j]==0 and img_removed_line[i+1][j]==0:
            break
        rlist.append(i)
        i=i+1
当i>=0时:
f1=i
如果img_已移除_线[i][j]==0且img_已移除_线[i-1][j]==0:
打破
rlist.append(i)
i=i-1
i、 j=y[dex],x[dex]
i=int(i)
j=int(j)

while i将函数
删除行中的第二个while循环替换为以下代码:

while i<len(img_remmoved_line)-1:
    f2=i
    if img_removed_line[i][j]==0 and img_removed_line[i+1][j]==0:
        break
    rlist.append(i)
    i=i+1

即使我将其更改为iYa,也会出现相同的错误,这可能是因为您在最后一个索引之后向I添加了一个额外的错误。尝试以下操作:-iNow出现的错误是回溯的(最近一次调用是最后一次):文件“lineremovation.py”,第98行,在imgNew=p.pre_proc_image(img)文件“lineremovation.py”中,第20行,在pre_proc_image img=self.remove_line(p1,p2,LL,img_removed_)noise)文件“lineremove.py”,第73行,如果img_已删除[i][]==0和img_已删除\u行[i-1][j]==0:indexer错误:列表索引超出范围我已将其放入问题中您尝试在每行出现错误之前使用print语句调试代码。