scipy.misc.imresize改变图像的大小
发布日期:2021-06-29 11:44:28 浏览次数:3 分类:技术文章

本文共 5782 字,大约阅读时间需要 19 分钟。

scipy.misc.imresize( arr, size, interp='bilinear', mode=None)

resize an image.改变图像大小并且隐藏归一化到0-255区间的操作

参数:

arr: ndarray, the array of image to be resized

size: 只对原图的第0和第1维度的size做改变,其他维度的size保持不变。

        1)int, percentage(百分比) of current size. 整数的时候是原图像的百分比,例如7,80,160分别是原图像的百分之七,百分之八十,百分之一百六十的大小

        2)float, fraction(分数) of current size. 浮点数的时候是原图像的分数,例如0.7,1.5分别是原图像的0.7倍和1.5倍

        3)tupe, size of the output image (height,width).元组的时候是直接定义输出图像的长和宽,与原图的大小无关

interp: str, optional. interpolation(插值) to use for re-sizing('nearest', 'lanczos', 'bilinear', 'bicubic', 'cubic')。是一个可选的参数,是调整图像大小所用的插值的方法,分别有最近邻差值,Lanczos采样放缩插值,双线性插值,双三次插值,三次插值

mode: str, optional.  

以下讨论都是基于size=1.0或者size=100也就是说不改变原图像的大小的情况下。如果size不是和原图大小一样,那么先进行mode变化,再利用插值方法对size进行变化。

(1) 当arr是二维的时候arr=[h,w],可以选择'P’,'L',None:mode='L'和mode=None的结果是一样的,都是直接将原图归一化到0-255范围内(归一化的方法在下面),结果shape=[h,w];mode='P'的时候是将mode='L'的结果是将只有一个图层的二维图像变为3维图像,具体做法是三个图层是一样的,结果shape=[h,w,3]。

(2)当arr是三维的时候arr.shape=[h,w,c],必须满足一个条件,就是至少一个维度是3!!!,mode可以选择‘RGB’, None实际上这两个选择结果是一样的;1)当c=3时,结果shape=[h,w,3], 2)当c不等于3同时只有一个3的时候,shape的变化如下 [h,3,c]------[h,c,3],[3,w,c]-----[w,c,3],3)当c不等于3同时h=w=3的时候,shape变化如下[3,3,c]-------[3,c,3].  注意这里面的2)和3)因为维度改变了,会在下面讨论

(3)当arr是四维的时候:mode='RGBA'或者None,略(日后补充)

返回值: imresize: ndarray, the resized array of image

 归一化的方法:

imresize的进行大小改变之前要对原来的数据归一化成0-255区间的大小,对数据的shape不进行更改。在原来的数据中找到最大值max和最小值min,求得极值m,归一化操作y=(x-min)/m,这样就将x归一化到0-1区间,最后归一化0-255区间y*255.

举例:

import scipy.misc as smiimport numpy as npa=np.arange(24).reshape(3,8) # 2-D ndarray,all values are oderly in 0-23a1=smi.resize(a,size=1.0,mode=None) # all values are casted to 'uint32'in 0-255 rangea2=smi.resize(a,size=1.0,mode='L') # a1=a2,shape=a.shapea3=smi.resize(a,size=1.0,mode='P') # a3.shape=(3,8,3)b=np.arange(36).reshape(1,36) # 从0到35总共36个数b0=smi.resize(b,size=1.0)b1=b.reshape(2,3,6) # 3-D ndarray,shape=[h,3,c]b2=smi.resize(b1,size=1.0,mode='RGB') # mode=None也是一样的b3=b.reshape(3,2,6) # shape=[3,w,c]b4=smi.resize(b3,size=1.0,mode='RGB')b5=b.reshape(3,3,4) # shape=[3,3,c]b6=smi.resize(b5,size=1.0) # mode=None默认

二维的结果如下

