img = cv2.imread(img_path,cv2.IMREAD_COLOR)
def resize(self, img, height, width, centerCrop=True, interp='bilinear'):
imgh, imgw = img.shape[0:2]
if centerCrop and imgh != imgw:
# center crop
side = np.minimum(imgh, imgw)
j = (imgh - side) // 2
i = (imgw - side) // 2
img = img[j:j + side, i:i + side, ...]
# 改变图像大小并且隐藏归一化到0-255区间的操作
img = scipy.misc.imresize(img, [height, width], interp=interp)
return img
scipy.misc.imresize( arr, size, interp=‘bilinear’, mode=None)
改变图像大小并且隐藏归一化到0-255区间的操作
参数:
-
arr: ndarray, the array of image to be resized
-
size: 只对原图的第0和第1维度(h*w)的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],mode可以选择’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实际上这两个选择结果是一样的;
a. 当c=3时,结果shape=[h,w,3],
b. 当c不等于3同时只有一个3的时候,shape的变化如下 [h,3,c]------[h,c,3],[3,w,c]-----[w,c,3],
c.当c不等于3同时h=w=3的时候,shape变化如下[3,3,c]-------[3,c,3].
(3)当arr是四维的时候:mode='RGBA’或者None,略(日后补充)
- 返回值: imresize: ndarray, the resized array of image
归一化的方法:
x先归一化到0-1区间得y1,再扩充到0-255区间(y2=y1*255)
imresize的进行大小改变之前要对原来的数据归一化成0-255区间的大小,对数据的shape不进行更改。在原来的数据中找到最大值max和最小值min,求得极值m,归一化操作y=(x-min)/m,这样就将x归一化到0-1区间,最后归一化0-255区间y*255.