実現したいこと
pythonとopencvを利用して、読み込んだ画像が白黒画像とカラー画像とに分類したい。
困っていること
opencvの関数を使って、画像の色の判定を行えばいいと思うのですが、調べたのですが具体的な方法が分かりませんでした。
どなたかご教授いただけないでしょうか。よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
元の画像フォーマットは決まっているのでしょうか?
2018/10/19 07:03
画像フォーマットは、jpegです。
回答2件
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総合スコア21954
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/19 07:54
ご回答ありがとうございます。
提示してくださったサンプルを元に実行してみましたが、白黒の画像がRGBに分類されてしまいました。
すみません。質問が不十分だったかもしれないのですが、
> 読み込んだ画像が白黒画像とカラー画像とに分類したい
この部分ですが、正しくは、白と黒だけの色だけで構成される画像と白黒以外の色も含まれる画像という意味でした。こういった場合でもこのコードで分類可能なのでしょうか?
2018/10/19 08:13 編集
追記しました。
2018/10/19 13:16
ご回答ありがとうございます。
ご丁寧にありがとうございます。
完全に白と黒ではなくて、白っぽい色と黒っぽい色なのですが、そのような指定は可能なのでしょうか
2018/10/19 16:52 編集
白っぽい、黒っぽいというのは質問者さんの主観によりますので、方針だけ書きますね。
白系の色は (255, 255, 255) に近い色、黒系の色は (0, 0, 0) に近い色です。
なので、各画素を調べて、白系の色、黒系の色、それ以外の色の画素数をそれぞれ数えて、画像全体に占める白系の色、黒系の色の画素が多ければ、白黒画像、そうでなければ、カラー画像として判断すればよいかと思います。
2018/10/20 01:38
参考にして調べてみます。ご回答ありがとうございました。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。