【Python】实现等比例缩放图片,自写的小函数

本文介绍了一种使用OpenCV将图片等比例缩放到特定尺寸(如512x512)的方法。根据图片原始尺寸的不同,采取不同的处理策略:若宽度大于高度,则从中截取;若宽度小于高度,则在两侧填充黑色。适用于图像预处理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python等比例缩放图片

使用了 OpenCV 进行图片的读取
输入:利用 cv2.imread 函数读取的 Mat 矩阵
输出:缩放后的 Mat 矩阵(示例代码为缩放到 512x512 大小,也可自行设定大小)

待处理图片分为两种类型:宽 > 高(Width > Height) 或 宽 < 高(Width < Height)

若是 宽 > 高:
那么缩放后多余出来的宽度,从中间截取 512 个像素。
若是 宽 < 高:
那么缩放后宽度不够,两侧填充黑色补齐到宽为 512 个像素。

示例代码:

def imgToSize(img):
    ''' imgToSize()
    # ----------------------------------------
    # Function:   将图像等比例缩放到 512x512 大小
    #             根据图像长宽不同分为两种缩放方式
    # Param img:  图像 Mat
    # Return img: 返回缩放后的图片
    # Example:    img = imgToSize(img)
    # ----------------------------------------
    '''
    # 测试点
    # cv2.imshow('metaImg.jpg', img)

    imgHeight, imgWidth = img.shape[:2]

    # cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
    # src 原图像,dsize 输出图像的大小,
    # img = cv2.resize(img, (512,512))
    zoomHeight = 512
    zoomWidth = int(imgWidth*512/imgHeight)
    img = cv2.resize(img, (zoomWidth,zoomHeight))

    # 测试点
    # cv2.imshow('resizeImg', img)

    # 如果图片属于 Width<Height,那么宽度将达不到 512
    if imgWidth >= imgHeight:
        # 正常截取图像
        w1 = (zoomWidth-512)//2
        # 图像坐标为先 Height,后 Width
        img = img[0:512, w1:w1+512]
    else:
        # 如果宽度小于 512,那么对两侧边界填充为全黑色
        # 根据图像的边界的像素值,向外扩充图片,每个方向扩充50个像素,常数填充:
        # dst = cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]])
        # dst = cv2.copyMakeBorder(img,50,50,50,50, cv2.BORDER_CONSTANT,value=[0,255,0])
        # 需要填充的宽度为 512-zoomWidth
        left = (512-zoomWidth)//2
        # 避免余数取不到
        right = left+1
        img = cv2.copyMakeBorder(img, 0,0,left,right, cv2.BORDER_CONSTANT, value=[0,0,0])
        img = img[0:512, 0:512]

    # 测试点
    # cv2.imshow('size512', img)

    return img
### 使用 Pillow 和 OpenCV 实现等比例缩放图片 #### 使用 Pillow 库实现等比例缩放图片尺寸 为了确保图片在调整大小时不发生变形或失真,可以通过计算原始宽度和高度的比例来保持宽高比。下面展示了如何利用 `Pillow` 库中的方法完成这一目标。 ```python from PIL import Image def resize_image_pillow(input_path, output_path, size): with Image.open(input_path) as img: original_width, original_height = img.size # 计算新的宽度和高度以维持原图的纵横比 ratio = min(size[0]/original_width, size[1]/original_height) new_size = int(original_width * ratio), int(original_height * ratio) resized_img = img.resize(new_size, Image.ANTIALIAS) resized_img.save(output_path) ``` 此代码片段定义了一个名为 `resize_image_pillow()` 的函数,该函数接收输入路径、输出路径以及期望的最大尺寸作为参数,并返回按指定最大尺寸调整后的图像[^2]。 #### 使用 OpenCV实现等比例缩放图片尺寸 对于那些更倾向于使用计算机视觉库的人来说,也可以采用 `OpenCV` 来达到相同的效果: ```python import cv2 def resize_image_opencv(input_path, output_path, max_dim=800): image = cv2.imread(input_path) height, width = image.shape[:2] scale_factor = float(max_dim)/max(width, height) dsize = (int(scale_factor*width), int(scale_factor*height)) resized_image = cv2.resize(image, dsize=dsize, interpolation=cv2.INTER_AREA) cv2.imwrite(output_path, resized_image) ``` 这段脚本同样实现了基于给定的最大维度值重新调整图像的功能,同时保留了原有的宽高比率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值