如何使用Python调整图像大小而不添加噪点?

5
我有一张图片,想要调整大小并扩展它,但不想破坏原始图片的质量。
图片:

Image work

图片尺寸:
  • 宽度=41
  • 高度=43
我想要调整后的图片尺寸:
  • 宽度=2000
  • 高度=2100
我尝试了所有已知的方法:
  1. with PIL.Image:
    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. with 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


这取决于您想要最终图像的外观。如果您希望保留其像素化,则cv2.INTER_NEAREST可能是最佳选择。在现有像素之间进行插值的所有方法都会创建一些伪影,尤其是在您尝试的比例下。 - BHawk
3个回答

6
不要使用ANTIALIAS滤镜。为了保留边缘的锐利度,只需使用NEAREST滤镜即可。如果没有传递参数到Image.resizeresample参数,则默认使用此滤镜。
img = img.resize((w, h))

这将会得到预期的结果

预期结果


1

如果您使用Pillow,那么NEAREST不是默认选项,因此您需要使用以下代码:img = img.resize((w, h), PIL.Image.NEAREST) - hsarret

-1

我创建了一个简单的函数,请给我你的意见。

这个函数是:

 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接