【Python・OpenCV】画像を反転する方法(cv2.flip)

※当サイトではアフィリエイト広告を利用しています

Python プログラミング 画像処理

【Python・OpenCV】画像を反転する方法(cv2.flip)

はじめに

cv2.flip関数は画像を水平または垂直に反転するための便利なツールです。この記事では、cv2.flip関数の基本的な使い方や実際の応用例について解説します。

画像の反転

画像の反転は、さまざまな場面で使用されます。
以下は、その主な使用例です。

  1. データ拡張 (Data Augmentation):
    画像の水平反転や垂直反転は、データセットの多様性を向上させるために広く使用されます。これにより、モデルが異なる角度からデータを学習することができ、過学習を軽減し、モデルの汎化性能を向上させるのに役立ちます。
  2. ディープラーニングの前処理:
    画像データをニューラルネットワークに供給する前に、データを前処理する際に使用されます。たとえば、画像分類タスクでは、トレーニングデータをランダムに反転させることで、モデルの訓練データのバリエーションを増やし、汎化性能を向上させることがあります。
  3. 鏡像処理:
    画像を鏡像にする必要がある場合に使用されます。例えば、画像処理アプリケーションにおいて、ユーザーが鏡面に映る姿勢を認識する場合などがあります。
  4. 視覚効果の適用:
    画像やビデオに対して特定の視覚効果を適用する場合、反転は時折使用されます。例えば、画像を左右対称にしてモザイクをかけるなどのアプリケーションがあります。

これらの使用例からも分かるように、画像の反転は主にデータの拡張や前処理、特定の視覚効果の適用など、様々な画像処理のアプリケーションで役立つ汎用的な操作です。

cv2.flip関数

OpenCVでは画像の反転を行うために、cv2.flip関数が提供されています。

cv2.flip(入力画像, flipCode[, dst])

引数

名称説明
入力画像(必須)入力画像。この画像が反転されます。
flipCode(必須)反転の方向を指定するコードで、以下のいずれかを指定します。
0:水平方向に反転
1:垂直方向に反転
-1などの負の値:水平および垂直方向に反転
dst(オプション)出力画像。指定された場合、結果がこの変数に格納されます。指定されない場合は、新しい配列が作成されて結果が格納され戻り値として取得できます。

戻り値

戻り値は入力画像と同じサイズ、同じ型の反転された画像データです。

使い方

import cv2
from matplotlib import pyplot as plt

# 画像の読み込み
image = cv2.imread('image.jpg')

# BGRのチャンネル並びをRGBの並びに変更(matplotlibで結果を表示するため)
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 

# 水平方向に反転
flipped_horizontal = cv2.flip(rgb_image, 0)

# 垂直方向に反転
flipped_vertical = cv2.flip(rgb_image, 1)

# 水平および垂直方向に反転
flipped_both = cv2.flip(rgb_image, -1)

# 結果の可視化
plt.rcParams["figure.figsize"] = [12,6]                             # 表示領域のアスペクト比を設定
title = "cv2.flip: codevace.com"
plt.figure(title)                                                   # ウィンドウタイトルを設定
plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95)   # 余白を設定

plt.subplot(231)                                                    # 2行3列の1番目の領域にプロットを設定
plt.imshow(rgb_image)                                               # 入力画像を表示
plt.title("Original Image")                                         # 画像タイトル設定
plt.axis("off")                                                     # 軸目盛、軸ラベルを消す

plt.subplot(234)                                                    # 2行3列の4番目の領域にプロットを設定
plt.imshow(flipped_horizontal)                                      # 水平方向に反転した画像を表示
plt.title("Horizontal Flipped")                                     # 画像タイトル設定
plt.axis("off")                                                     # 軸目盛、軸ラベルを消す

plt.subplot(235)                                                    # 2行3列の5番目の領域にプロットを設定
plt.imshow(flipped_vertical)                                        # 垂直方向に反転した画像を表示
plt.title("Vertical Flipped")                                       # 画像タイトル設定
plt.axis("off")                                                     # 軸目盛、軸ラベルを消す

plt.subplot(236)                                                    # 2行3列の5番目の領域にプロットを設定
plt.imshow(flipped_both)                                            # 水平および垂直方向に反転した画像を表示
plt.title("Horizontal and Vertical Flipped")                        # 画像タイトル設定
plt.axis("off")                                                     # 軸目盛、軸ラベルを消す

plt.show()                                                          # ウィンドウを表示する

