Как получить JPG изображения ширину и высоту всех файлов JPG в папке - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть папка poster_folder, содержащая файлы jpg, например, 1.jpg, 2.jpg, 3.jpg

Путь к этой папке:

from pathlib import Path
from PIL import Image

images_dir = Path('C:\\Users\\HP\\Desktop\\PGDinML_AI_IIITB\\MS_LJMU\\Dissertation topics\\Project_2_Classification of Genre for Movies using Machine Leaning and Deep Learning\\Final_movieScraping_data_textclasification\\posters_final').expanduser()

У меня есть фрейм данных с информацией об изображении в формате jpg:

df_subset_cleaned_poster.head(3)

movie_name  movie_image

Lion_king   1.jpg
avengers    2.jpg
iron_man    3.jpg

Я пытаюсь нанести разброс ширины и высоты всех файлов jpg (так как они имеют разное разрешение) в папке, как показано ниже:

height, width = np.empty(len(df_subset_cleaned_poster)), np.empty(len(df_subset_cleaned_poster))

for i in range(len(df_subset_cleaned_poster.movie_image)):
    w, h = Image.open(images_dir.joinpath(df_subset_cleaned_poster['movie_image'][i])).size
    width[i], height[i] = w, h
plt.scatter(width, height, alpha=0.5)
plt.xlabel('Width'); plt.ylabel('Height'); plt.show() 

Это ошибка метания: KeyError: 208

enter image description here

df_subset_cleaned_poster.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 10225 entries, 0 to 10986
Data columns (total 2 columns):
movie_name                  10225 non-null object
movie_image                 10225 non-null object
dtypes: object(2)

1 Ответ

1 голос
/ 13 апреля 2020

Как обсуждалось в комментариях: похоже, проблема заключается в создании фрейма данных или в самом файле csv.

Мне удалось создать правильный график рассеяния со следующим кодом:


from pathlib import Path

import numpy as np
import pandas as pd
from PIL import Image
import matplotlib.pyplot as plt
from io import StringIO

if __name__ == '__main__':
    images_dir = Path("../data/images")

    infile = StringIO("""movie_name,movie_image
Lion_king,1.jpg
avengers,2.jpg
iron_man,3.jpg
""")

    df_subset_cleaned_poster = pd.read_csv(infile)

    n = len(df_subset_cleaned_poster)
    height, width = np.empty(n), np.empty(n)

    for i, filename in enumerate(df_subset_cleaned_poster.movie_image):
        w, h = Image.open(images_dir / filename).size
        width[i], height[i] = w, h

    plt.scatter(width, height, alpha=0.5)
    plt.xlabel('Width')
    plt.ylabel('Height')
    plt.show()

Я предлагаю вам использовать этот код в качестве отправной точки для дальнейших экспериментов. Я использую enumerate для перебора всех строк в df_subset_cleaned_poster.movie_image. Это должно быть более устойчивым к IndexErrors.

Как видите, я заменил infile с фиктивной строкой на StringIO. Просто замените его на infile = open("your_file.txt"), чтобы снова использовать реальные данные.

...