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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

1回答

4308閲覧

python初心者、画像の色識別プログラム作成

dradora

総合スコア5

Python 3.x

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

0グッド

1クリップ

投稿2019/08/27 06:04

編集2019/08/27 07:34

最近pythonの勉強を始めた者です。現在progateでpythonの勉強をした程度です。
下記のようなプログラムを作成するためには何から手をつければいいでしょうか?
何を勉強するべきなのか、どのような手法を用いるべきなのかお教えいただきたいです。

まず2枚の異なる模様の画像のそれぞれに対し、その模様の色の違いを識別しその領域ごとに名前をつけます。
具体的には色が赤からだんだん薄くなり白にそしてだんだん青になっていくようなカラーバーがついており、それらを赤、薄い赤、青、薄い青に分類しそれぞれに1,2,3,4と名付けます。そしてもう1枚の画像も同じ配色ですがそちらは赤か青かに分類し、A、Bと名付けます。
そしてその2枚の画像を重ね合わせると8つの領域ができると思います。例えば1A,3Bのように。
そしてその領域の境界線を一定のルールで色分けしたいです。例えば奇数かつA同士の場合は赤、偶数でAとBが異なる場合(2Aと4B)は青みたいな感じです。
難しいと思っている点は色の識別できっちり4色に分かれているわけではないのでそこをどうやって区別するのかです
後、これ以外の方法で境界線の色分けができるならそれでも構いません。上記はあくまで私が考えた方法です。
図はイメージ図です。わかりにくいかもしれませんがよろしくお願いします。
イメージ説明

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

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

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

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

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

tiitoi

2019/08/27 06:23

質問内容の処理は3つのステップに分かれていますが、どこまでできているのでしょうか。 1. 色で領域を分割する。 2. 2つの画像の領域を重ね合わせて、新しい領域を作る。 3. 領域を色分けする。
azuapricot

2019/08/27 06:28

progate をやったくらいではほぼ基礎は身についていないと思ったほうがよいです。 あくまで初歩の初歩を教えてくれているだけなので。 やり方の検討もつかないのであればもう少しレベルを下げたところから始めてみては?
dradora

2019/08/27 06:29

何も出来ていません。 プログラミング初学者で上記のようなプログラムを作成するために勉強し始めました。 しかしながら本屋で参考書を見てみると何が必要で何が必要でないのかすらわかりませんでした。 そのため上記のプログラムを作成するために最低限何を知っていないといけないのかを教えていただきたいです。
tiitoi

2019/08/27 06:31

入力となる2枚の画像を質問欄に添付できますか。 実際の画像がないと画像処理の話はできません。
azuapricot

2019/08/27 06:32

ではまず、tiitoiさんがおっしゃっているように、 「色で領域を分割する」だけに着目して資料を探してみてはいかがでしょうか? それができれば、その次、それもできればその次、といったようにステップアップしていくのが良いかと思います。
dradora

2019/08/27 06:48

>>tiitoiさん 添付したような画像2枚を用います。模様が異なるだけで配色等は何も変わりません。 事情により確認出来次第画像は削除させていただきます >>azuapricotさん おっしゃる通り現在このプログラムが作れるレベルではないので段階をふんで勉強していくつもりです。 色を領域で分割するという点だけに着目するというアドバイスありがとうございます
guest

回答1

0

ベストアンサー

何も出来ていません。

では、3つのステップのうち、1から取り組みましょう。

  1. 色で領域を分割する。
  2. 2つの画像の領域を重ね合わせて、新しい領域を作る。
  3. 領域を色分けする。

そのため上記のプログラムを作成するために最低限何を知っていないといけないのかを教えていただきたいです。

ステップ1を行うためには、現在勉強されている Python 言語自体の習得に加え、以下の学習が必要です。

  • 画像処理の理論

→ 書籍を1つ紹介しておきます。 ディジタル画像処理[改訂新版]

  • OpenCV の使い方

→ 実際の画像処理は OpenCV という画像処理ライブラリを使うので、OpenCV の使い方を知っておく必要があります。

  • numpy の使い方

→ OpenCV の Python 版では画像データは numpy 配列として扱うため、numpy の使い方を知っておく必要があります。

ステップ2
→ 分割した領域がステップ1で得られているので、それを使用した numpy の操作で可能

ステップ3
→ グラフ理論の彩色問題に帰着する。

グラフ彩色 - Wikipedia

ステップ1の処理を行うための案

添付画像を見たところ、大まかに赤と青の2色があるので、赤かどうかで2値化します。
2値化は画像の色を HSV 色空間として扱い、赤 (1 ~ 20) かどうかで行います。

イメージ説明

2値化ができたら、連結成分をラベリングします。

イメージ説明

サンプルコード

python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5np.random.seed(42) 6 7# 画像を読み込む。 8img = cv2.imread("sample.png") 9 10# BGR 色空間から HSV 色空間に変換する。 11hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 12 13# 2値化する。 14binary = cv2.inRange(hsv, lowerb=(1, 0, 0), upperb=(20, 255, 255)) 15imshow(binary) 16# 連結成分をラベル付けする。 17num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary) 18 19# 描画する。 20fig, ax = plt.subplots() 21 22dst = np.zeros_like(img) 23for label, centroid in zip(range(1, num_labels), centroids[1:]): 24 # ランダムに色を生成する。 25 color = np.random.randint(0, 256, 3) 26 # ラベル label の領域を color で塗りつぶす。 27 dst[labels == label] = color 28 # ラベル label を描画する。 29 ax.text(*centroid, f"No {label}", fontsize=16, color="r") 30 31 32ax.imshow(dst) 33ax.set_axis_off() 34plt.show()

使用した関数の解説記事

投稿2019/08/27 07:30

tiitoi

総合スコア21956

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

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

dradora

2019/08/27 07:47

回答ありがとうございます。 まずは上記内容について勉強していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問