画像処理を勉強していると線形フィルタが出てきます。
例えば、平均化(ぼかす処理)とか、エッジ検出のために微分フィルタとかです。
特定の画素の位置の画素値を同じ位置の別の画素値へ変換するのではなく
特定の画素と周辺画素の情報をもって、特定の画素値を決めます。
自分を含む周囲9画素の平均が平均化処理といってぼかすものです。
以下のコードをコピペして、動かしてください。
今は3×3のフィルタにしたりますが、5×5に書き換えても問題なく動きます。
線形フィルタlfhのところをいろいろ数字を変えると、どのような処理なのか分かってくると思います。
import numpy as np
import cv2
img=cv2.imread('c:/temp/ts.jpg',1)#基本の確認
img2=cv2.imread('c:/temp/ts.jpg',1)#確認用入れ物
aa=0
#線形フィルタ(ここを色々かえる5×5にしてもよい)
lfh= [ [ 0.11 , 0.11 , 0.11 ],
[ 0.11 , 0.11 , 0.11],
[ 0.11 , 0.11 , 0.11 ] ]
#取り込んだ絵のサイズ取得
xm=len(img)
ym=len(img[0])
xh=len(lfh)
yh=len(lfh[0])
############################################
#全画素におこなう処理
for yy in range(ym-(yh-1)):
for xx in range(xm-(xh-1)):
#フィルターによる積和演算
for jj in range(yh):
for ii in range(xh):
aa=aa+img[xx+ii,yy+jj]*lfh[ii][jj]
ii=0
jj=0
#フィルタ演算修了し画素に当てはめる。
img2[int(xx+(xh-1)/2),int(yy+(yh-1)/2)]=aa
aa=0
xx=0
#保存と表示
cv2.imshow('base',img)
cv2.imwrite('c:/temp/after_linearfil.jpg',img2)
cv2.imshow('after_linearfil',img2)
#念のため、画素ずれなどなく正しく計算できているかチェック
img2=(img2*0.5)-(img*0.5)
cv2.imshow('dif',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
・中央だけ1でほかは0だと、何もしないのと同じです(左)。
・全部0.11にすると、平均化処理です(右)。


ディジタル画像処理 [改訂第二版]【電子書籍】[ ディジタル画像処理編集委員会 ] 価格:3,861円 |
Pythonで始めるOpenCV 4プログラミング [ 北山直洋 ] 価格:3,630円 |


コメント