pythonにおいてfor文を使わずにconvolutionをしたいと考えています.
画像サイズを64*64としています.
行いたい処理として,3*3の注目画素範囲に対して,
その中心画素(convolution[4])と
周辺8近傍(convolution[4]-convolution[0~8]: 中心画素同士の減算はしない)
との差を2乗したものを,
その中心画素からの画素の距離に基づいた重みづけをして加算したものを新たな画素値になる処理です.
(中心画素に対して上下左右なら重みは1,斜め方向なら√2となります.)
scipyなど調べましたが,何を使用したらよいかわかりませんでした.
ご教授のほどよろしくお願いいたします.
python
1 2import numpy as np 3 4y_size=64 5x_size=64 6x=np.empty(3) 7y=np.empty(3) 8 9original_image=np.arange(64*64) 10convolution=np.empty(9) 11last_image=np.empty(64*64,dtype="double") 12 13for i in range(y_size): 14 15 for j in range(x_size): 16 17 x[0]=(j+x_size-1) % x_size 18 x[1]=j 19 x[2]=(j+1) % x_size 20 21 y[0]=(i+y_size-1) % y_size 22 y[1]=i 23 y[2]=(i+1) % y_size 24 25 for m in range(9): 26 #配列convolutionに3*3の画素値を代入 27 A=x[int(np.floor(m%3))] 28 B=y[int(np.floor((m/3)))]*x_size 29 convolution[m]=original_image[int(B)+int(A)] 30 #中心画素とその8近傍の画素値の差を2乗して,画素間の距離の重みづけ #改行 31 value=np.power((convolution[4]-convolution[0]),2.0)/np.sqrt(2.0) \ 32 + np.power((convolution[4]-convolution[1]),2.0) \ 33 + np.power((convolution[4]-convolution[2]),2.0)/np.sqrt(2.0) \ 34 + np.power((convolution[4]-convolution[3]),2.0) \ 35 + np.power((convolution[4]-convolution[5]),2.0) \ 36 + np.power((convolution[4]-convolution[6]),2.0)/np.sqrt(2.0) \ 37 + np.power((convolution[4]-convolution[7]),2.0) \ 38 + np.power((convolution[4]-convolution[8]),2.0)/np.sqrt(2.0) \ 39 40 last_image[i*x_size+j]=value 41 42print(last_image) 43#後で64*64にreshapeをする
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/14 09:16
2021/04/14 09:26
2021/04/15 01:15