前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV的resize方法与双线性插值

OpenCV的resize方法与双线性插值

作者头像
用户1332428
发布2018-07-30 15:33:13
2.4K0
发布2018-07-30 15:33:13
举报
文章被收录于专栏:人工智能LeadAI

正文共1328个字,3张图,预计阅读时间6分钟。

训练Object Detection模型SSD完毕之后进入test阶段,每张图像在进入输入层之前需要进行resize操作,以满足CNN模型对输入层size的要求。本文首先介绍了Caffe实现的SSD模型对输入图像的变换规定,引出了OpenCV中的resize方法,最后介绍该方法中的插值参数cv.INTER_LINEAR和该插值方法的原理。

caffe_ssd

caffe_ssd在test阶段,对图像的变换设置如下:

代码语言:javascript
复制
 1test_transform_param = {
 2'mean_value': [104, 117, 123],
 3'force_color': True,
 4'resize_param': {
 5        'prob': 1,
 6        'resize_mode': P.Resize.WARP,
 7        'height': resize_height,
 8        'width': resize_width,
 9        'interp_mode': [P.Resize.LINEAR],
10        },
11}

以上设定来自ssd_coco.py。

1、'mean_value': [104, 117, 123]是ImageNet图像BGR三个通道的均值。每张图像分别需要减去相应通道的均值,实现中心化。

2、'force_color': True强制采用彩色BGR图像模式,防止灰度图像维度与SSD模型输入层维度不一致。

3、resize_param属性在caffe.proto的ResizeParameter中有说明。

代码语言:javascript
复制
 1// Message that stores parameters used by data transformer for resize policy
 2message ResizeParameter {
 3//Probability of using this resize policy
 4optional float prob = 1 [default = 1];
 5enum Resize_mode {
 6WARP = 1;
 7FIT_SMALL_SIZE = 2;
 8FIT_LARGE_SIZE_AND_PAD = 3;
 9}
10optional Resize_mode resize_mode = 2 [default = WARP];
11optional uint32 height = 3 [default = 0];
12optional uint32 width = 4 [default = 0];
13// A parameter used to update bbox in FIT_SMALL_SIZE mode.
14optional uint32 height_scale = 8 [default = 0];
15optional uint32 width_scale = 9 [default = 0];
16enum Pad_mode {
17CONSTANT = 1;
18MIRRORED = 2;
19REPEAT_NEAREST = 3;
20}
21// Padding mode for BE_SMALL_SIZE_AND_PAD mode and object centering
22optional Pad_mode pad_mode = 5 [default = CONSTANT];
23// if specified can be repeated once (would fill all the channels)
24// or can be repeated the same number of times as channels
25// (would use it them to the corresponding channel)
26repeated float pad_value = 6;
27enum Interp_mode { //Same as in OpenCV
28LINEAR = 1;
29AREA = 2;
30NEAREST = 3;
31CUBIC = 4;
32LANCZOS4 = 5;
33 }
34//interpolation for for resizing
35repeated Interp_mode interp_mode = 7;
36}

其中的interp_mode采用LINEAR模式对图像进行Resize操作,与Opencv中的resize一致。

接下来,我们具体介绍一下OpenCV中的resize方法。

resize方法的签名

代码语言:javascript
复制
 1C++:   
 2void cv::resize (InputArray src,
 3OutputArray             dst,
 4Size                      dsize,
 5double                  fx = 0,
 6double                  fy = 0,
 7int                       interpolation = INTER_LINEAR
 8)       
 9Python:   
10dst =   cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

参数说明:

代码语言:javascript
复制
 1src 输入图像.
 2dst 输出图像; 其size为dsize,或由src.size()、fx与fy计算而得; dst类型与src保持一致.   
 3dsize 输出图像的size; 如果设为0,或(0, 0), 计算方式为:
 4????? = ????(?????(??*???.????), ?????(??*???.????))
 5dsize和(fx, fy)必须有一组不为0. 如果都为0,无法确定被resize后的图像大小
 6fx  水平轴缩放因子; 等于0时,计算方式为:
 7(??????)?????.?????/???.????
 8fy  竖直轴缩放因子; 等于0时,计算方式为:
 9(??????)?????.??????/???.????
10interpolation   差值方法, 方法见InterpolationFlags

InterpolationFlags

缩小图像时,一般INTER_AREA插值效果较好。放大图像时, INTER_CUBIC (slow)更好些,或INTER_LINEAR (faster but still looks OK)。

Resize Image Example

代码语言:javascript
复制
1import cv2 as cv
2img = cv.imread('./lena.jpg')
3h, w = img.shape[:2]
4# 缩小图像到原来一半大小,方法一,设置dsize
5dst = cv.resize(img, (h//2, w//2), None, 0, 0, cv.INTER_LINEAR)
6cv.imwrite('./lena1.jpg', dst)
7# 缩小图像到原来一半大小,方法二,设置fx和fy
8dst = cv.resize(src=img, dsize=None, fx=0.5, fy=0.5, interpolation=cv.INTER_LINEAR)
9cv.imwrite('./lena2.jpg', dst)

cn.INTER_LINEAR的原理

resize方法提供了9种插值参数,Caffe中支持的5种分别是

  • 最近邻插值法 cv.INTER_NEAREST
  • 双线性插值法 cv.INTER_LINEAR
  • 双三次插值法 cv.INTER_CUBIC
  • 区域插值法 cv.INTER_AREA
  • 兰索斯插值法 cv.INTER_LANCZOS4

下面具体介绍一下双线性插值法,这种插值方法最易于理解,也应用最多。

首先,在x轴方向进行线性插值:蓝色点得到绿色点

x轴方向线性插值

然后,在y轴方向进行线性插值:绿色点得到橙色点

y轴方向线性插值

最后,简化为矩阵变换的形式:

双线性插值的矩阵变换表达

原文链接:https://www.jianshu.com/p/cc6407444a8c

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能LeadAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档