[Python] opencvで画像を読み込んで表示する方法【bmp/png/jpg/webp/gif】
PythonでOpenCVを使用して画像を読み込み、表示する方法は、cv2.imread()
で画像を読み込み、cv2.imshow()
で表示します。
OpenCVはBMP、PNG、JPG、WEBP、GIFなどの形式に対応しています。
cv2.imread()
はファイルパスを引数に取り、画像をNumPy配列として返します。
cv2.imshow()
で画像を表示し、cv2.waitKey(0)
でキー入力を待ちます。
最後にcv2.destroyAllWindows()
でウィンドウを閉じます。
OpenCVで画像を読み込む基本的な方法
OpenCVとは
OpenCV(Open Source Computer Vision Library)は、コンピュータビジョンや画像処理のためのオープンソースライブラリです。
C++で書かれていますが、Pythonを含む多くのプログラミング言語にバインディングが提供されています。
画像の読み込み、表示、加工、解析など、さまざまな機能を持ち、特にリアルタイム処理に強みがあります。
OpenCVを使用することで、画像処理のタスクを簡単に実行できます。
画像ファイル形式のサポート
OpenCVは多くの画像ファイル形式をサポートしています。
以下は、一般的に使用される画像形式の一覧です。
形式 | 説明 |
---|---|
BMP | ビットマップ形式の画像 |
PNG | 可逆圧縮の画像形式 |
JPG | 非可逆圧縮の画像形式 |
WEBP | 高圧縮率の画像形式 |
GIF | アニメーションを含む画像 |
cv2.imread()の使い方
画像を読み込むためには、cv2.imread()関数
を使用します。
この関数は、指定したパスの画像ファイルを読み込み、NumPy配列として返します。
以下は、基本的な使用例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# 画像が正しく読み込まれたか確認
if image is not None:
print("画像が正常に読み込まれました。")
else:
print("画像の読み込みに失敗しました。")
画像が正常に読み込まれました。
画像の表示方法:cv2.imshow()
読み込んだ画像を表示するには、cv2.imshow()関数
を使用します。
この関数は、ウィンドウに画像を表示します。
以下は、画像を表示するためのサンプルコードです。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# 画像を表示する
cv2.imshow('表示する画像', image)
# ウィンドウが閉じるまで待機
cv2.waitKey(0)
cv2.destroyAllWindows()
ウィンドウに画像が表示されます。
ウィンドウの操作:cv2.waitKey()とcv2.destroyAllWindows()
cv2.waitKey()関数
は、指定したミリ秒だけ待機し、その間にキーボードの入力を受け付けます。
引数に0を指定すると、無限に待機します。
cv2.destroyAllWindows()関数
は、すべてのウィンドウを閉じるために使用します。
これらの関数を組み合わせることで、ユーザーが画像を確認できる時間を確保できます。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# 画像を表示する
cv2.imshow('表示する画像', image)
# 何かキーが押されるまで待機
cv2.waitKey(0)
# すべてのウィンドウを閉じる
cv2.destroyAllWindows()
ウィンドウに画像が表示され、任意のキーを押すとウィンドウが閉じます。
画像形式ごとの読み込みと表示
BMP形式の画像を読み込む
BMP形式は、ビットマップ形式の画像で、圧縮されていないため、画質が高いのが特徴です。
OpenCVを使用してBMP画像を読み込む方法は以下の通りです。
import cv2
# BMP形式の画像を読み込む
bmp_image = cv2.imread('path/to/image.bmp')
# 画像を表示する
cv2.imshow('BMP形式の画像', bmp_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ウィンドウにBMP形式の画像が表示されます。
PNG形式の画像を読み込む
PNG形式は、可逆圧縮の画像形式で、透明度をサポートしています。
以下は、PNG画像を読み込む方法です。
import cv2
# PNG形式の画像を読み込む
png_image = cv2.imread('path/to/image.png')
# 画像を表示する
cv2.imshow('PNG形式の画像', png_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ウィンドウにPNG形式の画像が表示されます。
JPG形式の画像を読み込む
JPG形式は、非可逆圧縮の画像形式で、ファイルサイズが小さく、一般的に使用されています。
以下は、JPG画像を読み込む方法です。
import cv2
# JPG形式の画像を読み込む
jpg_image = cv2.imread('path/to/image.jpg')
# 画像を表示する
cv2.imshow('JPG形式の画像', jpg_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ウィンドウにJPG形式の画像が表示されます。
WEBP形式の画像を読み込む
WEBP形式は、高圧縮率を持つ画像形式で、Googleによって開発されました。
以下は、WEBP画像を読み込む方法です。
import cv2
# WEBP形式の画像を読み込む
webp_image = cv2.imread('path/to/image.webp')
# 画像を表示する
cv2.imshow('WEBP形式の画像', webp_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ウィンドウにWEBP形式の画像が表示されます。
GIF形式の画像を読み込む
GIF形式は、アニメーションを含むことができる画像形式ですが、OpenCVではGIFを直接読み込むことはできません。
GIFの各フレームを個別に処理する必要があります。
以下は、GIF画像を読み込むための方法の一例です。
Pillowライブラリを使用してGIFを読み込み、OpenCVで表示します。
from PIL import Image
import cv2
import numpy as np
# GIF形式の画像を読み込む
gif_image = Image.open('path/to/image.gif')
# GIFの各フレームを表示する
try:
while True:
# フレームをNumPy配列に変換
frame = np.array(gif_image.convert('RGB'))
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
# 画像を表示する
cv2.imshow('GIF形式の画像', frame)
# 次のフレームに進む
gif_image.seek(gif_image.tell() + 1)
if gif_image.tell() >= gif_image.n_frames:
break
# 100ミリ秒待機
if cv2.waitKey(100) & 0xFF == ord('q'):
break
finally:
cv2.destroyAllWindows()
ウィンドウにGIF形式のアニメーションが表示されます。
このように、OpenCVを使用してさまざまな画像形式を読み込み、表示することができます。
各形式に応じた適切な方法を選択して、画像処理を行いましょう。
画像の読み込みオプション
カラーモードの指定:カラー、グレースケール、アルファチャンネル
OpenCVでは、画像を読み込む際にカラーモードを指定することができます。
主に以下の3つのモードがあります。
- カラー: RGB形式で画像を読み込みます。
デフォルトのモードです。
- グレースケール: 画像を白黒(グレースケール)で読み込みます。
色の情報は失われます。
- アルファチャンネル: 画像をRGBA形式で読み込み、透明度の情報を保持します。
PNG形式などで使用されます。
cv2.IMREAD_COLORの使い方
cv2.IMREAD_COLOR
を指定すると、カラー画像として読み込まれます。
以下はその使用例です。
import cv2
# カラー画像を読み込む
color_image = cv2.imread('path/to/image.jpg', cv2.IMREAD_COLOR)
# 画像を表示する
cv2.imshow('カラー画像', color_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ウィンドウにカラー画像が表示されます。
cv2.IMREAD_GRAYSCALEの使い方
cv2.IMREAD_GRAYSCALE
を指定すると、グレースケール画像として読み込まれます。
以下はその使用例です。
import cv2
# グレースケール画像を読み込む
gray_image = cv2.imread('path/to/image.jpg', cv2.IMREAD_GRAYSCALE)
# 画像を表示する
cv2.imshow('グレースケール画像', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ウィンドウにグレースケール画像が表示されます。
cv2.IMREAD_UNCHANGEDの使い方
cv2.IMREAD_UNCHANGED
を指定すると、画像をそのままの状態で読み込みます。
アルファチャンネルを含む画像もそのまま保持されます。
以下はその使用例です。
import cv2
# アルファチャンネルを含む画像を読み込む
unchanged_image = cv2.imread('path/to/image.png', cv2.IMREAD_UNCHANGED)
# 画像を表示する
cv2.imshow('アルファチャンネルを含む画像', unchanged_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ウィンドウにアルファチャンネルを含む画像が表示されます。
これらのオプションを使用することで、必要に応じたカラーモードで画像を読み込むことができ、画像処理の柔軟性が向上します。
画像の表示に関する詳細
ウィンドウのサイズ調整:cv2.namedWindow()
OpenCVでは、cv2.namedWindow()関数
を使用してウィンドウのサイズを調整することができます。
この関数を使うことで、ウィンドウの表示方法を指定することができます。
以下は、ウィンドウのサイズを調整する方法の例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# ウィンドウを作成し、サイズを指定する
cv2.namedWindow('調整されたウィンドウ', cv2.WINDOW_NORMAL) # サイズ変更可能なウィンドウ
cv2.resizeWindow('調整されたウィンドウ', 800, 600) # 幅800px、高さ600pxに設定
# 画像を表示する
cv2.imshow('調整されたウィンドウ', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
指定したサイズのウィンドウに画像が表示されます。
ウィンドウのリサイズ:cv2.resizeWindow()
cv2.resizeWindow()関数
を使用すると、既存のウィンドウのサイズを変更できます。
以下はその使用例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# ウィンドウを作成
cv2.namedWindow('リサイズするウィンドウ', cv2.WINDOW_NORMAL)
cv2.imshow('リサイズするウィンドウ', image)
# ウィンドウのサイズを変更する
cv2.resizeWindow('リサイズするウィンドウ', 1024, 768) # 幅1024px、高さ768pxに設定
cv2.waitKey(0)
cv2.destroyAllWindows()
リサイズされたウィンドウに画像が表示されます。
画像のリサイズ:cv2.resize()
cv2.resize()関数
を使用すると、画像自体のサイズを変更できます。
以下はその使用例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# 画像をリサイズする
resized_image = cv2.resize(image, (400, 300)) # 幅400px、高さ300pxにリサイズ
# リサイズした画像を表示する
cv2.imshow('リサイズした画像', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
リサイズされた画像が表示されます。
画像の回転・反転:cv2.rotate()とcv2.flip()
OpenCVでは、画像を回転させたり反転させたりすることもできます。
cv2.rotate()関数
を使用して画像を90度、180度、270度回転させることができます。
また、cv2.flip()関数
を使用して画像を上下または左右に反転させることができます。
以下はその使用例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# 画像を90度回転させる
rotated_image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
# 画像を上下に反転させる
flipped_image = cv2.flip(image, 0) # 0は上下反転、1は左右反転
# 回転した画像を表示する
cv2.imshow('90度回転した画像', rotated_image)
cv2.waitKey(0)
# 反転した画像を表示する
cv2.imshow('上下反転した画像', flipped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ウィンドウに90度回転した画像と上下反転した画像が表示されます。
これらの機能を活用することで、画像の表示や操作をより柔軟に行うことができます。
GIF画像の特殊な扱い
GIFのフレームを扱う方法
GIF形式は、複数のフレームを持つアニメーション画像として広く使用されています。
OpenCVはGIFを直接読み込むことはできませんが、Pillowライブラリを使用することで、GIFの各フレームを個別に扱うことができます。
以下は、GIFのフレームを取得する方法の例です。
from PIL import Image
# GIF画像を読み込む
gif_image = Image.open('path/to/image.gif')
# 各フレームを取得する
frames = []
try:
while True:
frame = gif_image.copy()
frames.append(frame)
gif_image.seek(gif_image.tell() + 1) # 次のフレームに移動
except EOFError:
pass # 最後のフレームに到達したら終了
# フレームの数を表示
print(f"フレーム数: {len(frames)}")
フレーム数: [フレームの数]
cv2.VideoCapture()を使ったGIFの読み込み
cv2.VideoCapture()
は、動画ファイルを読み込むための関数ですが、GIFファイルも動画として扱うことができます。
以下は、GIFを読み込む方法の例です。
import cv2
# GIF画像を動画として読み込む
cap = cv2.VideoCapture('path/to/image.gif')
# フレームを読み込む
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break # フレームが取得できない場合は終了
# 画像を表示する
cv2.imshow('GIFフレーム', frame)
# 100ミリ秒待機
if cv2.waitKey(100) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
ウィンドウにGIFの各フレームが表示されます。
GIFのフレームを順番に表示する方法
GIFの各フレームを順番に表示するには、Pillowライブラリを使用してフレームを取得し、OpenCVで表示する方法が一般的です。
以下はその実装例です。
from PIL import Image
import cv2
import numpy as np
# GIF画像を読み込む
gif_image = Image.open('path/to/image.gif')
# 各フレームを順番に表示する
try:
while True:
# フレームをNumPy配列に変換
frame = np.array(gif_image.convert('RGB'))
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
# 画像を表示する
cv2.imshow('GIFフレーム', frame)
# 次のフレームに進む
gif_image.seek(gif_image.tell() + 1)
if gif_image.tell() >= gif_image.n_frames:
break
# 100ミリ秒待機
if cv2.waitKey(100) & 0xFF == ord('q'):
break
finally:
cv2.destroyAllWindows()
ウィンドウにGIFのアニメーションが表示されます。
このように、GIF画像は特別な扱いが必要ですが、PillowとOpenCVを組み合わせることで、フレームを取得し、表示することが可能です。
これにより、GIFアニメーションを簡単に扱うことができます。
画像の保存方法
cv2.imwrite()の使い方
OpenCVでは、cv2.imwrite()関数
を使用して画像をファイルに保存することができます。
この関数は、指定したパスに画像を保存し、成功した場合はTrue
を返します。
以下はその基本的な使用例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# 画像を保存する
success = cv2.imwrite('path/to/save_image.png', image)
# 保存結果を表示
if success:
print("画像が正常に保存されました。")
else:
print("画像の保存に失敗しました。")
画像が正常に保存されました。
保存時のファイル形式の指定
cv2.imwrite()
を使用する際、保存するファイルの拡張子によって自動的にファイル形式が決まります。
以下は、一般的なファイル形式の例です。
拡張子 | 説明 |
---|---|
.jpg | JPEG形式(非可逆圧縮) |
.png | PNG形式(可逆圧縮) |
.bmp | BMP形式(ビットマップ) |
.tiff | TIFF形式(高品質画像) |
.webp | WEBP形式(高圧縮率) |
例えば、PNG形式で保存する場合は、ファイル名をsave_image.png
のように指定します。
画像の圧縮率を調整する方法
JPEG形式やPNG形式で画像を保存する際、圧縮率を調整することができます。
JPEG形式の場合、圧縮率は0から100の範囲で指定し、数値が小さいほど圧縮率が高く、画質が低下します。
以下は、JPEG形式で画像を保存する際の圧縮率を調整する方法の例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# JPEG形式で画像を保存する際の圧縮率を指定
cv2.imwrite('path/to/save_image_compressed.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), 90]) # 90%の品質
# PNG形式での圧縮率を指定する場合
cv2.imwrite('path/to/save_image_compressed.png', image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9]) # 0-9の範囲で指定
指定した圧縮率で画像が保存されます。
このように、cv2.imwrite()
を使用することで、画像を簡単に保存でき、ファイル形式や圧縮率を調整することが可能です。
これにより、必要に応じた画像の保存が行えます。
応用例:画像処理の基本操作
画像の切り抜き(クロッピング)
画像の切り抜き(クロッピング)は、画像の特定の部分を取り出す操作です。
OpenCVでは、NumPyのスライシングを使用して簡単に切り抜くことができます。
以下はその例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# 切り抜く範囲を指定(y1:y2, x1:x2)
cropped_image = image[100:400, 150:450] # 高さ100から400、幅150から450を切り抜く
# 切り抜いた画像を表示する
cv2.imshow('切り抜いた画像', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
切り抜いた画像が表示されます。
画像の色変換:RGBとBGR
OpenCVでは、画像の色空間を変換することができます。
特に、RGBとBGRの変換がよく使用されます。
以下はその例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# BGRからRGBに変換
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# RGBからBGRに変換
bgr_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR)
# 変換した画像を表示する
cv2.imshow('RGB画像', rgb_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
RGB形式の画像が表示されます。
画像のフィルタリング:ぼかしやエッジ検出
画像のフィルタリングは、画像のノイズを除去したり、エッジを強調したりするために使用されます。
以下は、ぼかしとエッジ検出の例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg')
# ぼかし処理
blurred_image = cv2.GaussianBlur(image, (5, 5), 0) # 5x5のカーネルを使用
# エッジ検出
edges = cv2.Canny(image, 100, 200) # Cannyエッジ検出
# ぼかし画像とエッジ画像を表示する
cv2.imshow('ぼかし画像', blurred_image)
cv2.imshow('エッジ検出画像', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
ぼかし画像とエッジ検出画像が表示されます。
画像のヒストグラム表示
ヒストグラムは、画像の明るさや色の分布を視覚化するためのグラフです。
OpenCVを使用してヒストグラムを表示する方法は以下の通りです。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 画像を読み込む
image = cv2.imread('path/to/image.jpg', cv2.IMREAD_GRAYSCALE) # グレースケールで読み込む
# ヒストグラムを計算
histogram = cv2.calcHist([image], [0], None, [256], [0, 256])
# ヒストグラムを表示
plt.plot(histogram)
plt.title('画像のヒストグラム')
plt.xlabel('輝度値')
plt.ylabel('ピクセル数')
plt.xlim([0, 256])
plt.show()
画像のヒストグラムが表示されます。
画像の二値化処理
二値化処理は、画像を白と黒の2色に変換する操作です。
これにより、画像の特徴を強調することができます。
以下はその例です。
import cv2
# 画像を読み込む
image = cv2.imread('path/to/image.jpg', cv2.IMREAD_GRAYSCALE) # グレースケールで読み込む
# 二値化処理
_, binary_image = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY) # 閾値128で二値化
# 二値化した画像を表示する
cv2.imshow('二値化画像', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
二値化した画像が表示されます。
これらの基本的な画像処理操作を活用することで、さまざまな画像解析や加工が可能になります。
OpenCVを使用して、画像処理のスキルをさらに向上させましょう。
応用例:複数画像の操作
複数画像を一度に読み込む方法
複数の画像を一度に読み込むには、ファイル名をリストに格納し、ループを使用して各画像を読み込む方法が一般的です。
以下はその例です。
import cv2
# 読み込む画像のファイル名リスト
image_files = ['path/to/image1.jpg', 'path/to/image2.jpg', 'path/to/image3.jpg']
images = []
# 画像を一度に読み込む
for file in image_files:
image = cv2.imread(file)
if image is not None:
images.append(image)
# 読み込んだ画像の数を表示
print(f"読み込んだ画像の数: {len(images)}")
読み込んだ画像の数: [読み込んだ画像の数]
画像の連結:横方向・縦方向
複数の画像を連結するには、cv2.hconcat()
(横方向)またはcv2.vconcat()
(縦方向)を使用します。
以下はその例です。
import cv2
# 画像を読み込む
image1 = cv2.imread('path/to/image1.jpg')
image2 = cv2.imread('path/to/image2.jpg')
# 横方向に連結
horizontal_concat = cv2.hconcat([image1, image2])
# 縦方向に連結
vertical_concat = cv2.vconcat([image1, image2])
# 連結した画像を表示する
cv2.imshow('横方向連結', horizontal_concat)
cv2.imshow('縦方向連結', vertical_concat)
cv2.waitKey(0)
cv2.destroyAllWindows()
横方向連結と縦方向連結の画像が表示されます。
画像の比較:差分の計算
2つの画像の差分を計算することで、画像の変化を視覚化することができます。
以下はその例です。
import cv2
# 画像を読み込む
image1 = cv2.imread('path/to/image1.jpg')
image2 = cv2.imread('path/to/image2.jpg')
# 画像の差分を計算
difference = cv2.absdiff(image1, image2)
# 差分画像を表示する
cv2.imshow('画像の差分', difference)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像の差分が表示されます。
画像の合成:アルファブレンド
アルファブレンドを使用すると、2つの画像を指定した比率で合成することができます。
以下はその例です。
import cv2
# 画像を読み込む
image1 = cv2.imread('path/to/image1.jpg')
image2 = cv2.imread('path/to/image2.jpg')
# アルファブレンドの比率を指定
alpha = 0.5 # image1の比率
beta = 1 - alpha # image2の比率
# 画像を合成
blended_image = cv2.addWeighted(image1, alpha, image2, beta, 0)
# 合成した画像を表示する
cv2.imshow('アルファブレンド画像', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
アルファブレンドした画像が表示されます。
これらの操作を活用することで、複数の画像を効果的に処理し、さまざまな画像解析や加工が可能になります。
OpenCVを使用して、画像操作のスキルをさらに向上させましょう。
まとめ
この記事では、OpenCVを使用して画像を読み込み、表示し、さまざまな画像処理を行う方法について詳しく解説しました。
具体的には、画像の切り抜きや色変換、フィルタリング、ヒストグラム表示、二値化処理などの基本操作に加え、複数の画像を操作する方法やGIFアニメーションの扱い方についても触れました。
これらの技術を活用することで、画像処理の幅を広げ、より高度なアプリケーションを開発することが可能になります。
ぜひ、実際に手を動かして、OpenCVを使った画像処理のスキルを磨いてみてください。