[Python] 画像情報を失わずに、アスペクト比を変更せずに画像解像度をサイズ変更に変換する、OpenCV、コンピューター ビジョン

import os
import cv2
from tqdm import tqdm

# 设定默认图像高度和宽度
height = 640
width = 480


# 定义调整图像大小并保存的函数
def resize_and_save(srcImgDir, dstImgDir, height=height, width=width):
    # 如果目标图像文件夹不存在,则创建它
    if not os.path.exists(dstImgDir):
        os.makedirs(dstImgDir)

    # 获取源图像文件夹中以'.jpg'结尾的图像文件名列表
    imgNames = [img for img in os.listdir(srcImgDir) if img[-4:] == '.jpg']

    # 如果找到图像文件,则创建图像文件路径列表
    if imgNames:
        imgsList = [os.path.join(srcImgDir, i) for i in imgNames]
    else:
        return 0

    # 遍历图像文件路径列表
    for i, imgPath in tqdm(enumerate(imgsList)):
        # 获取输出图像文件的完整路径
        dstName = os.path.join(dstImgDir, imgNames[i])

        # 读取图像文件
        image = cv2.imread(imgPath)

        # 获取图像的高度、宽度和通道数
        h, w, c = image.shape

        # 初始化上、下、左、右的边框大小
        top, bottom, left, right = (0, 0, 0, 0)

        # 断言图像的高度和宽度大于等于指定的高度和宽度
        assert h >= height and w >= width, 'ratio should be less than 1'

        # 计算图像长边的缩放比例
        long_side = max(h, w)
        if h >= w:
            ratio = float(height) / long_side
        elif h < w:
            ratio = float(width) / long_side

        # 调整图像的长边并在短边两侧添加黑色边框
        resi = cv2.resize(image, (0, 0), fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)

        # 获取调整后的图像的高度、宽度和通道数
        res_height, res_width, res_c = resi.shape

        # 根据图像的长边与短边的关系,计算边框大小
        if h >= w:
            if res_width < width:
                dw = width - res_width
                left = dw // 2
                right = dw - left

        elif h < w:
            if res_height < height:
                dh = height - res_height
                top = dh // 2
                bottom = dh - top

        # 定义黑色边框的像素值
        BLACK = [0, 0, 0]

        # 在图像上下左右添加黑色边框
        res = cv2.copyMakeBorder(resi, top, bottom, left, right, cv2.BORDER_CONSTANT, value=BLACK)

        # 将调整后的图像保存到输出路径
        cv2.imwrite(dstName, res)

        # 打印图像调整前后的形状信息
        print(image.shape, '->', resi.shape, '->', res.shape)

    if __name__ == '__main__':
        # 指定输入图像文件夹和输出图像文件夹
        imgDir1 = 'input'
        imgDir2 = 'output'

        # 调用图像大小调整函数
        resize_and_save(imgDir1, imgDir2)

まず、デフォルトの画像の高さと幅が定義されます。そして、画像をリサイズして保存する機能は、resize_and_save関数によって実現されます。この関数は、入力画像フォルダーのパスと出力画像フォルダーのパス、およびオプションの高さと幅のパラメーターを受け取ります。

関数内では、まず出力画像フォルダーが存在するかどうかを確認し、存在しない場合は作成します。次に、入力画像フォルダー内の「.jpg」で終わるすべての画像ファイル名を取得し、画像ファイル パスのリストを作成します。一致する画像ファイルが見つからない場合は 0 を返します。

次に、画像ファイル パスのリストを繰り返し処理し、各画像を順番に処理します。画像ファイルを読み取り、画像の高さ、幅、チャネル数を取得します。次に、指定された高さと幅と比較した画像の長辺に基づいてリサイズ率が計算されます。

次に、OpenCV のサイズ変更機能を使用して、画像を比例的にサイズ変更します。調整した画像と目標の高さおよび幅との関係に基づいて、追加する必要がある境界線のサイズを計算します。

黒枠のピクセル値を定義し、OpenCV の copyMakeBorder 関数を使用して画像の上下左右に黒枠を追加します。

最後に、OpenCV の imwrite 関数を使用して、調整した画像を出力画像フォルダーに保存し、調整前と調整後の画像の形状情報を出力します。

main関数では、入力画像フォルダーと出力画像フォルダーのパスを指定し、resize_and_save関数を呼び出して画像をリサイズして保存します。

効果は以下の通りです

5140*5140 の画像を 640*480 の画像に変換します

おすすめ

転載: blog.csdn.net/dsafefvf/article/details/130644800