質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

8576閲覧

python+opencvで、白黒画像とカラー画像を分類したい

anpuru

総合スコア14

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/19 06:53

実現したいこと

pythonとopencvを利用して、読み込んだ画像が白黒画像とカラー画像とに分類したい。

困っていること

opencvの関数を使って、画像の色の判定を行えばいいと思うのですが、調べたのですが具体的な方法が分かりませんでした。
どなたかご教授いただけないでしょうか。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2018/10/19 07:00

元の画像フォーマットは決まっているのでしょうか?
anpuru

2018/10/19 07:03

画像フォーマットは、jpegです。
guest

回答2

0

こちらでいかがでしょうか。

python

1>>> import cv2 2>>> import numpy as np 3 4>>> img = cv2.imread('messi5.jpg') 5>>> print (img.shape) 6(342, 548, 3)

上記shapeですが、グレースケールの場合、行数と列数しか含まないとのことです。

投稿2018/10/19 07:16

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

PIL を使った例
もし PIL が入っていなければ、以下で入れてください。

pip install pillow

python

1import glob 2import os 3 4from PIL import Image 5 6input_dirpath = 'input' # 入力ディレクトリ 7output_dirpath = 'output' # 出力ディレクトリ 8 9# ファイルパスをピックアップ 10types = ('*.png', '*.gif', '*.jpg') 11img_paths = [] 12for t in types: 13 img_paths.extend(glob.glob(os.path.join(input_dirpath, t))) 14 15# リサイズする。 16for path in img_paths: 17 img = Image.open(path) 18 if img is None: 19 print('failed to loading image {}.'.format(path)) 20 continue 21 # 分類する。 22 if img.mode == 'RGBA': 23 dirpath = os.path.join(output_dirpath, 'RGBA') 24 elif img.mode == 'RGB': 25 dirpath = os.path.join(output_dirpath, 'RGB') 26 elif img.mode == 'L': 27 dirpath = os.path.join(output_dirpath, 'L') 28 else: 29 print('image {}: unsupported imaga type: {}'.format(path, img.mode)) 30 continue 31 os.makedirs(dirpath, exist_ok=True) 32 print('image {}: {}'.format(path, img.mode)) 33 34 save_path = os.path.join(dirpath, os.path.basename(path)) 35 img.save(save_path)

追記

白と黒のみで構成される画像は「2値画像」といいます。

python

1import glob 2import os 3import cv2 4 5input_dirpath = 'tet' # 入力ディレクトリ 6output_dirpath = 'output' # 出力ディレクトリ 7 8# ファイルパスをピックアップ 9types = ('*.png', '*.gif', '*.jpg') 10img_paths = [] 11for t in types: 12 img_paths.extend(glob.glob(os.path.join(input_dirpath, t))) 13 14# リサイズする。 15for path in img_paths: 16 img = cv2.imread(path) 17 if img is None: 18 print('failed to loading image {}.'.format(path)) 19 continue 20 21 # 分類する。 22 colors = np.unique(img.reshape(-1, img.shape[2]), axis=0) 23 if len(colors) <= 2 and np.all(np.logical_or(np.all(colors == [0, 0, 0], axis=1), 24 np.all(colors == [255, 255, 255], axis=1))): 25 dirpath = os.path.join(output_dirpath, 'binary') 26 else: 27 dirpath = os.path.join(output_dirpath, 'color') 28 29 os.makedirs(dirpath, exist_ok=True) 30 save_path = os.path.join(dirpath, os.path.basename(path)) 31 cv2.imwrite(save_path, img)

投稿2018/10/19 07:06

編集2018/10/19 08:13
tiitoi

総合スコア21954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anpuru

2018/10/19 07:54

ご回答ありがとうございます。 提示してくださったサンプルを元に実行してみましたが、白黒の画像がRGBに分類されてしまいました。 すみません。質問が不十分だったかもしれないのですが、 > 読み込んだ画像が白黒画像とカラー画像とに分類したい この部分ですが、正しくは、白と黒だけの色だけで構成される画像と白黒以外の色も含まれる画像という意味でした。こういった場合でもこのコードで分類可能なのでしょうか?
tiitoi

2018/10/19 08:13 編集

追記しました。
anpuru

2018/10/19 13:16

ご回答ありがとうございます。 ご丁寧にありがとうございます。 完全に白と黒ではなくて、白っぽい色と黒っぽい色なのですが、そのような指定は可能なのでしょうか
tiitoi

2018/10/19 16:52 編集

白っぽい、黒っぽいというのは質問者さんの主観によりますので、方針だけ書きますね。 白系の色は (255, 255, 255) に近い色、黒系の色は (0, 0, 0) に近い色です。 なので、各画素を調べて、白系の色、黒系の色、それ以外の色の画素数をそれぞれ数えて、画像全体に占める白系の色、黒系の色の画素が多ければ、白黒画像、そうでなければ、カラー画像として判断すればよいかと思います。
anpuru

2018/10/20 01:38

参考にして調べてみます。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問