使用skimage库调整图片大小而不拉伸

6

嘿,我想要调整图像的大小而不拉伸它,而是添加白色像素。我查找了一些资料,但没有发现在skimage内部如何实现这个目标的说明。因此,我使用numpy将额外的像素作为[float(255)]数组添加到缩放之前。

from skimage.io import imread
from skimage.io import imsave
from skimage.transform import resize
from matplotlib import pyplot as plt
from pylab import cm
import numpy as np
from skimage import morphology
from skimage import measure
from scipy import misc
def process(file_):
    im = imread(file_, as_grey=True)
    #im = misc.imread(file_)
    #im=np.fromfile(file_, dtype=np.int64)

    #Filler to avoid stretching
    orig_rows, orig_cols = im.shape
    print orig_rows, orig_cols
    if orig_rows < orig_cols:
        for addition in range(0,orig_cols-orig_rows):
            #adding white rows
            lst = np.array(list(float(255) for x in range(0,orig_cols)))
            im= np.vstack((im,lst))
    if orig_rows > orig_cols:
        for addition in range(0,orig_rows-orig_cols):
            #adding white columns
            lst = np.array(list([float(255)] for x in range(0,orig_rows)))
            im= np.hstack((im,lst))
    image = resize(im, (48, 48))
    imsave('test.jpg',im)
    imsave('test1.jpg',image)
    plt.imshow(im, cmap=cm.gray)
    plt.show()

当我使用pyplot查看图像时,它看起来像这样: numpy连接后的图像 原始图像 我们可以看到列已经被添加了,但是当我保存图像时,

image = resize(im, (48, 48))
    imsave('test.jpg',im)
    imsave('test1.jpg',image)

图片看起来像是底片,缩放后的图片完全变成了白色(在网站背景上与黑色相比几乎无法看到)。有什么想法吗?

当我尝试您的代码时,我没有遇到这个问题。您能否提供更多信息(Python版本、操作系统等)? - IronManMark20
@IronManMark20 Python 2.7,Linux Kali,AMD64。 那么你得到了预期的图像吗? - Evan
是的,我在Windows 8.1上使用Python 2.7.8 amd64进行了操作。两个保存的图像都是黑色背景白色前景。你尝试过升级skimage吗? - IronManMark20
你可以使用numpy.pad函数。 - David Dao
1个回答

1
下面的代码应该可以工作。请注意,填充区域的颜色不是纯白色,以便在上传的图像中看到图像边界。要设置白色填充,请将 fill_cval = np.max(img)
def resize_padded(img, new_shape, fill_cval=None, order=1):
    import numpy as np
    from skimage.transform import resize
    if fill_cval is None:
        fill_cval = np.max(img)
    ratio = np.min([n / i for n, i in zip(new_shape, img.shape)])
    interm_shape = np.rint([s * ratio for s in img.shape]).astype(np.int)
    interm_img = resize(img, interm_shape, order=order, cval=fill_cval)

    new_img = np.empty(new_shape, dtype=interm_img.dtype)
    new_img.fill(fill_cval)

    pad = [(n - s) >> 1 for n, s in zip(new_shape, interm_shape)]
    new_img[[slice(p, -p, None) if 0 != p else slice(None, None, None) 
             for p in pad]] = interm_img

    return new_img

import numpy as np
import matplotlib.pylab as plt
from skimage.data import astronaut
from skimage.color import rgb2gray  # using luminance
from skimage.io import imsave
img = rgb2gray(astronaut())

# set desired image size
out_size = (30, 100)  # height, width

# set the color of the padded area. Here: "95% luminance"
fill_cval = np.max(img) * 0.95

resized_img = resize_padded(img, out_size, fill_cval=fill_cval)

imsave('img.png', img)
imsave('img_res.png', resized_img)

enter image description here


注意:如果遇到奇数大小的图像出现问题,请考虑使用 interm_shape = np.ceil([s * ratio for s in img.shape]).astype(np.int) 而不是 interm_shape = np.rint([s * ratio for s in img.shape]).astype(np.int) - mab

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