Как изменить размер изображения без добавления шума с python? - PullRequest
0 голосов
/ 15 января 2020

У меня есть изображение, и я хочу изменить его размер и расширить, не портя его.

Изображение:

Image work

Размер изображения:

  • w = 41
  • h = 43

Размер изображения, к которому я хочу изменить размер:

  • ш = 2000х
  • ч = 2100

Я испробовал все известные методы:

  1. с PIL. Изображение:
    from PIL import Image
    path = "image.png"
    w, h = 2000, 2100
    img = Image.open(path)
    img = img.resize((w, h), Image.ANTIALIAS)
    img.save("re_image.png", "PNG")
    
  2. с cv2:
    import cv2
    path = "image.png"
    w, h = 2000, 2100
    img = cv2.imread(path)
    img = cv2.resize(img, (w, h), interpolation = cv2.INTER_AREA)
    cv2.imwrite("re_image.png", img)
    

Результат:

Result Image

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Не используйте фильтр ANTIALIAS. Поскольку вы хотите сохранить четкость краев, просто используйте фильтр NEAREST. Этот фильтр используется по умолчанию, если аргумент resample параметра Image.resize

img = img.resize((w, h))

не передан в качестве аргумента. Это дает ожидаемый результат

Expected Result

0 голосов
/ 15 января 2020

Я создал простую функцию. Пожалуйста, дайте мне свое мнение.

Функция:

 import cv2, numpy as np

 def resize(path, sizes = (500, 800)):
         nw, nh = sizes
         g_img = cv2.imread(path)

         gw, gh = g_img.shape[0], g_img.shape[1]
         nw, nh = gw+510, gh+510
         pw, ph = int(nw/gw), int(nh/gh)
         if (pw == 0):pw = 1
         if (ph == 0):ph = 1
         nw, nh = pw*gw, ph*gh

         cvimg = np.zeros((nh,nw,3), np.uint8)

         for gy in range(gh):
             y, h = gy*ph, (gy*ph)+ph
             for gx in range(gw):
                 x, w = gx*pw, (gx*pw)+pw
                 cvimg[y:h, x:w] = g_img[gy:gy+1, gx:gx+1]

         nsize = [nw, nh]
         return cvimg, nsize

Результат:

Result

0 голосов
/ 15 января 2020

Для вашего конкретного случая c, который является двоичным изображением, я думаю, что вы хотите, чтобы края были резкими. Тогда я бы предложил использовать флаг cv2.INTER_NEAREST в вашей реализации openCV. Вы можете проверить влияние различных типов интерполяции, приведенных в документации: https://docs.opencv.org/4.1.1/da/d54/group__imgproc__transform.html

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...