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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

3回答

1222閲覧

Pythonで座標(x,y)を255、そこから離れるにつれてガウス分布にしたがって暗くなっていく1チャンネル画像をつくりたい。

physics303

総合スコア89

OpenCV

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

Python 3.x

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

Python

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

0グッド

2クリップ

投稿2018/09/28 13:09

編集2018/09/28 13:10

縦H×横Wの真っ黒な1チャンネル画像中の点(gazex,gazey)の画素値を255にします。(gazex,gazey)から離れるにつれてガウス分布にしたがって、暗くなっていく画像をpythonで作りたいです。

python

1from PIL import Image 2import numpy as np 3import math 4 5def gaussian2d(x,y,gazepoint_x,gazepoint_y,sigma=12): 6 Ans = 255*math.exp(-(x-gazepoint_x)**2/(2.0*sigma**2))*math.exp(-(y-gazepoint_y)**2/(2.0*sigma**2)) 7 return Ans 8 9if __name__ == "__main__": 10 11 gazex,gazey = getgazepoint() 12 13 H = 224 14 W = 224 15 16 X = np.zeros((H,W),dtype="uint8") 17 18 for i in range(0,len(gazex)): 19 for y in range(0,H): 20 for x in range(0,W): 21 X[y,x] = int(gaussian2d(x,y,gazex[i],gazey[i])) 22 Image.fromarray(X).save("%s.jpg" % str(i).zfill(6)) 23 print(i)

gussian2d()は2次元のガウス分布を返します。
gatgazepoint()は(gazex,gazey)を返します。gazexとgazeyはlen(gazex)=len(gazey)を満たすリストです。

※len(gazex)枚、jpg形式で出力したい。

画像サイズが224×224程度だと上のアルゴリズムで高速に画像を出力できるのですが、1280×980ぐらいになると非常に遅くなります。このアルゴリズムの速度をあげるとしたらどうしたらよいでしょうか。

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

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

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

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

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

guest

回答3

0

ベストアンサー

密度関数の値の計算は scipy などの関数に任せたほうがいいでしょう。

手順

  1. 各画素の座標一覧を作成する。
  2. scipy.stats.multivariate_normal() に渡して、その点の密度関数の値を計算する。
  3. 画像化する。(値の範囲が [0, 255] で型が uint8 の配列にする。)

サンプルコード

python

1import matplotlib.pyplot as plt 2import numpy as np 3from scipy.stats import multivariate_normal 4 5# 画像の大きさ 6img_w, img_h = 300, 300 7 8# 画素の座標一覧を作成する。 9X, Y = np.mgrid[:img_h, :img_w] 10print('X.shape', X.shape) # X.shape (300, 300) 11print('Y.shape', Y.shape) # Y.shape (300, 300) 12XY = np.c_[X.ravel(), Y.ravel()] 13print('XY.shape', XY.shape) # XY.shape (90000, 2) 14 15# 各座標の2次元正規分布の密度関数の値を計算する。 16mean = np.array([img_w, img_h]) / 2 17sigma = np.eye(2) * 3000 18Z = multivariate_normal.pdf(x=XY, mean=mean, cov=sigma) 19print('Z.shape', Z.shape) # Z.shape (90000,) 20Z = Z.reshape(img_h, img_w) # (img_h * img_w) -> (img_h, img_w) 21 22def array_to_img(x): 23 '''データを [0, 255] で表される画像に変換する。 24 ''' 25 x += max(-np.min(x), 0) # 非負の値にする。 26 x_max = np.max(x) # [0, 1] で正規化する。 27 if x_max != 0: 28 x /= x_max 29 x *= 255 # [0, 255] にする。 30 return x.astype(np.uint8) 31 32# 正規分布は平均が一番値が大きいので、次の変換でその画素が 255 になることが保証される。 33img = array_to_img(Z) 34 35# 描画する。 36plt.imshow(img, cmap=plt.cm.gray) 37plt.show()

イメージ説明

投稿2018/09/28 15:08

tiitoi

総合スコア21956

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

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

0

とりあえずsigmaが共通なら実質中心からの距離に関する1次元の分布なのでexpを1個に纏められますよね.

投稿2018/09/28 13:57

fana

総合スコア11654

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

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

0

ガウス分布は対称な形をしているので、値の計算自体は最大で1/4ほどに減らすことができると思います。
また、ガウス分布の分散が固定なのであれば、あらかじめ計算しておいてコピペすることで、計算そのものを一度に抑えられます。

投稿2018/09/28 13:33

編集2018/09/28 13:39
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問