今回は画像ピラミッドを応用したブレンディング処理でぼけや全体的に明るくなるところの補正について紹介する。
1. シャープフィルタ
全体的にぼけているように見えるところは、フィルタを適用して補正する。OpenCVを使って全体的にぼかしフィルタの適用については以前に紹介したが、
カーネルを適切に設定することでシャープフィルタを適用することができる。
引数の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_
に対してシャープフィルタを適用する。
野球、サッカーボールに対して実行すると白黒のコントラスト、文字がくっきり見えるようになった。
海王星と天王星も海王星の細かい"雲"がはっきり見えるようになっている。
2. 明るさ調整
明るさ、コントラストの調整は以下の方法を用いる。
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, シャープフィルタ, シャープフィルタと明るさ調整を比較した。多少の白っぽさが抑えられて見やすくなっているようにも感じるが、シャープフィルタと比較して画質がよくなっているようには見えない。