a=array([[ 0,  1,  2,  3,  4,  5,  6,  7],       [ 8,  9, 10, 11, 12, 13, 14, 15],       [16, 17, 18, 19, 20, 21, 22, 23]])a1=                                                    # max=23,min=0,m=23array([[  0,  11,  22,  33,  44,  55,  67,  78],       # (x-min)*255/m       [ 89, 100, 111, 122, 133, 144, 155, 166],       # eg:78=(7-0)*255/23 四舍五入       [177, 188, 200, 211, 222, 233, 244, 255]], dtype=uint8)a2=array([[  0,  11,  22,  33,  44,  55,  67,  78],        # 和a1相同       [ 89, 100, 111, 122, 133, 144, 155, 166],       [177, 188, 200, 211, 222, 233, 244, 255]], dtype=uint8)a3=array([[[  0,   0,   0],               # shape=[h,w,3],三层一模一样        [ 11,  11,  11],        [ 22,  22,  22],        [ 33,  33,  33],        [ 44,  44,  44],        [ 55,  55,  55],        [ 67,  67,  67],        [ 78,  78,  78]],       [[ 89,  89,  89],        [100, 100, 100],        [111, 111, 111],        [122, 122, 122],        [133, 133, 133],        [144, 144, 144],        [155, 155, 155],        [166, 166, 166]],       [[177, 177, 177],        [188, 188, 188],        [200, 200, 200],        [211, 211, 211],        [222, 222, 222],        [233, 233, 233],        [244, 244, 244],        [255, 255, 255]]], dtype=uint8)

三维的结果如下

b=array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,        17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,        34, 35]])b0=      # 这样就可以看到归一化的值的一一对应了array([[  0,   7,  15,  22,  29,  36,  44,  51,  58,  66,  73,  80,  87,         95, 102, 109, 117, 124, 131, 138, 146, 153, 160, 168, 175, 182,        189, 197, 204, 211, 219, 226, 233, 240, 248, 255]], dtype=uint8)b1=                                            array([[[ 0,  1,  2,  3,  4,  5],       # b1.shape=[h,3,c]=[2,3,6]        [ 6,  7,  8,  9, 10, 11],        [12, 13, 14, 15, 16, 17]],       [[18, 19, 20, 21, 22, 23],        [24, 25, 26, 27, 28, 29],        [30, 31, 32, 33, 34, 35]]])b2=                                    # b2.shape=[h,c,3]=[2,6,3]array([[[  0,  44,  87],        [  7,  51,  95],        [ 15,  58, 102],        [ 22,  66, 109],        [ 29,  73, 117],        [ 36,  80, 124]],       [[131, 175, 219],        [138, 182, 226],        [146, 189, 233],        [153, 197, 240],        [160, 204, 248],        [168, 211, 255]]], dtype=uint8)b3=                                    # b3.shape=[3,w,c]=[3,2,6]array([[[ 0,  1,  2,  3,  4,  5],        [ 6,  7,  8,  9, 10, 11]],       [[12, 13, 14, 15, 16, 17],        [18, 19, 20, 21, 22, 23]],       [[24, 25, 26, 27, 28, 29],        [30, 31, 32, 33, 34, 35]]])b4=                                     # b4.shape=[w,c,3]=[2,6,3]array([[[  0,  87, 175],        [  7,  95, 182],        [ 15, 102, 189],        [ 22, 109, 197],        [ 29, 117, 204],        [ 36, 124, 211]],       [[ 44, 131, 219],        [ 51, 138, 226],        [ 58, 146, 233],        [ 66, 153, 240],        [ 73, 160, 248],        [ 80, 168, 255]]], dtype=uint8)b5=                                     # b5.shape=[3,3,c]=[3,3,4]array([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]],       [[12, 13, 14, 15],        [16, 17, 18, 19],        [20, 21, 22, 23]],       [[24, 25, 26, 27],        [28, 29, 30, 31],        [32, 33, 34, 35]]])b6=                                      # b6.shape=[3,c,3]=[3,4,3]array([[[  0,  87, 175],        [  7,  95, 182],        [ 15, 102, 189],        [ 22, 109, 197]],       [[ 29, 117, 204],        [ 36, 124, 211],        [ 44, 131, 219],        [ 51, 138, 226]],       [[ 58, 146, 233],        [ 66, 153, 240],        [ 73, 160, 248],        [ 80, 168, 255]]], dtype=uint8)

那么问题来了,如果要对特征图而不是图像操作,特征图的[h,w,c]里面的维度没有任何的要求,可能一个3也没有。现在要求resize之后为[h',w',c]也就是说c不变,只要求原图的h和w进行变化,那该怎么办呢?该用哪个函数呢?如果有谁知道的话,请留言相告,谢谢!

转载地址:https://blog.csdn.net/zz2230633069/article/details/82391597 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:np.all的实例应用
下一篇:Prepare the data

发表评论

最新留言

不错!
[***.144.177.141]2024年04月28日 00时01分21秒