вызов библиотеки библиотеки python и метод, который возвращает повторяющиеся данные

Я работаю над некоторым кодом python, который открывает jpg и переходит к определенной части изображения и извлекает эту часть. Код предназначен для того, чтобы взять прямоугольник определенного размера и сжать его до 28 на 28. С моим кодом теперь я всегда получаю вывод ниже. На выходе отображается строка данных, повторяющихся 28 раз. Я ожидаю, что результат изменится, но это не так. Я надеялся, что это то, что кто-то может легко заметить. Любая помощь будет оценена по достоинству. Благодарю.

        def start_here(self):
            ...  # x,y,w,h are all valid
            filename = "some valid filename"
            img = self.look_at_img(filename,x,y,w,h) 
            self.print_block(img)

        def look_at_img(self, filename, x = 0, y = 0, width = 28, height = 28):
            img = Image.open(open(filename))
            size = 28, 28

            img2 = [[0] * 28] * 28
            oneimg = []


            mnist_dim = 28

            multx = width / float(mnist_dim)
            multy = height / float(mnist_dim)

            xy_list = []
            dimx, dimy = img.size
            #img = np.asarray(img, dtype='float64')

            ''' Put in shrunk form. '''
            if not len (img.shape) < 3 :
                if not (x + width > dimx and y + height > dimy) :

                    for aa in range(28) :
                        for bb in range(28) :
                            astart = x + aa * multx
                            bstart = y + bb * multy
                            #print astart, bstart
                            if True :
                                item = [ aa, bb, list(img.getpixel((int(astart) ,int(bstart))))]
                                xy_list.append(item)


            ''' Put list in 28 x 28 array. '''
            if len(xy_list) == 0:
                xy_list = [[0, 0,[0,0,0]]]

            for i in range(len(xy_list)):
                q = xy_list[i]
                if i < 10: print(q)
                if (q[0] < 28) and (q[1] < 28) and (q[0] >= 0) and (q[1] >= 0) :
                    img2[int(q[0])]  [ int(q[1])] =   q[2][0]

            ''' Then add entire array to oneimg variable and flatten.'''
            for yz in range(28):
                for xz in range(28):
                    oneimg.append(img2[yz][xz])

            return oneimg 

        def print_block(self, img):
            #print (img)
            for x in range(28):
                for y in range(28):

                    out = str(img[x *28 + y]) +" "
                    sys.stdout.write(out)
                print "|"
            print "---------------"

некоторые из них приведены ниже:

    [0, 0, [90, 75, 70]]
    [0, 1, [85, 77, 66]]
    [0, 2, [87, 73, 70]]
    [0, 3, [88, 74, 73]]
    [0, 4, [86, 73, 64]]
    [0, 5, [91, 77, 68]]
    [0, 6, [89, 74, 69]]
    [0, 7, [86, 73, 65]]
    [0, 8, [87, 72, 65]]
    [0, 9, [86, 72, 63]]
    45 35 48 61 62 61 95 91 94 88 92 93 87 98 178 194 116 98 90 91 92 85 84 88 88 90 91 92 |
    45 35 48 61 62 61 95 91 94 88 92 93 87 98 178 194 116 98 90 91 92 85 84 88 88 90 91 92 |
    45 35 48 61 62 61 95 91 94 88 92 93 87 98 178 194 116 98 90 91 92 85 84 88 88 90 91 92 |
    ... more repeated values ...

EDIT : это некоторые из моих импортных

    import numpy as np
    from PIL import Image
    import os
    import sys

EDIT : я изменил код и обновил вывод. Я не могу понять, почему список из print (q)строки не соответствует номерам в таблице.

python,pillow,

0

Ответов: 1


0

что-то вроде этого работает для меня. необходимо использовать массив numpy дляimg2

    def look_at_img(self, filename, x = 0, y = 0, width = 28, height = 28):

        img = Image.open(filename)

        img2 = [[0] * 28] * 28
        img2 = np.asarray(img2, dtype="float32") ## 'img2' MUST BE A NUMPY ARRAY!!

        oneimg = []

        mnist_dim = 28

        multx = width / float(mnist_dim)
        multy = height / float(mnist_dim)

        xy_list = []
        dimx, dimy = img.size

        counter = 0

        ''' Put in shrunk form. '''
        if not len (img.getbands()) < 3 :
            if not (x + width > dimx and y + height > dimy) :

                for aa in range(28) :
                    for bb in range(28) :
                        astart = x + aa * multx
                        bstart = y + bb * multy

                        if  astart >= 0 and astart < dimx and bstart >= 0 and bstart < dimy :
                            item = [ aa, bb, list(img.getpixel((int(astart) ,int(bstart))))]
                            xy_list.append(item)
                            counter = counter + 1


        ''' Put list in 28 x 28 array. '''
        if len(xy_list) == 0:
            xy_list = [[0, 0,[0,0,0]]]
        ''' just one color '''
        high = img.getextrema()[0][1] /2
        for i in range(len(xy_list)):
            q = xy_list[i]
            color = q[2][0]
            if color > high : img2[int(q[0]), int(q[1])] =   color

        ''' Then add entire array to oneimg variable and flatten.'''
        for yz in range(28):
            for xz in range(28):
                oneimg.append(img2[yz][xz])


        return  oneimg
питон, подушка,
Похожие вопросы