Python と opencv を使用して、エッジフィリングによって画像の比率を変更せずに画像をターゲットサイズにリサイズします

ガイド

最近、顔のキーポイントの座標変化を特徴として使用するプロジェクトに取り組んでいます。しかし、前回の顔の登録、トリミング、サイズ変更の前処理の後、画像のアスペクト比が変更され、画像内の顔が歪んでいることが判明しました。この歪んだ顔で検出されたキー ポイントは、後の分析はもちろんのこと、明らかに不正確です。したがって、画像のアスペクト比が変わらないことを保証しながら、ターゲット画像をターゲットサイズにリサイズする方法が必要である。私はエッジを埋める方法を選択しました。以下で詳しく紹介し、誰もが使用して見ることができるコードと効果を添付します。

原理

ハイテクなものは何もありません(笑)。大まかに次の手順に分かれています。

  • 元の画像の幅と高さに対するターゲット画像の幅と高さの比率を計算し、小さい方の比率をサイズ変更比率として採用します
  • 上記で取得したサイズ変更率を使用して、元の画像の長さと幅を掛け、元の画像の縦横比を維持しながらサイズ変更後の画像サイズを取得します。
  • 画像を拡大縮小するために小さい比率を選択するため、新しく取得した画像のサイズはターゲット画像のサイズよりも小さくなります。ターゲット画像のサイズ要件を満たすために、現在の画像の幅と高さの差を計算します。画像とターゲット画像を入力し、値 0 のピクセルで塗りつぶし、塗りつぶし後にターゲット サイズの画像を取得します。

何が起こっているかを説明した後、コードを見てみましょう。言葉には根拠がなく、コードは効果を確認するために使用されます。

コード

import cv2
import matplotlib.pyplot as plt

# 封装resize函数
def resize_img_keep_ratio(img_name,target_size):
    img = cv2.imread(img_name) # 读取图片
    old_size= img.shape[0:2] # 原始图像大小
    ratio = min(float(target_size[i])/(old_size[i]) for i in range(len(old_size))) # 计算原始图像宽高与目标图像大小的比例,并取其中的较小值
    new_size = tuple([int(i*ratio) for i in old_size]) # 根据上边求得的比例计算在保持比例前提下得到的图像大小
    img = cv2.resize(img,(new_size[1], new_size[0])) # 根据上边的大小进行放缩
    pad_w = target_size[1] - new_size[1] # 计算需要填充的像素数目(图像的宽这一维度上)
    pad_h = target_size[0] - new_size[0] # 计算需要填充的像素数目(图像的高这一维度上)
    top,bottom = pad_h//2, pad_h-(pad_h//2)
    left,right = pad_w//2, pad_w -(pad_w//2)
    img_new = cv2.copyMakeBorder(img,top,bottom,left,right,cv2.BORDER_CONSTANT,None,(0,0,0)) 
    return img_new

if __name__ == "__main__":
	img = r'D:\SAMM\crop\006_1\1.jpg' # 待处理的图片地址, 替换成你的地址就好
	target_size=[224, 224] # 目标图像大小
	resized_img = resize_img_keep_ratio(img, target_size) 
	plt.imshow(resized_img)
	plt.show()

実行結果

リサイズ後の画像のここに画像の説明を挿入
元画像ここに画像の説明を挿入
まとめ

この記事ではPythonとopencvを使ってエッジフィリングにより元画像のアスペクト比を変えずに画像を目的のサイズにリサイズする方法を中心に紹介します。役に立ったと感じたら、ぜひ高評価をお願いします~~ご質問やコメントがございましたら、コメントエリアへようこそ~

おすすめ

転載: blog.csdn.net/Just_do_myself/article/details/118656543