【OpenCV】画像をグレースケール(モノクロ)化【全体・一部・複数】

スポンサードリンク
Python
過去の自分
過去の自分

レトロっぽい雰囲気を出すために、画像をグレースケールにしたい…。
OpenCVで画像をグレースケールにできないの?

今の自分
今の自分

なるほど…。
では今回は、「OpenCVで画像をグレースケール(モノクロ)にする方法」
できるだけわかりやすく解説いたします。
また、「画像の一部をグレースケールにする方法」も紹介いたしますので、
ぜひ最後まで読んでいってください。

著者情報
スポンサードリンク

OpenCVで画像をグレースケール(モノクロ)にする方法

「cvtColor」を使います。
まずは画像をグレースケールにしてみましょう。

ひとまず全コードと実行結果をお見せします。
解説は後ほど行います。

全コード

import cv2

input_img = cv2.imread('C:/Utatane/input_img.jpg')

gray_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)

cv2.imwrite('C:/Utatane/gray_img.jpg', gray_img)
gray_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)

実行結果

実行結果

事前準備

  • OpenCVのインストール

画像を加工したり編集したりするには「OpenCV」のインストールが必要です。
OpenCVを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。

pip install opencv-python

※OpenCVを使用したことがある場合は、このインストール作業は不要です。

解説

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

インポートや画像の読み込み・保存方法の解説は、下記記事をご参考ください。

グレースケールに変換

gray_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)

上記一文にて、カラー画像をグレースケールに変換することができます。

まず新しい名前の変数を書いたら、「=(イコール)」を書きます。

変数名を付ける際には注意すべきことがあります。下記記事をご参考ください。

イコールの後ろに「cv2.cvtColor()」を書きます。
()内には、「読み込んだ画像が入った変数」「cv2.COLOR_BGR2GRAY」を書いたら完了です。

「cv2.COLOR_BGR2GRAY」は、「カラー画像をグレースケールにする」という解釈でOKです。

これで、読み込んだ画像をグレースケールにすることができます。

グレースケールにした画像

モノクロにする方法

「グレースケール化した画像」にもうひと手間加えることで、モノクロの画像を作ることができます。
ひとまず全コードをお見せします。

import cv2

input_img = cv2.imread('C:/Utatane/input_img.jpg')

gray_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)

_, monokuro_image = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)

cv2.imwrite('C:/Utatane/monokuro_img.jpg', monokuro_img)

コードの7行目がその「もうひと手間」です。

「_,」は後ほど解説いたします。
まず新しい名前の変数の後に「=」を書き、「cv2.threshold()」を書きます。
()内には「グレースケールの画像が入った変数」「しきい値」「cv2.THRESH_BINARY」を記述します。

【しきい値】
境界線を決めるようなものだと思ってください。
今回は色のしきい値を決めています。
元画像であるグレースケール画像の色は、0~255の値で表されます。
0なら黒、50なら濃いグレー、200なら薄いグレー、255なら白といった具合です。
今回は色の値が127以上であれば255(白)、それ以外は0(黒)にしています。
そうすることで、白か黒かの「モノクロ画像」を作ることができます。

【cv2.THRESH_BINARY】
しきい値に応じてモノクロ化させています。

【 _, 】
コード7行目のこの記号は、「無視する」という意味だと思ってください。
同じく7行目で使用した「threshold()」は、「しきい値」「モノクロになった画像」を返り値として返してくれます。
モノクロになった画像は必要なので、変数「monokuro_image」に入れて後に出力するのですが、しきい値は必要ありません。
なので、返り値として返ってきた「しきい値」を「無視する」といった意味となります。

これでモノクロ画像を作ることができます。

モノクロにした画像
スポンサードリンク

画像の一部をグレースケールにする方法

「画像をグレースケール化」させたコードに3行追加することで、
画像の一部をグレースケールにすることができます。

import cv2

input_img = cv2.imread('C:/Utatane/input_img.jpg')

gray_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)

output_img = input_img.copy()

x, y, w, h = 150, 200, 250, 300

output_img[y:y+h, x:x+w] = cv2.cvtColor(gray_img[y:y+h, x:x+w], cv2.COLOR_GRAY2BGR)

cv2.imwrite('C:/Utatane/output_img.jpg', output_img)
一部をグレースケールにした画像

コードの7~11行目が新しく追加された部分です。

7行目:元画像をコピー
9行目:グレースケールにしたい部分の左上の座標(x,y)と幅(w)・高さ(h)を指定
11行目:9行目で指定した部分のみを切り抜き、カラー状態に戻す(色はグレーのまま)
    ※カラー状態に戻さないと、水と油のように混ざり合いません。
    切り抜いた部分をコピーした元画像に当てはめる

一部をグレースケールにする説明画像
x, y, w, h = 150, 200, 250, 300

output_img[y:y+h, x:x+w] = cv2.cvtColor(gray_img[y:y+h, x:x+w], cv2.COLOR_GRAY2BGR)

これで画像の一部分のみをグレースケールにすることができます。

スポンサードリンク

複数の画像を一括でグレースケールにする方法

フォルダにある全ての画像をグレースケールにすることもできます。
下記コードはfor文を使ってフォルダ内にある全ての画像をグレースケールにした例です。

import cv2
import os

os.makedirs('C:/Utatane/output', exist_ok=True)

for filename in os.listdir('C:/Utatane'):
    if filename.endswith('.jpg') :
        input_img = cv2.imread(os.path.join('C:/Utatane', filename))
        gray_img = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
        cv2.imwrite(os.path.join('C:/Utatane/output', filename), gray_img)

ざっくりと解説いたします。

<コード4行目>
出力するフォルダを作成

<コード6行目~最後>
6行目:取り込みフォルダ内のファイルを取り込み
7行目:拡張子が「jpg」なら以下の操作を行う
8行目:取り込みフォルダのパスとファイル名を連結(フルパスに)して取り込み
9行目:画像をグレースケール化
10行目:出力フォルダパスとファイル名を連結(フルパスに)して出力

スポンサードリンク

うまく動作しない場合の対処法

画像の読み込みができない

画像ファイルが存在しない場合や、ファイルが破損している場合などは画像の読み込みができません。

画像を読み込み・保存する方法の記事を参考に、再度確認してください。

画像が保存されない

存在しないフォルダを指定した場合、画像は保存されません。

画像を読み込み・保存する方法の記事を参考に、再度確認してください。

エラーが出る

No module named ‘cv2’

これは、OpenCVがインストールできていない場合に出るエラーです。
事前準備の項を参考に、OpenCVのインストールを完了させてください。

OpenCV(4.10.0) ~ img.empty() ~

画像の読み込みが正常に行えていない可能性があります。
画像を読み込み・保存する方法の記事を参考に、画像のパスや形式を確認してください。

○○ is not defined

今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。

詳しい解説は、下記記事をご参考ください。

その他のエラー

その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。

スポンサードリンク

最後に

OpenCVでカラー画像をグレースケール(モノクロ)にする方法を解説いたしました。

当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

挫折せずにPythonを独学で学習する方法は特におすすめです。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました