(二) 基本操作 - 图片的拉伸与缩放

图片缩放用到的主要函数是:cv2.resize, 它最简单的形式如下:

cv2.resize(img, (new_width, new_height))

其中,img为源图片,new_width, new_height 为缩放后的宽度和高度,函数返回缩放后的图片。具体用法如下面的例子。

示例1

import cv2

# 读取图片
img = cv2.imread("lenna.jpg")
# 显示图片
cv2.imshow("img-org", img)
cv2.imshow("400x200", cv2.resize(img, (400, 200)))
cv2.imshow("250x400", cv2.resize(img, (250, 400)))
# 按任意键退出图片显示
cv2.waitKey()

其中,先读取图片,然后分别显示:原图,缩放到400*200的图片和缩放的250*400的图片,程序显示结果如下图:

其中,左上角是原图,右上角是缩放到400*200的图片,右下角缩放的250*400的图片。这个还是挺简单的,不是吗 :-)

示例2

很多时候,我们需要在缩放图片的时候保持图片的长宽比,于是有了下面的例子。

import cv2

def scale_image(image, scale):
    width = int(image.shape[1] * scale)
    height = int(image.shape[0] * scale)
    return cv2.resize(image, (width, height))
    
# 读取图片
img = cv2.imread("lenna.jpg")
# 显示图片
cv2.imshow("img-org", img)
cv2.imshow("img-scale-0.8", scale_image(img,0.8))
cv2.imshow("img-scale-2", scale_image(img,2))
# 按任意键退出图片显示
cv2.waitKey()

这里,定义了一个函数 scale_image , 其参数image为源图片,scale 代表缩放因子,可以取大于0的浮点数。(没有做入口参数的检查,不够鲁棒,你懂的!)

接下来的代码也是先读取图片,然后分别显示:原图,缩放0.8倍的图片和缩放2倍的图片,程序显示结果如下图

其中,左上角还是原图,左下角是缩放到0.8倍的图片,右边是缩放的2倍的图片。恩,还是保持长宽比的图片比较好看。

示例3

有时候,我们要把限制图片的长宽在一定范围内,比如长宽都不能超过300个像素,同时我们希望保持图片的长宽比,于是有了下面的例子。

import cv2

def scale_image(image, scale):
    width = int(image.shape[1] * scale)
    height = int(image.shape[0] * scale)
    return cv2.resize(image, (width, height))
    
def shrink_image(image, max_size):
    # 比较长度和宽度,取最大值
    length = image.shape[0]
    if length < image.shape[1]:
        length = image.shape[1]
    if length < max_size:
        return image
    else:
        scale = max_size/(length*1.0)
        return scale_image(image, scale)

# 读取图片
img_narrow = cv2.imread("narrow.jpg")
img_wide = cv2.imread("wide.jpg")
# 显示图片
cv2.imshow("n-org", img_narrow)
cv2.imshow("n-shrink",shrink_image(img_narrow,300))
cv2.imshow("w-org", img_wide)
cv2.imshow("w-shrink",shrink_image(img_wide,300))
# 按任意键退出图片显示
cv2.waitKey()

这里新定义了一个shrink_image 函数, 参数image是源图片, max_size是最大尺寸(同时限定宽度和高度)。

接下来的代码读取两张图片,一张宽图,一张窄图,然后分别显示:原图,已经缩小后的图片,它们的长和宽都不超过300个像素,程序显示结果如下图

 其中,左上角是窄图片的原图,右上角是宽图片的原图,它们的下方分别是高度和宽度被限定到300像素以内的图片。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值