Как читать изображения из списка - PullRequest
0 голосов
/ 07 ноября 2019

Привет! У меня есть набор изображений, сохраненных в виде элементов списка, и я хочу прочитать изображения по одному и выполнить некоторые операции с ним. Я не могу понять, как перебирать каждый элемент изображения в списке. Я могу прочитать их явно из папки, используя cv2.imread, но я хочу использовать элемент списка, в котором они хранятся.

Я пытаюсь прочитать выровненные изображения, которые я сохранил в элементе списка«Выравнивание». Подпрограмма, которую я использовал для выравнивания изображения, такова:

def stackImagesECC(file_list):
    M = np.eye(3, 3, dtype=np.float32)

    first_image = None
    stacked_image = None
    align = []



    for file in file_list:
        image = cv2.imread(file,1).astype(np.float32) / 255
        print(file)
        if first_image is None:
            # convert to gray scale floating point image
            first_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
            stacked_image = image
        else:
            # Estimate perspective transform
            s, M = cv2.findTransformECC(cv2.cvtColor(image,cv2.COLOR_BGR2GRAY), first_image, M, cv2.MOTION_HOMOGRAPHY)
            w, h, _ = image.shape
            # Align image to first image
            image = cv2.warpPerspective(image, M, (h, w))
            align.append(image)

            stacked_image += image
#             cv2.imwrite("aligned{}/aligned{}.png".format(file), image)

            cv2.imshow("aligned", image)
#             cv2.imwrite("output/aligned/",image)
            cv2.waitKey(0)


    stacked_image /= len(file_list)
    stacked_image = (stacked_image*255).astype(np.uint8)

    return align

И затем я вызвал эту функцию, используя:

align = stackImagesECC(glob.glob(path))

Теперь, чтобы выполнить некоторые функции, я пытаюсь прочитать этифайлы из переменной выравнивания.

#function to detect edges in images
def auto_canny(image, sigma=0.33):
    # Compute the median of the single channel pixel intensities
    img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    v = np.median(image)


    # Apply automatic Canny edge detection using the computed median
    lower = int(max(0, (1.0 - sigma) * v))
    upper = int(min(255, (1.0 + sigma) * v))
    return cv2.Canny(image, lower, upper)

это подпрограмма обнаружения края, для которой я хочу прочитать выровненные изображения

for file in range(0,len(align)):
        img = cv2.imread(file)  

Может кто-нибудь подсказать, что я делаю неправильно? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

align - это уже список изображений. Вы можете просто перебрать их, чтобы получить нужные изображения:

for image in align:
    # Do something with the image

Однако, поскольку вы используете итератор range, вы можете просто индексировать прямо в align, чтобы получить то, что вы хотите:

for i in range(0, len(align)):
    image = align[i] # Get the ith image
    # Do something with it

Поскольку вы возвращаете список выровненных изображений, в этой функции есть вещи, которые вам больше не нужны. В частности, вам не нужно вычислять сложенное изображение. Вам, вероятно, также не нужно показывать изображения на каждой итерации.

Следовательно:

def stackImagesECC(file_list):
    M = np.eye(3, 3, dtype=np.float32)
    first_image = None
    align = []

    for file in file_list:
        image = cv2.imread(file,1).astype(np.float32) / 255
        if first_image is None:
            # convert to gray scale floating point image
            first_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
        else:
            # Estimate perspective transform
            s, M = cv2.findTransformECC(cv2.cvtColor(image,cv2.COLOR_BGR2GRAY), first_image, M, cv2.MOTION_HOMOGRAPHY)
            w, h, _ = image.shape
            # Align image to first image
            image = cv2.warpPerspective(image, M, (h, w))
            align.append(image)

    return align
0 голосов
/ 07 ноября 2019

list сам по себе является итератором, просто перебираем его.

for file in align:
    # code here...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...