この記事では、指定した色に近い色だけを別の色に変換する方法をご紹介していきます。
具体的には以下の風景画像の青い領域だけを
こんな感じに赤に変換してみます。
※右端の木の色なんかは変化していないことがわると思います。
中身を理解すればどんな色でも対応可能です。
それではさっそくやっていきましょう。
※この作業をpythonというプログラミング言語を用いて実行していきます。インストールから始めたい方は以下からご覧ください。
必要なライブラリを準備
今回もいつもおなじみの以下2つのライブラリを使用します。
〇openCV
〇numpy
numpy はAnacondaを使用すればあらかじめインストールされていますが、openCVは自分で追加インストールが必要です。
openCVのインストール方法については以下の記事で解説しています。
HSV空間を理解しておこう
今回の処理を思い通りにやろうとすると、HSV色空間に対する理解が不可欠です。
以下の記事でHSVについて詳細解説していますので、まずはこちらをご覧いただければと思います。
今回HSV空間のHをいろいろと操作することによって画像の色を変換していくことになります。
Hと各色の対応については以下の通りですので、要所で以下の画像を確認しながら進めていきましょう。
色変換の作業概要の紹介
今回は冒頭に紹介したように以下の画像の青い部分を赤に変更していきます。
先ほどのHSVのHは以下の通り。
青空とか海の色はだいたいH=100~110くらいの領域にいそうなことがわかると思います。
ということはこのH領域(H=100~110くらい)に入っている画素だけをだいたい100ぐらいHをマイナス方向にオフセットすればやりたいことを達成できそうですよね。
これからやっていくのはまさにそんな作業です。
指定色だけを変換するサンプルコード
作業概要がわかったところで、実際のプログラムをご紹介していきます。
以下が冒頭に紹介した作業を実施してくれるサンプルコードです。
#ライブラリのインポート
import cv2
import numpy as np
#必要な情報を入力する
#読み込むファイル名
file_name='sample.jpg'
#変換したいH値(色)を指定
hbase=106
#H値の範囲を指定
hupper=6
hlower=6
#H値のΔを指定
hdelta=-100
#処理開始
#画像読み込み
img=cv2.imread(file_name,cv2.IMREAD_COLOR)
#色の変換処理
imghsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hmax=hbase+hupper
hmin=hbase-hlower
h=imghsv[:,:,0]
h=np.where((h<hmax) & (h>hmin),h+hdelta,h)
imghsv[:,:,0]=h
#変換後の画像を出力
img2=cv2.cvtColor(imghsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('change_color.jpg',img2)
さきほどの項目にてHが100~110くらいという説明をしましたがそれはあくまで概算ですので実際にプログラムを動かしながら調整する必要があります。
それを調整しているのが、
hbase=106
hupper=6
hlower=6
の部分です。
今回の場合は(hbase-hlower)~(hbase+hupper)の範囲で領域を抜き出すので、100~112という範囲で抜き出しているというわけですね。
また、以下の
hdelta=-100
の部分の数値を変えると変換後の色が変わるはずです。
ここも狙いの色になるように微調整していきましょう。
サンプルプログラムの実行結果
最後にさきほどのプログラムを実行した結果を載せておきます。
以下がその結果です。
(左がもとの画像、右が色変換後の画像)
冒頭に紹介したものと同じですが、だいたい狙い通りできていますよね。
おわりに
というわけで今回はpython-openCVを使って、カラー画像から指定した色を別の色に変換する方法をご紹介しました。
いろいろな状況で活用できると思いますので、ぜひご活用ください。
このように、私のブログでは様々なスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント
python、openCVともに初心者ですが画像の色を変更しようとしていてここにたどり着きました。わたしの場合は青を白に変更したいので記事を参考にサンプルコードの23、24行目を
v= hsv2[:,:,2]
v=np.where((h=100),255,v)
hsv2[:,:,2] = v
(色相が100~140の範囲の画素の明度を255にしたつもりです)
としましたが、青が薄くはなったものの完全に白にはなりません。
問題点と改善策がお分かりでしたらアドバイスをよろしくお願いいたします。
ご質問ありがとうございます(^^)
hsvの操作で白を作る場合、v=255かつs=0とする必要があると思いますのでその操作を追加すれば対応可能だと思います!