#python #opencv #image-processing
Вопрос:
Я использую библиотеку patchify для исправления большого изображения:
img = cv2.imread("resized.jpg")
patches_img = patchify(img, (224,224,3), step=224)
print(patches_img.shape)
Затем я сохраняю патчи:
for i in range(patches_img.shape[0]):
for j in range(patches_img.shape[1]):
single_patch_img = patches_img[i, j, 0, :, :, :]
if not cv2.imwrite('patches/images/' 'image_' '_' str(i) str(j) '.jpg', single_patch_img):
raise Exception("Could not write the image")
Затем я хочу внести некоторые изменения в любой из этих патчей, например, нарисовать ограничительные рамки, поэтому, когда я использую unpatchify для объединения патчей, ограничительные рамки будут отображаться на восстановленном изображении.
После внесения изменений я выполняю следующий код, чтобы снова объединить исправления:
reconstructed_image = unpatchify(patches_img, img.shape)
cv2.imwrite("unpatched.jpg", reconstructed_image)
Но сгенерированное восстановленное изображение совпадает с исходным, без видимых изменений.
Я предполагаю, что это связано с тем, что unpatchify считывает переменную patches_img, в которой все еще хранятся оригинальные, неизмененные патчи.
Я попробовал следующее:
patches = 'patches/images/*.jpg'
reconstructed_image = unpatchify(patches, img.shape)
cv2.imwrite("unpatched.jpg", reconstructed_image)
Но я получаю ошибку атрибута: объект » str «не имеет атрибута «форма»
Спасибо тебе!
Комментарии:
1. Вам не нужно сохранять и загружать изображения, чтобы рисовать флажки (если только ваши рисунки не находятся за пределами скрипта Python). Не могли бы вы, пожалуйста, показать пример рисунка?
2. Что касается второй части: первым аргументом для распаковки должен быть массив NumPy, такой как patches_img, а не строка.
3. Спасибо за ваш ответ @Rotem . По сути, я буду использовать patchify для целей обнаружения объектов. Таким образом, конвейер будет следующим: сначала я исправляю изображение, в котором хочу обнаружить объекты, затем я передаю каждое из этих исправлений в свою обученную модель для вывода и рисования ограничивающих рамок, затем я сохраняю каждое выведенное исправление с помощью b.полей, а затем я хочу использовать unpatchify для объединения исправлений в исходное изображение, но с уже имеющимися b.полями.
4. Неплохо… В следующий раз, пожалуйста, опубликуйте ссылку на исходное сообщение, когда вы публикуете «последующее» сообщение. Пожалуйста, добавьте тег python .
Ответ №1:
Для восстановления изображения мы должны прочитать изображения одно за другим и поместить каждое изображение в исходное положение исправления.
Например, в именовании файлов была ошибка:
i = 1
и j = 11
имеет то же имя, i = 11
что и j = 1
( 'image__111.jpg'
).
Лучшее имя файла:
cv2.imwrite('patches/images/' 'image_' '_' str(i).zfill(2) '_' str(j).zfill(2) '.png', single_patch_img)
Примечание:
- Я изменил формат файла изображения с JPEG на PNG, чтобы сохранить исходное качество изображения.
JPEG-это формат изображения без потерь, поэтому при каждом хранении и загрузке мы теряем некоторое качество.
Предлагаемое решение для реконструкции:
- Читайте
test.jpg
только для того, чтобы получить форму (изimg
)
img = cv2.imread("test.jpg")
img = np.zeros_like(img) # Fill with zeros for the example (start from an empty image).
- Используйте patchify только для получения формы (из
patches
)
patches = patchify(img, (224,224,3), step=224) # We could have also used: patches = np.zeros((14, 18, 1, 224, 224, 3), np.uint8)
- Прочитайте изображения и поместите их в исходное положение в
patches
:
for i in range(patches.shape[0]):
for j in range(patches.shape[1]):
single_patch_img = cv2.imread('patches/images/' 'image_' '_' str(i).zfill(2) '_' str(j).zfill(2) '.png') # Read a patch image.
if single_patch_img is None:
raise Exception("Could not read the image")
patches[i, j, 0, :, :, :] = single_patch_img.copy() # Copy single path image to patches
- распаковка
reconstructed_image = unpatchify(patches, img.shape)
Вот полный пример кода, который исправляет, сохраняет исправления, загружает исправления и отменяет их:
import cv2
import numpy as np
from patchify import patchify, unpatchify
img = cv2.imread("test.jpg")
patches_img = patchify(img, (224,224,3), step=224) # patches_img.shape = (14, 18, 1, 224, 224, 3)
for i in range(patches_img.shape[0]):
for j in range(patches_img.shape[1]):
single_patch_img = patches_img[i, j, 0, :, :, :]
cv2.rectangle(single_patch_img, (30, 30), (224-30, 224-30), (0, 255, 0), 3) # Draw something (for testing).
if not cv2.imwrite('patches/images/' 'image_' '_' str(i).zfill(2) '_' str(j).zfill(2) '.png', single_patch_img): # Save as PNG, not JPEG for keeping the quality.
raise Exception("Could not write the image")
# Store an unpatchified reference for testing
cv2.imwrite("unpatched_ref.jpg", unpatchify(patches_img, img.shape))
# Unpatchify
################################################################################
# Allocate sapces for storing the patches
img = cv2.imread("test.jpg") # Read test.jpg just for getting the shape
img = np.zeros_like(img) # Fill with zeros for the example (start from an empty image).
# Use patchify just for getting the size. shape = (14, 18, 1, 224, 224, 3)
# We could have also used: patches = np.zeros((14, 18, 1, 224, 224, 3), np.uint8)
patches = patchify(img, (224,224,3), step=224)
for i in range(patches.shape[0]):
for j in range(patches.shape[1]):
single_patch_img = cv2.imread('patches/images/' 'image_' '_' str(i).zfill(2) '_' str(j).zfill(2) '.png') # Read a patch image.
if single_patch_img is None:
raise Exception("Could not read the image")
patches[i, j, 0, :, :, :] = single_patch_img.copy() # Copy single path image to patches
reconstructed_image = unpatchify(patches, img.shape)
cv2.imwrite("unpatched.jpg", reconstructed_image)
Комментарии:
1. Абсолютно гениальный @Rotem. Теперь это работает отлично, большое вам спасибо, вы мне очень помогли!! И да, спасибо за совет по размещению ссылки на оригинальное сообщение и тега python!