Как объединить 1000 изображений по вертикали, используя цикл for в Python?

#python #image #concatenation #scikit-image

#python #изображение #объединение #scikit-image

Вопрос:

Я хочу объединить по вертикали много изображений. Я использовал skimage для чтения изображений, затем на каждой итерации io считывал изображение и vconcat объединял новое изображение на старом изображении по вертикали. Результат моего кода не объединил изображения, просто объединил изображения. Есть идеи, как сделать так, чтобы каждое изображение на каждой итерации объединялось по вертикали друг с другом?

Я хочу объединить первое изображение и второе изображение по вертикали:

первое изображение

второе изображение

но я получил этот результат:

Результат

введите описание изображения здесь

 data = []
if nSpectogram < 3765:
    for k in range(0, 21):
        path = io.imread('E:\wavelet\spectrograms\paz05\' 'spec_' isPreictal '_' str(nSpectogram 1) '_' str(k 1) '.png')
        im_v_array = np.array(im_v)
        data.append(path)
    res = np.concatenate(data)
    plt.imshow(res, cmap='inferno', aspect='auto', interpolation='nearest')
  

Комментарии:

1. Можете ли вы объяснить разницу между «concat» и «combine»? Примеры будут иметь большое значение для того, что вы получаете и чего хотите

2. @VivekKalyanarangan готово. Я хочу объединить много изображений по вертикали. но в результате я получил изображение, подобное изображению, которое я добавил в сообщение. Я просто хочу объединить изображения по вертикали, чтобы не объединять их.

3. Итак, ваш результат — одно изображение без осей x и y ? Я перепробовал много способов и не могу воспроизвести.

4. @Parfait Точно. это было одно изображение без осей x и y.

Ответ №1:

Использовать —

 merged_img = []
for i in range(3):
    img = io.imread('https://machinelearningblogs.com/wp-content/uploads/2018/03/849825_XL-830x400.jpg')
    merged_img.append(img)

merge = np.concatenate(merged_img)

plt.imshow(merge)
  

введите описание изображения здесь

Просто добавьте все изображения в list в for цикле после их чтения и передайте список в np.concatenate

Комментарии:

1. у меня это не сработало. « data=[] если nSpectogram <3765: для k в диапазоне (0,21): path=io.imread(‘E:\wavelet\spectrograms\paz05 \’ ‘spec_’ isPreictal ‘ ‘ str(nSpectogram 1) ‘ ‘ str(k 1) ‘.png’) im_v_array=np.array(im_v) plt.imshow(im_v, cmap=’inferno’, aspect=’auto’, interpolation=’nearest’) data.append(путь) res=np.concatenate(данные ) «

2. Я не работал со мной. Я отредактировал свой код в сообщении с вашим ответом. пожалуйста, взгляните на это.

3. @nadamedhat вы должны imshow() вывести res объект за пределы цикла. Пожалуйста, скопируйте и вставьте решение, предоставленное как есть, и проверьте; опубликуйте, чтобы соответствующим образом скорректировать свой код

4. @Vivek Kalyanarangan imshow и res находятся вне цикла. он не объединил изображения.

5. @Parfait Я имею в виду, что изображения не объединялись по вертикали, просто отображая изображение в другом виде

Ответ №2:

Вместо skimage.io (что может быть связано с проблемой версии или процессора), рассмотрите возможность использования matplotlib.pyplot.imread с пониманием списка или map . Ниже демонстрируется с двумя изображениями OP.

 import numpy as np
import matplotlib.pyplot as plt

img_paths = ["OP_Image_1.png", "OP_Image_2.png"]

data = [plt.imread(img) for img in img_paths]
# data = list(map(mpimg.imread, img_paths))

res = np.concatenate(data)
plt.imshow(res, cmap='inferno', aspect='auto', interpolation='nearest')

plt.axis('off')
plt.show()
  

Вывод графика


В частности, для итерации файлов OP:

 import os
import numpy as np
import matplotlib.pyplot as plt

...
spec_path = r"E:waveletspectrogramspaz05"                     # RAW STRING FOR BACKSLASHES
spec_file = f"spec_{isPreictal}_{str(nSpectogram 1)}_{{}}.png"   # F STRING FOR INTERPOLATION

if nSpectogram <3765:
   data = [plt.imread(os.path.join(spec_path, spec_file.format(k 1))) for k in range(21)]

   res = np.concatenate(data)
   plt.imshow(res, cmap='inferno', aspect='auto', interpolation='nearest')
   
   plt.axis('off')
   plt.savefig(os.path.join(spec_path, "Output.png"))
  

Комментарии:

1. Но у меня много изображений, не только 2. могу ли я поместить path внутрь img_paths для чтения каждого изображения на каждой итерации?

2. Смотрите расширенный ответ для вашей текущей настройки. Кроме того, избегайте печати на экране с помощью plt.show() , но сохраните в файл: plt.savefig(...) . Не уверен, зачем вам нужны 1000 объединенных изображений, которые могут превратиться в большой файл и занять некоторое время для обработки.

3. Приятно слышать и рад помочь. Счастливого кодирования!