この例では、cv2.flip関数を使用して画像を水平方向、垂直方向、および水平・垂直両方向に反転させています。
結果は下の様になり、matplotlibを使用して画像を表示しています。

import cv2
from matplotlib import pyplot as plt

# 画像の読み込み
image = cv2.imread('image.jpg')

# BGRのチャンネル並びをRGBの並びに変更(matplotlibで結果を表示するため)
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 

1-8行目:OpenCVを使って画像を読み込んでいます。
cv2.imread関数を使用して、指定されたパスの画像を読み込み、image変数に格納しています。
次に、cv2.cvtColor関数を使用して、OpenCVのBGR形式からMatplotlibが扱えるRGB形式に変換しています。

# 水平方向に反転
flipped_horizontal = cv2.flip(rgb_image, 0)

10-11行目:cv2.flip関数を使用して画像を水平方向に反転させています。flip関数の第一引数には入力画像 (image) を指定し、第二引数には反転の方向を指定するコードを与えています。ここでは 0 を指定しています。これは水平方向への反転を意味します。

# 垂直方向に反転
flipped_vertical = cv2.flip(rgb_image, 1)

13-14行目:同様に、cv2.flip関数を使用して画像を垂直方向に反転させています。ここでは 1 を指定し、垂直方向への反転を行っています。

# 水平および垂直方向に反転
flipped_both = cv2.flip(rgb_image, -1)

16-17行目:最後に、水平および垂直方向の両方に反転させる場合です。-1を指定することで、水平および垂直の両方向に反転します。

# 結果の可視化
plt.rcParams["figure.figsize"] = [12,6]                             # 表示領域のアスペクト比を設定
title = "cv2.flip: codevace.com"
plt.figure(title)                                                   # ウィンドウタイトルを設定
plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95)   # 余白を設定

plt.subplot(231)                                                    # 2行3列の1番目の領域にプロットを設定
plt.imshow(rgb_image)                                               # 入力画像を表示
plt.title("Original Image")                                         # 画像タイトル設定
plt.axis("off")                                                     # 軸目盛、軸ラベルを消す

plt.subplot(234)                                                    # 2行3列の4番目の領域にプロットを設定
plt.imshow(flipped_horizontal)                                      # 水平方向に反転した画像を表示
plt.title("Horizontal Flipped")                                     # 画像タイトル設定
plt.axis("off")                                                     # 軸目盛、軸ラベルを消す

plt.subplot(235)                                                    # 2行3列の5番目の領域にプロットを設定
plt.imshow(flipped_vertical)                                        # 垂直方向に反転した画像を表示
plt.title("Vertical Flipped")                                       # 画像タイトル設定
plt.axis("off")                                                     # 軸目盛、軸ラベルを消す

plt.subplot(236)                                                    # 2行3列の6番目の領域にプロットを設定
plt.imshow(flipped_both)                                            # 水平および垂直方向に反転した画像を表示
plt.title("Horizontal and Vertical Flipped")                        # 画像タイトル設定
plt.axis("off")                                                     # 軸目盛、軸ラベルを消す

plt.show()                                                          # ウィンドウを表示する

19-45行目:最後に、Matplotlibを使用して元の画像と反転した画像を表示しています。
入力画像と反転後の画像が4つのサブプロットに表示され、水平方向、垂直方向、両方向に反転した結果が確認できます。このように、cv2.flip関数を使用することで、画像の反転が簡単に行えます。

入力画像として、この画像を使用しました。

引用元
黄色と赤のプラスチック玩具

おわりに

画像の反転は、画像処理の中でよく使用される基本的な操作の一つです。
機械学習のデータ拡張や画像処理の前処理など、様々なアプリケーションで役立ちます。

ご質問や取り上げて欲しい内容などがありましたら、コメントをお願いします。
最後までご覧いただきありがとうございました。

■(広告)Pythonのオススメ書籍■

参考リンク

(広告)あなたに合ったプログラミング スクールが見つかるかも

プログラミングの学習が、新しい世界を開きます。副業からキャリアの転換まで、目標に向かって一歩を踏み出しましょう。

これらのプログラミング スクールは、あなたの目的に合わせて選択できるさまざまなプログラムを提供しています。どのスクールを選ぶにせよ、プログラミングは未来への扉を開き、新しい機会を切り開く手段として素晴らしい選択です。あなたの夢や目標を実現する第一歩を踏み出す準備はできていますか?

-Python, プログラミング, 画像処理
-