つれづれなる備忘録

日々の発見をあるがままに綴る

OpenCVの使い方23 ~ 画像ピラミッド4

 今回は画像ピラミッドを応用したブレンディング処理でぼけや全体的に明るくなるところの補正について紹介する。

atatat.hatenablog.com

1. シャープフィルタ

 全体的にぼけているように見えるところは、フィルタを適用して補正する。OpenCVを使って全体的にぼかしフィルタの適用については以前に紹介したが、

atatat.hatenablog.com

カーネルを適切に設定することでシャープフィルタを適用することができる。

deecode.net

引数のkでシャープ度合いを指定できるようなカーネルになっていて、生成したkernelをcv2.filter2D(img,-1,kernel)とすることで画像img`に対してシャープフィルタを適用する。

def make_sharp_kernel(k: int):
  return np.array([
    [-k / 9, -k / 9, -k / 9],
    [-k / 9, 1 + 8 * k / 9, -k / 9],
    [-k / 9, -k / 9, -k / 9]
  ], np.float32)

kernel = make_sharp_kernel(3)
img2 = cv2.filter2D(ls_, -1, kernel).astype("uint8")

今回は前々回に紹介した(コード以下参照)ブレンディング処理が完了した時点でのls_に対してシャープフィルタを適用する。

atatat.hatenablog.com

野球、サッカーボールに対して実行すると白黒のコントラスト、文字がくっきり見えるようになった。

"ボール"
ボール

海王星天王星海王星の細かい"雲"がはっきり見えるようになっている。

"海王星と天王星"
海王星天王星

2. 明るさ調整

明るさ、コントラストの調整は以下の方法を用いる。

pystyle.info

def adjust(img, alpha=1.0, beta=0.0):
    dst = alpha * img + beta
    return np.clip(dst, 0, 255).astype(np.uint8)

α = 1で固定してβのみを負の整数に指定することで全体を暗くして、ブレンディング処理のラプラシアンピラミッドを加えていく過程での画素値飽和を防ぐ。明るさ調整を適用するのは最初のls_となる。

lst = adjust(LS[0],1,-25)
ls_ = lst
for i in range(1,6):
    ls_ = cv2.pyrUp(ls_)
    ls_ = cv2.add(ls_, LS[i])

以下直接接続(Direct Blending), Pyramid Blending, シャープフィルタ, シャープフィルタと明るさ調整を比較した。多少の白っぽさが抑えられて見やすくなっているようにも感じるが、シャープフィルタと比較して画質がよくなっているようには見えない。

"ボールの比較"
ボールの比較

"顔の比較"
顔の比較