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

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

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

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

Q&A

解決済

1回答

661閲覧

python 画素値の誤差の計算について

raiju

総合スコア6

Python 3.x

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

0グッド

0クリップ

投稿2019/12/09 07:06

前提・実現したいこと

画像内で指定した領域に平均フィルタをかけて、フィルタをかける前の画像との誤差を画素ごとの画素値の差で求め、それが最大になる場合と最小になる場合の領域の位置と処理後の画像を求めようとしています。
誤差は処理前後の画像のrgb値の差の二乗を求め、それらの合計によって定義します。

発生している問題

誤差の計算の動作確認を行ったところ、動作が非常に重く作業が進行しません。
問題点や解決法をご教示いただけると幸いです。

該当のソースコード

python

1from PIL import Image 2import numpy as np 3import cv2 4import math 5 6 7def main(): 8 F = cv2.imread("gazou.jpg") 9 m, n, c = F.shape 10 h = 30 11 M = math.floor(m/h) 12 N = math.floor(n/h) 13 im = F[1:M*h, 1:N*h] 14 15 list = [] 16 for i in range(h): 17 for j in range(h): 18 D = im[i:(i+(M-1)*h-1), j:(j+(N-1)*h-1)] 19 P = cv2.blur(D, (h, h)) 20 List = [] 21 for x in range((M-1)*h-1): 22 for y in range((N-1)*h-1): 23 Db,Dg,Dr = D[x,y] 24 Pb,Pg,Pr = P[x,y] 25 DPr = pow(int(Dr)-int(Pr), 2) 26 DPg = pow(int(Dg)-int(Pg), 2) 27 DPb = pow(int(Db)-int(Pb), 2) 28 e = DPr+DPg+DPb 29 List.append(e) 30 E = sum(List) 31 print(E) 32 list.append(E) 33 34 Emax = max(list) 35 Emin = min(list) 36 print("max = ", Emax) 37 print("min = ", Emin) 38 39if __name__ == '__main__': 40 main()

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

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

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

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

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

guest

回答1

0

ベストアンサー

一つの画像に対して、ブラーをかけて画素ごとに比較、という処理を900回も繰り返せばどうしても動作は重くなると思います。
コードをざっと見た感じでは、明らかに無駄な処理などは含まれていないため、改善は困難だと思います。

焼け石に水ですが、

python

1DPr = pow(int(Dr)-int(Pr), 2)

python

1tmp = int(Dr)-int(Pr) 2DPr = tmp * tmp

のようにするなどで、少しだけ速くなるかもしれません。
ただし、コンパイラが暗黙的に上記のようなコードに変換していたり、pow 自体が上記のコード並みに高速だったりする可能性もあるので、全然変わらないかもしれません。

また、面倒な方法ですが、C や C++ 等に移植すれば、運が良ければ数倍程度速くなる思います。

他には、これも面倒ですが、まず大雑把に少ない回数だけ比較をして最大・最小になる領域の目星をつけて、その後に目星をつけた付近の領域だけをより細かく比較するなど、アルゴリズムを変更するのも効果はあると思います。
ただ、アルゴリズムを変えると結果も変わる可能性がありますが。

投稿2019/12/09 18:56

2KOH

総合スコア999

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問