まずはopencvをつかって画像をトリミングする方法から説明していきます。
OpenCV(Open Source Computer Vision Library)は、画像処理やコンピュータビジョンに特化した強力なライブラリです。この記事では、OpenCVを使って画像を簡単にトリミングする方法を紹介します。
1. 必要なライブラリのインポート
まずは、OpenCVをインストールし、Pythonコードにインポートします。もしまだインストールしていない場合、以下のコマンドでインストールできます。
pip install opencv-python
インポートするには、次のコードを使用します。
import cv2
2. 画像の読み込み
次に、画像を読み込みます。cv2.imread()を使って画像を指定のパスから読み込みます。
image = cv2.imread(‘image.jpg’)
このコードでimage.jpgという画像ファイルを読み込み、imageという変数に格納します。
3. トリミングの範囲を指定
トリミングを行うには、画像の特定の領域(矩形)を指定します。指定するには、[開始Y:終了Y, 開始X:終了X]の形式で範囲を指定します。例えば、画像の左上から100×100のサイズの部分をトリミングする場合、次のように記述します。
# トリミング領域: (y1, y2, x1, x2)
cropped_image = image[50:150, 100:200]
この例では、縦方向に50から150ピクセル、横方向に100から200ピクセルの範囲をトリミングしています。
次にopencvをつかって画像を横につなげる方法について説明していきます。
OpenCVを使うと、複数の画像を横に並べて1つの画像にすることが簡単にできます。画像を横に繋げる操作は、画像処理の中でもよく使われる技術です。ここでは、OpenCVを使って複数の画像を横方向に結合する方法を紹介します。
1. 必要なライブラリのインポート
まずは、OpenCVをインポートします。前述のように、OpenCVをインストールしていない場合は、以下のコマンドでインストールできます。
pip install opencv-python
そして、Pythonコードに必要なライブラリをインポートします。
import cv2
2. 画像の読み込み
画像を横に繋げるためには、まずその画像を読み込む必要があります。cv2.imread()を使って、結合したい画像を指定のパスから読み込みます。
image1 = cv2.imread(‘image1.jpg’)
image2 = cv2.imread(‘image2.jpg’)
ここでは、image1.jpgとimage2.jpgという2つの画像を読み込んで、それぞれimage1とimage2という変数に格納します。
3. 画像のサイズを揃える
横に繋げる画像は、縦のサイズ(高さ)が一致していないと、綺麗に並べることができません。したがって、画像のサイズを揃える必要があります。cv2.resize()を使って、画像の高さを同じにする方法を示します。
height = min(image1.shape[0], image2.shape[0]) # 高さを最小に設定
image1_resized = cv2.resize(image1, (int(image1.shape[1] * height / image1.shape[0]), height))
image2_resized = cv2.resize(image2, (int(image2.shape[1] * height / image2.shape[0]), height))
ここでは、image1とimage2の高さを一致させるため、画像のアスペクト比を維持しながらリサイズしています。
4. 画像を横に結合
画像のサイズが揃ったら、cv2.hconcat()またはnumpy.concatenate()を使って画像を横に結合します。以下のコードでは、cv2.hconcat()を使用しています。
python
コードをコピーする
result = cv2.hconcat([image1_resized, image2_resized])
このコードで、image1_resizedとimage2_resizedが横に並べられ、resultに格納されます。
5. 結合後の画像を表示
結合した画像を表示するには、cv2.imshow()を使用します。
cv2.imshow(‘Combined Image’, result)
cv2.waitKey(0)
cv2.destroyAllWindows()
これで、2つの画像が横に並べられて表示されます。
6. 結合後の画像を保存
結合した画像をファイルとして保存するには、cv2.imwrite()を使用します。
cv2.imwrite(‘combined_image.jpg’, result)
これで、結合後の画像が「combined_image.jpg」として保存されます。
これら二つの機能をまとめて使用したソースコードを添付します。
こちらのコードを利用すればフォルダ内にある画像をまとめてトリミングし連続画像として横につなげるまでの処理を
一連のプログラムとして行うことができます。
import cv2
import numpy as np
import os
import glob
from PIL import ImageFont
import matplotlib.pyplot as plt
#何個飛ばしで画像を結合するか(例 1→1個飛ばし2回に一回採用される)
skip_num = 4
hori_images_num = 5
vert_images_num = 6
#何秒目から載せるか
start_ms = 5
imgs_fps = 40000
start_frame_num = int(start_ms / (1/ imgs_fps)/1000)
#結合方向 → {横:1 , 縦:2}
connect_direction = 1
#画像トリミング位置
img_size_left = 25
img_size_right = 295
img_size_top = 50
img_size_bottom = 320
#出力画像サイズ(横方向)
export_img_size = 1000
print(“0番目画像の番号 :”,start_frame_num, “最終番号 :”, start_frame_num + hori_images_num*vert_images_num*skip_num)
#——————————————–
folder_dir = os.getcwd()
img_file_names = []
img_dirs =[]
#pngファイルのパスのみを取得して名前順に並び替え
for file in sorted(os.listdir(folder_dir)):
base, ext = os.path.splitext(file)
if ext == ‘.png’:
#img_file_names→ pngファイルの名前リスト
img_file_names.append(file)
#img_dirs→ pngファイルのパスのリスト
img_dirs.append(folder_dir + “/” + file)
#skip_num個飛ばしで画像を格納
imgs = []
img_index = 0
for img_dir in img_dirs:
if img_index >= start_frame_num:
img = cv2.imread(img_dir)
img = img[img_size_top:img_size_bottom,img_size_left:img_size_right]
if img_index%skip_num == 0:
imgs.append(img)
img_index += 1
#imgsをリサイズする
original_size = imgs[0].shape
print(original_size)
original_x = original_size[1]
original_y = original_size[0]
#aspect_ratio = original_y / original_x
img_size_x = export_img_size/hori_images_num
img_size_y = original_y * (img_size_x/original_x)
print(“縮小後の各画像サイズ”,img_size_x, img_size_y)
resized_imgs = []
for img in imgs[0 : hori_images_num*vert_images_num]:
resized_imgs.append(cv2.resize(img, dsize=(int(round(img_size_x)), int(round(img_size_y)))))
#縦,横に並べる画像をそれぞれリストに格納
table_imgs = []
for row_number in range(vert_images_num):
index = 0
hori_imgs = []
while index < hori_images_num:
hori_imgs.append(np.array(resized_imgs[index + row_number*hori_images_num]))
index += 1
table_imgs.append(hori_imgs)
table_imgs = np.array(table_imgs)
tile_imgs = []
for h_imgs in table_imgs:
v_imgs = np.hstack(h_imgs)
tile_imgs.append(np.array(v_imgs))
tile_img = np.array(np.vstack(tile_imgs))
print("完成後画像サイズ:", tile_img.shape[1],tile_img.shape[0])
im_tile_path = folder_dir +"/img_table.jpeg"
cv2.imwrite(im_tile_path,tile_img)
imagetable
まとめ
OpenCVを使って画像を横に繋げる方法は非常に簡単で、画像を並べて1つの大きな画像を作ることができます。リサイズを行うことで、異なるサイズの画像でも簡単に結合することができるので、写真やイラストをまとめて表示したいときに役立ちます。