#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. Приятно слышать и рад помочь. Счастливого кодирования!