Python的OpenCV转换图像大小

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

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

bash 复制代码
bash复制代码

pip install opencv-python

接下来,是一个完整的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自动根据原始图像的宽高比计算另一个维度,以确保图像不会失真。

python 复制代码
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环境来显示图像。