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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1956閲覧

画像の各色をカラーバーの様に表したい

Vamosj1VIVA

総合スコア3

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/27 01:43

編集2021/09/27 22:31

前提・実現したいこと

ある画像(既に画像ファイルとして存在しています)の各色が何を表しているのかをカラーバーの様に棒状にして画像に加えたいと考えています(ヒートマップの凡例をつくる)。例として下記の画像を示します。この色は標高何メートルと決めて標記したいです。緑色は0~100m、オレンジ色は300~400mであったりとかいう感じです。画像は次のURLから引用しています。
https://www.gsi.go.jp/KIDS/KIDS07.html
イメージ説明

発生している問題・エラーメッセージ

初心者で大変申し訳ないですが、この表し方が分かりません。調査した結果、カラーバーとは自分がカラーマップを作成しそれを利用して作るといったものだと理解しています。上記の画像にある自分が表したい色を用いたカラーマップを自作する必要があるのか、はたまた画像の色を読み取りそれをカラーバーの様に表す事が出来るのかが分からない状態です。試しに任意で等高線を作り、カラーバーを表示してみました。この等高線の様に上記の画像を基に、カラーバーの軸を0、100、200、300、400・・・の様にしたいです。エラーメッセージは出ませんでした。

該当のソースコード

任意の等高線とそのカラーバーを作ったソースコードを示します。しかしこれはあくまでこの様な等高線のカラーバーはこの様に表したいというイメージであり、実際に私が求めるのは上記のURLにある画像の色をカラーバーの様に表したいという事です。

Python

1import matplotlib.pyplot as plt 2import numpy as np 3 4 5# データを作成する。 6def f(x, y): 7 return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x) 8 9 10x = np.linspace(0, 5, 50) 11y = np.linspace(0, 5, 40) 12X, Y = np.meshgrid(x, y) 13Z = f(X, Y) 14 15# 等高線を作成する。 16fig, ax = plt.subplots() 17c = ax.contourf(X, Y, Z, 20, cmap="jet") 18fig.colorbar(c) 19 20plt.show()

出力は以下の様です。
イメージ説明

試したこと

調査した結果、カラーバーとは自分がカラーマップを作成しそれを利用して作るといったものだと理解しています。上記の画像にある自分が表したい色を用いたカラーマップを自作する必要があるのか、はたまた画像の色を読み取りそれをカラーバーの様に表す事が出来るのかが分からない状態です。とりあえずイメージを考えたいとの事で、任意の等高線とカラーバーを作成しました。

補足情報(FW/ツールのバージョンなど)

言語:Python
環境:Windows10
ブラウザ:Google chrome(Google Colaboratory)
*ノートパソコンです。全て最新バージョンです。プログラミング中はcolab以外のタブ、アプリは開いていません。
*急ぎの内容の為、以下のサイトでも同様の質問をさせていただいています。他サイトで解決した場合、こちらでも明記します。
https://ja.stackoverflow.com/questions/82701

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

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

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

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

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

etherbeg

2021/09/27 01:54

> ある画像の各色が何を表しているのかをカラーバーの様に棒状にして画像に加えたい 「ある画像」がすでに画像ファイルとして存在するものを指すのか、それともこれから matplotlib 等のライブラリを使用してデータから画像を作成するのか、によって方法は違ってくると思います。「実際に私が求めるのは上記のURLにある画像の色をカラーバーの様に表したい」とおっしゃっているので、前者なのでしょうか。
Vamosj1VIVA

2021/09/27 01:56

大変申し訳ございません。仰る通り、前者でございます。修正しておきます。
Vamosj1VIVA

2021/09/27 06:41

@1T2R3M4 大変申し訳ございません。初心者なもので利用規則を完全に把握しておりませんでした。修正しておきます。2度と違反しない様に善処します。
fana

2021/09/27 07:01 編集

【特定の画像に対して,手作業で「何色が何メートルなのか?」という情報を収集し,その結果値を与えてやれでば終了だよね】というところまでは自明な話だと思うのですが, それに対して,何が解決すべき課題なのでしょう? ・単に手作業だと面倒だから,可能であればしたくないなぁ というだけの話 ・不特定多数の画像に対応せねばならず,それぞれの画像で標高値に対する色とかが異なっているから,手作業ではとてもやってられない! という状況にあるという話 ・etc
Vamosj1VIVA

2021/09/27 07:05 編集

@fana 大変申し訳ございません。仰る通り、何が解決すべき問題かの明記がなされていませんでした。私が抱えている問題は2番目の内容です。
fana

2021/09/27 07:29 編集

2番目 とは > ・不特定多数の画像に対応せねばならず,それぞれの画像で標高値に対する色とかが異なっているから,手作業ではとてもやってられない! という状況にあるという話 ということですか? (だとしたら,statck overflow 側でもそういう旨が伝わっていないように見えるが)
thkana

2021/09/27 13:13

> ・不特定多数の画像に対応せねばならず,それぞれの画像で標高値に対する色とかが異なっているから,手作業ではとてもやってられない! という状況にあるという話 やってられないとしても、まずは「手作業でやる手順」を考えてみて、それが何らかの形で「決まった作業」に落とし込めるならそれをプログラムで書けばいいでしょう。でも、各々の図毎に手順が違うなら(余程たくさんの図があって機械学習とかいう話になるのでない限り)結局「手作業」が一番効率がよくなりそうです。 それはそれとして、やりたい作業には「ヒートマップの凡例を作る」という名前をつけると一般に通じそうな気がします。
Vamosj1VIVA

2021/09/27 22:28

