SRGB-aware image resize in Pillow

后端 未结 3 1800
庸人自扰
庸人自扰 2021-02-15 14:06

Pillow\'s basic Image.resize function doesn\'t appear to have any options for SRGB-aware filtering. Is there a way to do SRGB-aware resizing in Pillow?

I could do it ma

3条回答
  •  [愿得一人]
    2021-02-15 14:41

    I ended up implementing sRGB-aware resize myself using the following routine. It takes an 8-bit RGB image and a target size and resampling filter.

    from PIL import Image
    import numpy as np
    
    def SRGBResize(im, size, filter):
        # Convert to numpy array of float
        arr = np.array(im, dtype=np.float32) / 255.0
        # Convert sRGB -> linear
        arr = np.where(arr <= 0.04045, arr/12.92, ((arr+0.055)/1.055)**2.4)
        # Resize using PIL
        arrOut = np.zeros((size[1], size[0], arr.shape[2]))
        for i in range(arr.shape[2]):
            chan = Image.fromarray(arr[:,:,i])
            chan = chan.resize(size, filter)
            arrOut[:,:,i] = np.array(chan).clip(0.0, 1.0)
        # Convert linear -> sRGB
        arrOut = np.where(arrOut <= 0.0031308, 12.92*arrOut, 1.055*arrOut**(1.0/2.4) - 0.055)
        # Convert to 8-bit
        arrOut = np.uint8(np.rint(arrOut * 255.0))
        # Convert back to PIL
        return Image.fromarray(arrOut)
    

提交回复
热议问题