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

画像処理

【opencv】画像の特定の色を別の色に変更する方法

こんにちは、タナカです。

この記事では、画像内の特定の色を別の色に変更する方法を説明します。

この記事の内容
  • 特定の色を別の色に変更する方法がわかる

1. 特定の色を変更するとは

今回はこちらの画像を使って説明します。左の画像から右の画像のように、ある色を別の色に変更しています。また、RGBの3チャンネルを持つ画像に対して行います。

change-color

2. 特定の色を変更する方法

色を変更する方法を2種類紹介します。

  • for文で変更する
  • np.whereで変更する

2-1. for文で変更する

1つ目はfor文で変更する方法になります。

import cv2

# 画像の読み込み
img = cv2.imread('img.png')

# 指定色
target_color = (255, 255, 255)

# 変更後の色
change_color = (0, 0, 0)

# 画像の縦横
h, w = img.shape[:2]

# 色の変更
for i in range(h):
    for j in range(w):
        b, g, r = img[i, j]
        if (b, g, r) == target_color:
            img[i, j] = change_color
        else:
            img[i, j] = (255, 255, 255)

 

画像の位置を指定すると、BGRの順番(opencv仕様)で画素値を取得することができます。指定色(target_color)と一致したら、色を変更するというように記述しています。

指定色以外の場合は、(255, 255, 255)になるようにしています。

2-2. np.whereで変更する

2つ目はnumpyという数値計算を得意としたライブラリを使用する方法になります。

import cv2
import numpy as np

# 画像の読み込み
img = cv2.imread('img.png')

# 指定色
target_color = (255, 255, 255)

# 変更後の色
change_color = (0, 0, 0)

# 色の変更
img = np.where(img == target_color, change_color, (255, 255, 255))

 

np.whereは条件と一致した座標を取得することができます。

この場合、指定色(target_color)と一致した座標の色を別の色(change_color)にし、一致しない座標を(255, 255, 255)に変更するということをしています。

まとめ

画像の特定の色を変更する方法を紹介しました。

個人的には記述もシンプルで、処理速度も速いnp.whereを使うことが多いです。