@fana すいません、私のコメントが間違っていました。2番目の内容も実際にはあるのですが、それよりも大変恐縮ですが結果を与えてそれを出力するという方法がはっきりと分からなかったという事です。私自身が無知な事は承知ですので、これから勉強していきたいと思っています。
Vamosj1VIVA

2021/09/27 22:30

@thkana 前半部分については上記で記した通り、私の記載ミスであったので心にとどめておきます。私もその様に感じておりました。最後の段落の件については、修正させていただきます。ありがとうございます。
Vamosj1VIVA

2021/10/01 04:27

@meg_ 解決致しました。
guest

回答2

0

ベストアンサー

上の図と同じ配色にしたいのであれば、そういうカラーマップを作れば以下の図になります。

やりたいことがこれなのか、そうでないのかが良くわかりません。

やりたいことが違っているなら、何をやりたいのかを明確にしてください。

cmap

ソースコード

python

1import matplotlib.pyplot as plt 2import numpy as np 3from matplotlib.colors import LinearSegmentedColormap 4 5cdict = { 6 "red": [ 7 (0.0, 0.0, 0.0), 8 (0.2, 0.0, 0.8), 9 (0.4, 0.8, 1.0), 10 (0.6, 1.0, 1.0), 11 (0.8, 1.0, 1.0), 12 (1.0, 1.0, 1.0), 13 ], 14 "green": [ 15 (0.0, 1.0, 1.0), 16 (0.2, 1.0, 1.0), 17 (0.4, 1.0, 0.8), 18 (0.6, 0.8, 0.6), 19 (0.8, 0.6, 0.4), 20 (1.0, 0.4, 0.4), 21 ], 22 "blue": [ 23 (0.0, 0.0, 0.0), 24 (0.2, 0.0, 0.4), 25 (0.4, 0.4, 0.4), 26 (0.6, 0.4, 0.0), 27 (0.8, 0.0, 0.0), 28 (1.0, 0.0, 0.0), 29 ], 30} 31 32cmap = LinearSegmentedColormap("custom", cdict) 33 34def f(x, y): 35 return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x) 36 37x = np.linspace(0, 5, 50) 38y = np.linspace(0, 5, 40) 39X, Y = np.meshgrid(x, y) 40Z = f(X, Y) 41 42# 等高線を作成する。 43fig, ax = plt.subplots() 44c = ax.contourf(X, Y, Z, 20, cmap=cmap) 45fig.colorbar(c) 46 47plt.show()

投稿2021/09/28 10:04

ppaul

総合スコア24666

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

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

Vamosj1VIVA

2021/10/01 04:26

大変申し訳ございません。私の記述不備で意図がしっかり伝わらなかった事、謝罪いたします。しかし提示して頂いたプログラムは私が研究を進めていく上で大変有益な情報であると考えています。ありがとうございました。
guest

0

以下がプログラムと結果です。回答、ご指摘頂いた方ありがとうございました。

Python

1from PIL import Image 2import matplotlib as mpl 3import matplotlib.pyplot as plt 4 5# 画像の色を指定する 6cmap = mpl.colors.ListedColormap(['#00ff00', '#ccff66', '#ffcc66', '#ff9900', '#ff6600']) 7# 不連続なカラーバーを作成する 8bounds = [b for b in range(0, 501, 100)] 9norm = mpl.colors.BoundaryNorm(bounds, cmap.N) 10 11# カレントディレクトリの地形画像を読み込む 12with Image.open("000137042.png") as img: 13 plt.imshow(img, cmap=cmap, norm=norm) 14 cbar = plt.colorbar() 15 # カラーバーの目盛(0,100,200,300,400 over)を指定する 16 cbar.ax.set_yticklabels(['0','100','200','300', '400 over', '']) 17 plt.show()

イメージ説明

投稿2021/10/01 04:37

Vamosj1VIVA

総合スコア3

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

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

fana

2021/10/01 05:06 編集

> ['#00ff00', '#ccff66', '#ffcc66', '#ff9900', '#ff6600'] とかいう色の集合や, > ['0','100','200','300', '400 over', ''] みたいな目盛りの値というのは画像毎に異なることになると思われ,そのことに対して 【ある画像が与えられた場合に,その画像データから色や目盛値を(自動的に,あるいは半自動的に)取得する方法】 というのが問題なのかと思っていたのですが, そうではなくて, 【色や目盛値のデータが既に存在する(←これは人手で用意する)とき,カラーバーを表示するための実装コード(要は,matplot(?)とかいうやつの使い方)はどうなる?】 っていうだけの話だったわけですか.
fana

2021/10/01 05:09

#マルチポスト先でも問題を同様に誤解して(?)画像から色抽出しようとしたりしていた様子.
Vamosj1VIVA

2021/10/01 12:58

最終的にはメモリの値が異なるのでそれも問題ではあります。ただひとまず最初の段階として私が記した様なプログラムが欲しかったというわけです。今後も異なる画像に対して貴方が仰る通り扱っていきますが、その過程で又不明点があればお世話になるかもしれません。マルチポスト先は1人目の回答者が完璧な方で、2人目の方は回答ではないと前置きした上で考察結果をまとめてくれていました。全員に感謝しております。
fana

2021/10/01 13:36

完全自動じゃなくてよいなら,例えば (今回例示された画像にちょうど謎の直線が引かれていますが,そんな感じで) 人間が「この線上を見ろ」ということくらいを指定する…みたいな半自動な方法等が考えられそうに思えます. (人間が等高線を横切るような線を指定してやるならば,色を実行時に拾い集めるのは難易度高くないであろう) 目盛りの数字を認識するのはさすがにつらいので,そこは人手で最低値(今回の画像の例だと0)と段階値(同100)くらいを与えたほうがはやいか.
Vamosj1VIVA

2021/10/02 01:12

勉強になります。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問