トピックス プログラム、シミュレーション 科学・技術・数学

ニューラルネットワークの初歩

投稿日:

画像認識の「畳み込み」をpythonを用いて実行してみます。 写真を撮って不鮮明な場合、画像処理によって輪郭をクッキリさせたり明るくしたりすることがあると思います。防犯カメラ画像を鮮明に処理することもあると思います。このような時に、「畳み込み」という手法があります。

説明資料はこちら → 畳み込み演算

p.1 画像はRGB(Red,Green,Blue)のpixcelの集合体です。例えば、9つのピクセルに着目します。1つのpixcelにはRGBの情報が入っています。例えば、Redについて数値情報が9つあった場合、各々の値に1/9を掛けて総和を求めると、9つの平均値になります。この平均値を真中のpixcelの値に再設定します。同様にGreenもBlueも同様な計算をして真中のpixcelの値として配列に格納します。縦横に座標をずらしながら同様な計算をして配列にデータを入れていきます。この操作を「畳み込み」と言います。この操作により、隣接する色に近くなり滑らかな画像にすることができます。あるいはノイズを平均化してキャンセルすることができ、画像を鮮明化することができます。

p.2 pythonを用いたプログラムです。説明をご覧ください。 「f」の中にある数値を変更すると、いろいろな画像が得られます。numpyという配列を扱うpythonのライブラリを用いると、画像処理が簡単に体験可能です。

p.3 9つの真中の重みを増やすと、明るくなっていきます。

p.4 平均ではなく、9つのpixcelの最小値、最大値、中央値をとることもできます。

画像認識ニューラルネットワーク手法で、まだまだ高度な手法があるようです。 理解できたら、また紹介します。

pythonプログラムは、以下のとおりです。

%matplotlib inline
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

def check_range(val):
if val < 0: val = 0
elif val > 255: val = 255
return int(val)

if __name__ == '__main__':
src_img = Image.open("fukurou.png")
plt.imshow(src_img)

width, height = src_img.size
dst_img = Image.new("RGB", (width,height))

f= [1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9]

pixels = np.array(src_img)
p = np.zeros((9,3))
for y in range(1, height -1):
for x in range(1, width -1):
p[0] = pixels[y - 1][x - 1]
p[1] = pixels[y + 0][x - 1]
p[2] = pixels[y + 1][x - 1]
p[3] = pixels[y - 1][x + 0]
p[4] = pixels[y + 0][x + 0]
p[5] = pixels[y + 1][x + 0]
p[6] = pixels[y - 1][x + 1]
p[7] = pixels[y + 0][x + 1]
p[8] = pixels[y + 1][x + 1]

for i in range(9):
p[i] = p[i]* f[i]
color = np.sum(p, 0)

r,g,b = map(check_range, color)

dst_img.putpixel((x, y), (r, g, b, 255))

plt.figure()
plt.imshow(dst_img)
plt.show()

-トピックス, プログラム、シミュレーション, 科学・技術・数学

Copyright© 進化するガラクタ , 2019 All Rights Reserved Powered by STINGER.