Python的OpenCV轉換影像大小

TechSynapse發表於2024-08-23

在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環境來顯示影像。

相關文章