在Python中,使用OpenCV库来转换图像大小是一个常见的操作,它可以帮助你调整图像到特定的尺寸,以适应不同的应用场景,比如图像预处理、模型输入等。下面是一个详细的代码示例,展示了如何使用OpenCV来转换图像的大小。

首先,确保你已经安装了OpenCV库。如果还没有安装,可以通过pip安装:

bash复制代码

pip install opencv-python

接下来,是一个完整的Python脚本,它加载一个图像文件,将其大小转换为指定的宽度和高度,然后显示并保存转换后的图像。

import cv2  

def resize_image(input_image_path, output_image_path, width=None, height=None, inter=cv2.INTER_AREA):
"""
调整图像大小 :param input_image_path: 输入图像的路径
:param output_image_path: 输出图像的路径
:param width: 目标宽度,如果为None,则不改变宽度
:param height: 目标高度,如果为None,则不改变高度
:param inter: 插值方法,默认为cv2.INTER_AREA(适用于缩小图像)
:return: None
"""
# 读取图像
image = cv2.imread(input_image_path)
if image is None:
print(f"Error: Unable to load image at {input_image_path}")
return # 检查是否指定了宽度和高度
if width is None and height is None:
print("Error: Both width and height cannot be None.")
return # 如果只指定了宽度或高度,则计算另一个维度以保持图像的宽高比
if width is None:
width = int(image.shape[1] * (height / float(image.shape[0])))
elif height is None:
height = int(image.shape[0] * (width / float(image.shape[1]))) # 调整图像大小
resized_image = cv2.resize(image, (width, height), interpolation=inter) # 显示图像(可选)
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows() # 保存图像
cv2.imwrite(output_image_path, resized_image) # 使用示例
input_image = 'path_to_your_image.jpg' # 替换为你的图像路径
output_image = 'resized_image.jpg'
resize_image(input_image, output_image, width=640, height=480)

在这个示例中,resize_image函数接受输入图像的路径、输出图像的路径、目标宽度、目标高度以及插值方法作为参数。它首先读取图像,然后检查是否指定了宽度和高度。如果只指定了其中一个,则根据原始图像的宽高比计算另一个维度。之后,使用cv2.resize函数调整图像大小,并通过cv2.imshow显示图像(这是可选的,主要用于调试),最后使用cv2.imwrite保存调整大小后的图像。

请确保将'path_to_your_image.jpg'替换为你自己的图像文件路径,并根据需要调整目标宽度和高度。

这里我会提供一个稍微不同的例子,这次我们将专注于只指定宽度或高度中的一个参数,让OpenCV自动根据原始图像的宽高比计算另一个维度,以确保图像不会失真。

import cv2  

def resize_image_keep_aspect_ratio(input_image_path, output_image_path, max_width=None, max_height=None, inter=cv2.INTER_AREA):
"""
调整图像大小,同时保持宽高比 :param input_image_path: 输入图像的路径
:param output_image_path: 输出图像的路径
:param max_width: 最大宽度,如果为None,则不限制宽度
:param max_height: 最大高度,如果为None,则不限制高度
:param inter: 插值方法,默认为cv2.INTER_AREA(适用于缩小图像)
:return: None
"""
# 读取图像
image = cv2.imread(input_image_path)
if image is None:
print(f"Error: Unable to load image at {input_image_path}")
return # 获取原始图像的宽高
height, width = image.shape[:2] # 计算新的尺寸
if max_width is None and max_height is None:
print("Error: Both max_width and max_height cannot be None.")
return
elif max_width is None:
max_width = int(width * (max_height / float(height)))
elif max_height is None:
max_height = int(height * (max_width / float(width)))
else:
# 确保宽度和高度不会超过指定的最大值,同时保持宽高比
ratio = min(max_width / width, max_height / height)
max_width = int(width * ratio)
max_height = int(height * ratio) # 调整图像大小
resized_image = cv2.resize(image, (max_width, max_height), interpolation=inter) # 保存图像
cv2.imwrite(output_image_path, resized_image) # 可选:显示图像(注意,在生产环境中通常不会这样做)
# cv2.imshow('Resized Image with Aspect Ratio', resized_image)
# cv2.waitKey(0)
# cv2.destroyAllWindows() # 使用示例
input_image = 'your_image.jpg' # 替换为你的图像文件路径
output_image = 'resized_image_with_aspect_ratio.jpg'
resize_image_keep_aspect_ratio(input_image, output_image, max_width=800) # 只指定最大宽度
# 或者
# resize_image_keep_aspect_ratio(input_image, output_image, max_height=600) # 只指定最大高度

在这个例子中,resize_image_keep_aspect_ratio 函数允许你通过指定最大宽度或最大高度来调整图像大小,同时保持图像的原始宽高比。如果同时指定了最大宽度和最大高度,函数将计算一个缩放比例,该比例是两者中较小的那个,以确保图像不会超过这两个限制中的任何一个。

