Hatena::ブログ(Diary)

中途半端 このページをアンテナに追加 RSSフィード

2010-10-12 画像の処理

膨張と収縮

膨張と収縮は操作を組み合わせることにより、ノイズを取り除くことができる。主に二値画像で利用される。

  • 膨張

f:id:rebelwidow:20101012183703p:image

を対象画像X

f:id:rebelwidow:20101012183702p:image

をフィルタとし、フィルタの中心(+のついた)のマスを、X上において走査する。そしてフィルタ内のマスの持つ属性値の最大値をそのフィルタ上すべてのマスに適用する。ただし、ここでは濃いマスほど属性値が大きいものとする。すると、

f:id:rebelwidow:20101012183701p:image

のようになる。定式化すれば

D(x,y)=¥underset{x’,y’ ¥in filter}{$¥displaystyle ¥max$}(x+x’,y+y’)

  • 収縮

f:id:rebelwidow:20101012193838p:image

を対象画像X

f:id:rebelwidow:20101012193837p:image

をフィルタとし、フィルタの中心(+のついた)のマスを、X上において走査する。そしてフィルタ内のマスの持つ属性値の最小値をフィルタの中心にのみに適用する。ただし、ここでは濃いマスほど属性値が大きいものとする。すると、

f:id:rebelwidow:20101012193836p:image

のようになる。定式化すれば

E(x,y)=¥underset{x’,y’ ¥in filter}{$¥displaystyle ¥min$}(x+x’,y+y’)

  • 組み合わせ

収縮⇒膨張の組み合わせをオープニング、膨張⇒収縮の組み合わせをクロージングという。

OpenCvで実装してみる。フィルターは自分で構成できるが、ここはデフォルトの3×3の矩形フィルタで行う。属性値は濃度値を使用する。

f:id:rebelwidow:20101012200828j:image

の黒点ノイズをクロージングにより除去する。

import cv

ob = cv.LoadImage("画像",cv.CV_LOAD_IMAGE_GRAYSCALE)
size = cv.GetSize(ob)
obb = cv.CreateImage(size,8,1)
cv.Threshold(ob,obb,128,255,cv.CV_THRESH_BINARY)

obd = cv.CreateImage(size,8,1)
obe = cv.CreateImage(size,8,1)

cv.Dilate(obb,obd,None,4) #4回膨張
cv.Erode(obd,obe,None,4) #4回収縮

cv.NamedWindow("Closing")
cv.ShowImage("Closing",obe)

cv.WaitKey (0)
cv.DestroyWindow("Closing")

f:id:rebelwidow:20101012201626j:image

のようになる。

f:id:rebelwidow:20101012201309j:image

逆に白点ノイズをオープニングにより除去する。

import cv

ob = cv.LoadImage(r"C:/ero.bmp",cv.CV_LOAD_IMAGE_GRAYSCALE)
size = cv.GetSize(ob)
obb = cv.CreateImage(size,8,1)

cv.Threshold(ob,obb,128,255,cv.CV_THRESH_BINARY)

obd = cv.CreateImage(size,8,1)
obe = cv.CreateImage(size,8,1)

cv.Erode(obb,obe,None,4)
cv.Dilate(obe,obd,None,4)

cv.NamedWindow("Opening")
cv.ShowImage("Opening",obd)

cv.WaitKey (0)
cv.DestroyWindow("Opening")

f:id:rebelwidow:20101012201641j:image

のようになる。

注意してほしいのは白の濃度値は255、黒の濃度値は0であるということである。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

Connection: close