Как изменить исправления, сделанные patchify?

#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!