OpenCV 簡単フィルター効果
OpenCVは豊富な画像処理とコンピュータビジョンアルゴリズムを提供し、画像処理、ビデオ分析、物体検出などの分野で広く使用されています。
この記事では、OpenCVを使用してグレースケール、レトロ、エンボスなどのいくつかの簡単なフィルター効果を実装する方法を紹介します。
以下は主なフィルター効果です:
| フィルター効果 | 実装方法 |
|---|---|
| グレースケールフィルター | cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) |
| レトロフィルター | 色チャンネルの重みを調整して、古い写真の効果をシミュレートします。 |
| エンボスフィルター | 畳み込みカーネルを使用[[-2, -1, 0], [-1, 1, 1], [0, 1, 2]]畳み込み演算を行います。 |
| ぼかしフィルター | cv2.GaussianBlur(image, (15, 15), 0) |
| シャープフィルター | 畳み込みカーネルを使用[[0, -1, 0], [-1, 5, -1], [0, -1, 0]]畳み込み演算を行います。 |
| エッジ検出フィルター | cv2.Canny(gray_image, 100, 200) |
1、グレースケールフィルター
グレースケールフィルターは最も単純なフィルターの1つで、カラー画像をグレースケール画像に変換します。
グレースケール画像は1つのチャンネルのみを持ち、各ピクセルの値は輝度を表します。
実装手順
- 画像を読み込みます。
- 使用する
cv2.cvtColor()関数を使用して画像をBGR色空間からグレースケール色空間に変換します。
サンプル
import cv2
# 画像を読み込む
image = cv2.imread('input.jpg')
# グレースケール画像に変換する
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# グレースケール画像を保存する
cv2.imwrite('gray_output.jpg', gray_image)
# グレースケール画像を表示する
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 画像を読み込む
image = cv2.imread('input.jpg')
# グレースケール画像に変換する
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# グレースケール画像を保存する
cv2.imwrite('gray_output.jpg', gray_image)
# グレースケール画像を表示する
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
コード解説:
cv2.imread('input.jpg'):画像ファイルを読み込みます。cv2.cvtColor(image, cv2.COLOR_BGR2GRAY):画像をBGR色空間からグレースケール色空間に変換します。cv2.imwrite('gray_output.jpg', gray_image):グレースケール画像を保存します。cv2.imshow('Gray Image', gray_image):グレースケール画像を表示します。
2、レトロフィルター
レトロフィルターは画像の色チャンネルを調整して、画像にレトロな効果をもたらします。
通常、レトロフィルターは赤と緑のチャンネルの強度を増加させ、同時に青のチャンネルの強度を減少させます。
実装手順
- 画像を読み込みます。
- 画像のBGRチャンネルを分離します。
- 各チャンネルの強度を調整します。
- チャンネルを結合して、レトロ効果のある画像を生成します。
サンプル
import cv2
import numpy as np
# 画像を読み込む
image = cv2.imread('input.jpg')
# BGRチャンネルを分離する
b, g, r = cv2.split(image)
# チャンネルの強度を調整する
r = np.clip(r * 0.393 + g * 0.769 + b * 0.189, 0, 255).astype(np.uint8)
g = np.clip(r * 0.349 + g * 0.686 + b * 0.168, 0, 255).astype(np.uint8)
b = np.clip(r * 0.272 + g * 0.534 + b * 0.131, 0, 255).astype(np.uint8)
# チャンネルを結合する
vintage_image = cv2.merge((b, g, r))
# レトロ画像を保存する
cv2.imwrite('vintage_output.jpg', vintage_image)
# レトロ画像を表示する
cv2.imshow('Vintage Image', vintage_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
# 画像を読み込む
image = cv2.imread('input.jpg')
# BGRチャンネルを分離する
b, g, r = cv2.split(image)
# チャンネルの強度を調整する
r = np.clip(r * 0.393 + g * 0.769 + b * 0.189, 0, 255).astype(np.uint8)
g = np.clip(r * 0.349 + g * 0.686 + b * 0.168, 0, 255).astype(np.uint8)
b = np.clip(r * 0.272 + g * 0.534 + b * 0.131, 0, 255).astype(np.uint8)
# チャンネルを結合する
vintage_image = cv2.merge((b, g, r))
# レトロ画像を保存する
cv2.imwrite('vintage_output.jpg', vintage_image)
# レトロ画像を表示する
cv2.imshow('Vintage Image', vintage_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
コード解説:
cv2.split(image):画像のBGRチャンネルを分離します。np.clip():ピクセル値が0から255の間にあることを確認します。cv2.merge((b, g, r)):調整後のチャンネルを結合して、レトロ効果のある画像を生成します。
3、エンボスフィルター
エンボスフィルターは画像内の隣接ピクセルの差分を計算して、エンボスのような効果を生成します。このフィルターは通常、画像のエッジとテクスチャを強調するために使用されます。
実装手順
- 画像を読み込みます。
- 画像をグレースケール画像に変換します。
- 畳み込みカーネルを使用してエンボス効果を計算します。
サンプル
import cv2
import numpy as np
# 画像を読み込む
image = cv2.imread('input.jpg')
# グレースケール画像に変換する
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 畳み込みカーネルを定義する
kernel = np.array([[-2, -1, 0],
[-1, 1, 1],
[ 0, 1, 2]])
# 畳み込みカーネルを適用する
emboss_image = cv2.filter2D(gray_image, -1, kernel)
# エンボス画像を保存する
cv2.imwrite('emboss_output.jpg', emboss_image)
# エンボス画像を表示する
cv2.imshow('Emboss Image', emboss_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
# 画像を読み込む
image = cv2.imread('input.jpg')
# グレースケール画像に変換する
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 畳み込みカーネルを定義する
kernel = np.array([[-2, -1, 0],
[-1, 1, 1],
[ 0, 1, 2]])
# 畳み込みカーネルを適用する
emboss_image = cv2.filter2D(gray_image, -1, kernel)
# エンボス画像を保存する
cv2.imwrite('emboss_output.jpg', emboss_image)
# エンボス画像を表示する
cv2.imshow('Emboss Image', emboss_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
コード解説:
cv2.cvtColor(image, cv2.COLOR_BGR2GRAY):画像をグレースケール画像に変換します。cv2.filter2D(gray_image, -1, kernel):畳み込みカーネルを適用して、エンボス効果を生成します。
4、ぼかしフィルター
ぼかしフィルターは画像を平滑化して、画像内のノイズとディテールを減らします。
サンプル
import cv2
# 画像を読み込む
image = cv2.imread("path/to/image.jpg")
# ぼかしフィルター
blurred_image = cv2.GaussianBlur(image, (15, 15), 0)
# 結果を表示する
cv2.imshow("Blur Filter", blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 画像を読み込む
image = cv2.imread("path/to/image.jpg")
# ぼかしフィルター
blurred_image = cv2.GaussianBlur(image, (15, 15), 0)
# 結果を表示する
cv2.imshow("Blur Filter", blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5、シャープフィルター
シャープフィルターは画像のエッジを強調して、画像をより鮮明にします。
サンプル
import cv2
import numpy as np
# 画像を読み込む
image = cv2.imread("path/to/image.jpg")
# シャープフィルター
sharpen_kernel = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])
sharpened_image = cv2.filter2D(image, -1, sharpen_kernel)
# 結果を表示する
cv2.imshow("Sharpen Filter", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
# 画像を読み込む
image = cv2.imread("path/to/image.jpg")
# シャープフィルター
sharpen_kernel = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])
sharpened_image = cv2.filter2D(image, -1, sharpen_kernel)
# 結果を表示する
cv2.imshow("Sharpen Filter", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
6、エッジ検出フィルター
エッジ検出フィルターは画像内のエッジを検出して、物体の輪郭を強調表示します。
サンプル
import cv2
# 画像を読み込む
image = cv2.imread("path/to/image.jpg")
# グレースケール画像に変換する
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# エッジ検出フィルター
edges_image = cv2.Canny(gray_image, 100, 200)
# 結果を表示する
cv2.imshow("Edges Filter", edges_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 画像を読み込む
image = cv2.imread("path/to/image.jpg")
# グレースケール画像に変換する
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# エッジ検出フィルター
edges_image = cv2.Canny(gray_image, 100, 200)
# 結果を表示する
cv2.imshow("Edges Filter", edges_image)
cv2.waitKey(0)
cv2.destroyAllWindows()