[Python] Konvertieren Sie die Bildauflösung in eine Größenänderung, ohne das Seitenverhältnis zu ändern, ohne Bildinformationen zu verlieren, OpenCV, Computer Vision

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)

Zunächst werden die Standardbildhöhe und -breite definiert. Anschließend wird die Funktion zum Ändern der Größe und Speichern des Bildes über die Funktion resize_and_save realisiert. Die Funktion empfängt einen Eingabebildordnerpfad und einen Ausgabebildordnerpfad sowie optionale Höhen- und Breitenparameter.

Bestimmen Sie innerhalb der Funktion zunächst, ob der Ausgabebildordner vorhanden ist, und erstellen Sie ihn, falls er nicht vorhanden ist. Rufen Sie dann alle Bilddateinamen mit der Endung „.jpg“ im Eingabebildordner ab und erstellen Sie eine Liste mit Bilddateipfaden. Gibt 0 zurück, wenn keine passende Bilddatei gefunden wird.

Als nächstes durchlaufen Sie die Liste der Bilddateipfade und verarbeiten jedes Bild nacheinander. Lesen Sie eine Bilddatei und ermitteln Sie die Höhe, Breite und Anzahl der Kanäle des Bildes. Anschließend wird das Größenänderungsverhältnis basierend auf der langen Seite des Bildes im Vergleich zur angegebenen Höhe und Breite berechnet.

Verwenden Sie als Nächstes die Größenänderungsfunktion von OpenCV, um die Größe des Bildes proportional zu ändern. Berechnen Sie basierend auf der Beziehung zwischen dem angepassten Bild und der Zielhöhe und -breite die Größe des Randes, der hinzugefügt werden muss.

Definieren Sie den Pixelwert des schwarzen Randes und verwenden Sie die copyMakeBorder-Funktion von OpenCV, um oben, unten, links und rechts im Bild schwarze Ränder hinzuzufügen.

Verwenden Sie abschließend die Imwrite-Funktion von OpenCV, um das angepasste Bild im Ausgabebildordner zu speichern und die Forminformationen des Bildes vor und nach der Anpassung auszudrucken.

In der Hauptfunktion werden die Pfade des Eingabebildordners und des Ausgabebildordners angegeben und die Funktion resize_and_save aufgerufen, um die Größe des Bildes zu ändern und zu speichern.

Der Effekt ist wie folgt

Konvertieren Sie ein 5140*5140-Bild in ein 640*480-Bild

Ich denke du magst

Origin blog.csdn.net/dsafefvf/article/details/130644800
Empfohlen
Rangfolge