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つのチャンネルのみを持ち、各ピクセルの値は輝度を表します。

実装手順

  1. 画像を読み込みます。
  2. 使用する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()

コード解説:

  • 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、レトロフィルター

レトロフィルターは画像の色チャンネルを調整して、画像にレトロな効果をもたらします。

通常、レトロフィルターは赤と緑のチャンネルの強度を増加させ、同時に青のチャンネルの強度を減少させます。

実装手順

  1. 画像を読み込みます。
  2. 画像のBGRチャンネルを分離します。
  3. 各チャンネルの強度を調整します。
  4. チャンネルを結合して、レトロ効果のある画像を生成します。

サンプル

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()

コード解説:

  • cv2.split(image):画像のBGRチャンネルを分離します。
  • np.clip():ピクセル値が0から255の間にあることを確認します。
  • cv2.merge((b, g, r)):調整後のチャンネルを結合して、レトロ効果のある画像を生成します。

3、エンボスフィルター

エンボスフィルターは画像内の隣接ピクセルの差分を計算して、エンボスのような効果を生成します。このフィルターは通常、画像のエッジとテクスチャを強調するために使用されます。

実装手順

  1. 画像を読み込みます。
  2. 画像をグレースケール画像に変換します。
  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()

コード解説:

  • 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()

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()

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()
その他の拡張