###現状
初心者なためコードが汚いかもしれませんがお許しください.
Python3でコードを作っています.
2次元の畳み込み演算をやろうと思い,まずよく分からないので1次元の畳み込み演算のコードを作ってみました.結果としては,欲しいものが出てきました.
ただ,本題は2次元の畳み込み演算なのですが...そこで躓いています.
どうコードを変えていけばいいのか...
前提・実現したいこと
この質問欄の一番下にこれから計算したい10行10列のデータがあります.形式はCSVファイルです.
そのデータに関して
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
という平均化のフィルターをかけたいのですが,よく分かりません.
もちろん畳み込み演算なので平均化フィルターはスライスしていきます.
まず,データをどうやって行と列として読み込ませるのでしょうか.
そしてどうやって2次元の場合フィルターをスライスさせて全点に畳み込み演算ができますか.
ネットからサンプル画像に対してフィルターを書けるコードを拾ってきているのですが,それが画像ではない場合(つまりただの数値データのとき)はどうすれば良いのでしょうか.一応,画像にかけるフィルターのコードを一番下に乗せておきます.
お手数おかけするかもしれませんが,よろしくお願いします.
###現状の1次元の畳み込み演算のコード
Python3
1f=open('data.csv','r') 2x=f.readlines() 3f.close() 4 5peakpressure=[] 6num3=len(x) 7 8for i in range(num3): 9 peakpressure.append(float(x[i])) 10 11print("peakpressure") 12print(peakpressure) 13filtering = [0.33333,0.33333,0.33333] 14print("filtering") 15print(filtering) 16print('\n') 17num=len(filtering) 18num2=len(peakpressure) 19sum1=[] 20sum2=[] 21 22for l in range(num2-2): 23 for i in range(num): 24 a=peakpressure[l]*filtering[i] 25 print(a) 26 sum1.append(a) 27 l=l+1 28 print(sum1) 29 b=sum(sum1) 30 print(round(b,3)) 31 sum2.append(round(b,3)) 32 del sum1[:] 33 print('\n') 34print(sum2) 35 36f2=open('out.txt','w') 37for i in range(num2-2): 38 f2.write(str(sum2[i])) 39 f2.write('\n') 40f2.close()
出力結果
Python3
11.333 21.667 31.333 41.667 51.333 61.667 71.333 81.667
data.csv(1次元の時)
1 2 1 2 1 2 1 2 1 2
data.csv(2次元の時)
0 1 2 3 4 5 6 7 8 9 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 3 2 1 2 1 2 1 2 1 2 1 4 1 2 1 2 1 2 1 2 1 2 5 2 1 2 1 2 1 2 1 2 1 6 1 2 1 2 1 2 1 2 1 2 7 2 1 2 1 2 1 2 1 2 1 8 1 2 1 2 1 2 1 2 1 2 9 2 1 2 1 2 1 2 1 2 1
画像のたたみこみ演算コード
from PIL import Image import numpy as np import sys filter = [0, 1, 0, 0, -2, 0, 0, 1, 0] def image_process(src): width, height = src.size dst = Image.new('RGB', (width, height)) img_pixels = np.array([[src.getpixel((x,y)) for y in range(height)] for x in range(width)]) color = np.zeros((len(filter), 3)) for y in range(1, height-1): for x in range(1, width-1): color[0] = img_pixels[x-1][y-1] color[1] = img_pixels[x-1][y] color[2] = img_pixels[x-1][y+1] color[3] = img_pixels[x][y-1] color[4] = img_pixels[x][y] color[5] = img_pixels[x][y+1] color[6] = img_pixels[x+1][y-1] color[7] = img_pixels[x+1][y] color[8]= img_pixels[x+1][y+1] sum_color = np.zeros(3) for num in range(len(filter)): sum_color += color[num] * filter[num] r,g,b = map(int, (sum_color)) r = min([r, 255]) r = max([r, 0]) g = min([g, 255]) g = max([g, 0]) b = min([b, 255]) b = max([b, 0]) dst.putpixel((x,y), (r,g,b)) return dst if __name__ == '__main__': param = sys.argv if (len(param) != 2): print ("Usage: $ python " + param[0] + " sample.jpg") quit() # open image file try: input_img = Image.open(param[1]) except: print ('faild to load %s' % param[1]) quit() if input_img is None: print ('faild to load %s' % param[1]) quit() output_img = image_process(input_img) output_img.save("filtered_" + param[1]) output_img.show()
回答1件
あなたの回答
tips
プレビュー