5.1 缩放cv2.resize()

在 OpencV中,使用函数 cv2.resize() 实现对图像的缩放,该函数的具体形式为

dst = cv2.resize(src,dsize[,fx[,fy[,interpolation]]])

式中

dst 代表输出的目标图像,该图像的类型与 src相同,其大小为 dsize(当该值非零时), 或者可以通过 src.size()、fx、fy 计算得到

src代表需要缩放的原始图像

dsize代表输出图像大小

fx代表水平方向的缩放比例

fy代表垂直方向的缩放比例。

interpolation 代表插值方式

具体如表

序号 类型 说明
1 cv2.INTER_NEAREST 最近邻插值
2 cv2.INTER_LINEAR 双线性插值(默认设置)
3 cv2.INTER_CUBIC 三次样条插值,首先对源图像附近的 4×4 近邻区域进行三次样条拟合,然后将目标像素对应的三次样条值作为目标图像对应像素点的值
4 cv2.INTER_AREA 区域插值,根据当前像素点边区域的像素实现当前像素点的采样,该方法类似最临近插值方式
5 cv2.INTER_LANCZOS4 一种使用 8* 8近邻的lanczos插值方法
6 cv2.INTER_LINEAR_EXACT 位精度双线性插值
7 cv2.WARP_FILL_OUTLIERS 标志,填补目标图像中的所有像素,如果它们中的一些对应源图像中的奇异点(离群值)则将它们设置为零
8 cv2.WARP_INVERSE_MAP 标志,逆变换

在 cv2.resize() 函数中,目标图像的大小可以通过“参数 dsize ”或者“参数fx 和fy ”二者之一来指定,具体介绍如下

情况 1:通过参数 dsize 指定

如果指定参数 dsize 的值,则无论是否指定了参数fx 和 fy 的值,都由参数 dsize 来决定目标图像的大小

此时需要注意的是, dsize 内第1 个参数对应缩放后图像的宽度(width,即列数 cols,与参数fx相关),第2 个参数对应缩放后图像的高度(height,即行数 rows,与参数fy相关)

指定参数 dsize 的值时,x 方向的缩放大小(参数 fx)为:

(double) dsize.width/src.cols

同时,y 方向的缩放大小(参数 fy)为:

(double) dsize.height/src.rows

情况 2:通过参数fx 和fy 指定

如果参数 dsize 的值是 None,那么目标图像的大小通过参数 fx 和fy 来决定,此时,目标 图像的大小为:

dsize = Size(round(fxsrc.cols), round(fysrc.rows))

插值是指在对图像进行几何处理时,给无法直接通过映射得到值的像素点赋值。例如,将图像放大为原来的2倍,必然会多出一些无法被直接映射值的像素点,对于这些像素点,插值方式决定了如何确定它们的值。除此以外,还会存在一些非整数的映射值,例如,反向映射可能会把目标图像中的像素点值映射到原始图像中的非整数值对应的位置上,当然原始图像内是不可能存在这样的非整数位置的,即目标图像上的该像素点不能对应到原始图像的某个具体位置上,此时也要对这些像素点进行插值处理,以完成映射

通数 cv2.resize()能实现对原始图像的缩放功能,需要注意的是,开始运算前,操作前的目标图像dst 自身的大小、类型与最终得到的目标图像是没有任何关系的,目标图像 dst 的最终大小和类型是通过 src、dsize 、fx、fy 指定的。如果想让原始图像调整为和目标图像一样大,得必须通过上述属性指定

当缩小图像时,使用区域插值方式( INTER_AREA)能够得到最好的效果,当放大图像时,使用三次样条插值( INTER_CUBIC)方式和双线性插值( INTER_LINEAR)方式都能够取得较好的效果。三次择条插值方式速度较慢。双线性插值方式速度相对较快且效果并不逊色

【例 51】设计程序,使用函数 cv2.resize() 对一个数组进行简单缩放

为了方便观察,这里我们尝试直接通过函数 cv2.resize() 来生成一个与原始数组等大小的数组

import cv2
import numpy as np
img=np.ones([2,4,3],dtype=np.uint8)
size=img.shape[:2]
rst=cv2.resize(img,size)
print("img.shape=\n",img.shape)
print("img=\n",img)
print("rst.shape=\n",rst.shape)
print("rst=\n",rst)
'''

在本例中,我们期望通过cv2.resize() 对原始图像进行缩放

img.shape=
(2, 4, 3)
img=
[[[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]]

[[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]]]
rst.shape=
(4, 2, 3)
rst=
[[[1 1 1]
[1 1 1]]

[[1 1 1]
[1 1 1]]

[[1 1 1]
[1 1 1]]

[[1 1 1]
[1 1 1]]]

通过程序我们观察到,我们的目的没有达到,目标图像的大小与原始图像的大小并不一致,原始图像的大小是2行4列,目标图像的大小是4行2列
1.目标图像的行数是原始图像的列数
2.目标图像的列数是原始图像的行数

通过以上例题我们进一步确认:函数 cv2.resize()内 dsize 参数与图像 shape,属性在行,列的上是不一致的,或者说

1.在 shape 属性中,第1 个值对应的是行数,第2 个值对应的是列数
2.在 dsize 参数中,第1 个值对应的是列数,第2 个值对应的是行数

我们通常使用等大小的图像进行测试,在这种情况下,可能无法发现 cv2.resize() 函数内数的具体使用方式

在使用cv2.resize() 函数时,要额外注意参数 dsize 的属性顺序问题

【例 5.2】设计程序,使用函数 cv2.resize() 完成一个简单的图像缩放
根据题目要求,设计程序如下:

import cv2
img=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\test.bmp")
rows,cols=img.shape[:2]
size=(int(cols*0.9),int(rows*0.5))
rst=cv2.resize(img,size)
print("img.shape=",img.shape)
print("rst.shape=",rst.shape)

运行结果:
img.shape= (512, 51, 3)
rst.shape= (256, 45, 3)

从程序可以看出:
1.列数变为原来的 0.9倍,计算得到 51×09=45.9,取整得到 45
2.行数变为原来的 0.5倍,计算得到 512×0.5=256

【例 5.3】设计程序,控制函数 cv2.resize的fx 参数、fy 参数,完成图像缩放

根据题目要求,设计程序如下:

import cv2
img=cv2.imread("test.bmp")
rst=cv2.resize(img,None,fx=2,fy=0.5)
print("img.shape=",img.shape)
print("rst.shape=",rst.shape)

从程序可以看出:
1.fx进行的是水平方向的缩放,将列数变为原来的2倍,得到 51×2=102
2.fy进行的是垂度方向的缩放,将行数变为来的 0.5 倍。得到 512×0.5=256

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容