请记得将 'your_image.jpg' 替换为你自己的图像文件路径,并根据需要调整 max_widthmax_height 参数。如果你想要查看调整大小后的图像,可以取消注释与 cv2.imshow 相关的代码行。但在实际的生产环境中,通常不会这样做,因为 cv2.imshow 需要一个GUI环境来显示图像。

Python的OpenCV转换图像大小的更多相关文章

  1. (转)使用Python和OpenCV检测图像中的物体并将物体裁剪下来

    原文链接:https://blog.csdn.net/liqiancao/article/details/55670749 介绍 硕士阶段的毕设是关于昆虫图像分类的,代码写到一半,上周五导师又给我新的 ...

  2. OpenCV——改变图像大小

    , , int interpolation=INTER_LINEAR ) dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不 ...

  3. 使用Python基于OpenCV的图像油画特效

    算法步骤: 1.获取图像的灰度图片 2.设计一个小方框(4x4/8x8 /10x10等),统计每个小方框的像素值 3.将0-255的灰度值划分成几个等级,并把第二步处理的结果映射到所设置的各个等级中, ...

  4. 使用Python+OpenCV进行图像模板匹配(Match Template)

    2017年9月22日 BY 蓝鲸 LEAVE A COMMENT 本篇文章介绍使用Python和OpenCV对图像进行模板匹配和识别.模板匹配是在图像中寻找和识别模板的一种简单的方法.以下是具体的步骤 ...

  5. Python 图像处理 OpenCV (4):图像算数运算以及修改颜色空间

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  6. Python下opencv使用笔记(一)(图像简单读取、显示与储存)

    写在之前 从去年開始关注python这个软件,途中间间断断看与学过一些关于python的东西.感觉python确实是一个简单优美.easy上手的脚本编程语言,众多的第三方库使得python异常的强大. ...

  7. Python 图像处理 OpenCV (5):图像的几何变换

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  8. Python 图像处理 OpenCV (14):图像金字塔

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  9. Python cv2 OpenCV 中传统图片格式与 base64 转换

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,是一种基于64个可打印字符来表示二进制数据的方法.通过http传输图片常常将图片数据转换成base64之后再进行传输. Base64简 ...

  10. Python下opencv使用笔记(图像的平滑与滤波)

    对于图形的平滑与滤波,但从滤波角度来讲,一般主要的目的都是为了实现对图像噪声的消除,增强图像的效果. 对于2D图像可以进行低通或者高通滤波操作 低通滤波(LPF):有利于去噪,模糊图像 高通滤波(HP ...

随机推荐

  1. Android 中的property_get/property_set

    Android 中的property_get/property_set 背景 在安卓中调试Linux驱动层以及应用层之间的一些功能时,需要获取一些属性. 参考: https://blog.csdn.n ...

  2. 使用Swig转换C++到别的编程语言

    项目github地址: aoce 设定aoce能分别与UE4/Unity3D/android demo对接,就这三来看,分别是C++/C#/java三种语言. C++导出给别的语言使用,一般来说,分为 ...

  3. VS Code Go开发环境配置

    1.安装Go 下载网址:https://go.dev/doc/install 根据自己的操作系统来进行安装,官网针对Windows.Linux.macOS都有对应教程.安装完成后打开终端,输入go v ...

  4. 生成数字csv

    csv文件: import time import mcpi.minecraft as minecraft import mcpi.block as block mc = minecraft.Mine ...

  5. 3568F-三屏同显、异显方案演示

  6. 国产RK3568J基于FSPI的ARM+FPGA通信方案分享

    近年来,随着中国新基建.中国制造 2025 规划的持续推进,单 ARM 处理器越来越难胜任工业现场的功能要求,特别是如今能源电力.工业控制.智慧医疗等行业,往往更需要 ARM + FPGA 架构的处理 ...

  7. Java 中的泛型 集合(List,Set) Map

    泛型 集合(List,Set) Map 泛型 泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性 泛型的具体定义与作用 定义:泛型是一种在编译阶段进行类型检查 ...

  8. Java-Response对象设置响应消息

    功能:设置响应消息 1.设置响应行 格式:HTTP/1.1 200 OK 设置状态码:setStatus(int sc) 2.设置响应头:setHeader(String name,String va ...

  9. 解决方案 | 笔记本电脑能连上WIFI,但是无Internet显示地球图标,怎么回事?(win10)

    一.背景 任务栏托盘区显示地球图标,但是实际上可以上网. 疑难诊断一般是这种情况: 二.可能的有效解决方案 0 方案0:使用360断网急救箱傻瓜式修复 个人制作 | 360断网急救箱新版-2.0版单文 ...

  10. 网易数帆内核团队:memory cgroup 泄漏问题的分析与解决

    memory cgroup 泄露是 K8s(Kubernetes) 集群中普遍存在的问题,轻则导致节点内存资源紧张,重则导致节点无响应只能重启服务器恢复:大多数的开发人员会采用定期 drop cach ...