七沢みあさんって可愛いですよね。
「あれ?」
「いつもと違うな。おかしい…」
拡大してみると…
なにか白と黒の点のゴマ塩のようなものが紛れ込んでませんか?
これではかわいい顔に集中できません。
平滑化を施し黒と白の点を除去しましょ!
#平滑化とは?
画像をぼかすということです。
OpenCVが用意しているのは4種類のぼかし方(フィルタ)が存在します。
-
1:移動平均フィルタ(平均化フィルタ)
-
2:ガウシアンフィルタ
-
3:中央値フィルタ
-
4:バイラテラルフィルタ

【注意】
・「明度」は、単に色の彩度を下げたもの。
・「輝度」は、色による明るさの違いを考慮したもの。
#1:移動平均フィルタ(平均化フィルタ)


#blurとは「ぼかし」という意味。
img = cv2.imread("nana.jpg")#openCVで画像ファイルを読み込み
img_blur = cv2.blur(img, (3, 3))#第一引数=画像ファイル,第二引数=フィルタの横幅,縦幅
imgs = cv2.hconcat([img, img_blur])#高さが等しい画像を横に連結
cv2.imwrite("nana1.jpg",imgs)#openCVで画像ファイルを保存する

☚左図はオリジナル画像 ☛右図は平均化フィルタを施した画像
右図の方がノイズがぼけていますね。
完全に消すことは難しそうです。。
##平均化フィルタ(フィルタのサイズを1×1から6×6)
img1 = cv2.blur(img, (1, 1))
img2 = cv2.blur(img, (2, 2))
img3 = cv2.blur(img, (3, 3))
img4 = cv2.blur(img, (4, 4))
img5 = cv2.blur(img, (5, 5))
img6 = cv2.blur(img, (6, 6))
imgs_1 = cv2.hconcat([img1, img2, img3])
imgs_2 = cv2.hconcat([img4, img5, img6])
imgs = cv2.vconcat([imgs_1, imgs_2])#幅が等しい画像を縦に連結
cv2.imwrite("nana2.jpg", imgs)
左上から順に、フィルタサイズを大きくしていった画像になります。
画像のぼけ具合がどんどん強くなっているのがわかりますね。
右下の写真は白ごまを気にせず、みあちゃんに集中できるようになってきた!!
#2:ガウシアンフィルタ
ガウス分布に従ってフィルタ内の重みを計算したもの。
【平均化フィルタとの違い】
置換値は処理対象となる真ん中の注目画素が最も重みが大きくなり、外側の画素ほど重みが小さくなるように置換されること。
この特性により、画素付近の情報をより残したまま画像をぼかすことが可能となっている。
img_gauss = cv2.GaussianBlur(img, (3, 3), 3)#第3引数は、ガウス関数のσ
imgs = cv2.hconcat([img, img_gauss])
cv2.imwrite("nana3.jpg", imgs)

☚左図はオリジナル画像 ☛右図は**ガウシアンフィルタ(σ=3)**を施した画像
1の平均化フィルタとあまり変わらないなぁ
#3:中央値フィルタ
指定したフィルタ内に含まれる画素から中央値を取り出し、置き換えたもの。
【平均化フィルタとの違い】
置換値は平均化された画素値ではなく、必ず存在する画素値を使用するという点になります。
img_med = cv2.medianBlur(img, 3)
imgs = cv2.hconcat([img, img_med])
cv2.imwrite("nana4.jpg", imgs)

☚左図はオリジナル画像 ☛右図は中央値フィルタを施した画像
うぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉ
ゴマ塩消えてるぅぅぅぅ
過去最高に可愛いみあちゃんになってます!!
#4:バイラテラルフィルタ
エッジ以外はガウシアンフィルタを施すもの。
輝度差が大きい部分は重みが「0」にしてガウシアンフィルタを行う。
【今までの平滑化フィルタとの違い】
エッジ(輪郭)を残しながら、画像をぼかすことが可能であること
img_bi = cv2.bilateralFilter(img, 9, 75, 75)
imgs = cv2.hconcat([img, img_bi])
cv2.imwrite("nana5.jpg", imgs)

☚左図はオリジナル画像 ☛右図はバイラテラルフィルタを施した画像
#結果
今回のごま塩ははっきりとしたノイズであったため、メディアンフィルタを施すのが一番であることが分かりましたね。
また、ノイズの彩度がオリジナルデータに近いノイズの場合はバイラテラルフィルタが適してるようにも感じました。
みなさんもお気に入りの画像にノイズが紛れ込んでいたら、フィルタリングしましょ!