[OpenCV] 샤프닝

zzwon1212·2023년 10월 29일
0

OpenCV

목록 보기
14/16
post-thumbnail

1. 언샤프 마스크 필터링

  • 날카롭지 않은 unsharp 영상(=블러링된 영상)을 이용하여 날카로운 영상을 생성

  • 원본 영상에서 블러링된 영상을 빼주면 날카로운 부분이남게 되고, 이를 원본 영상에 더해주면 날카로운 영상을 얻을 수 있다.

src:f(x)blur:fˉ(x)g(x)=f(x)fˉ(x)sharp:h(x)=f(x)+g(x)=2f(x)fˉ(x)src: f(x) \\ \, \\ blur: \bar{f}(x) \\ \, \\ g(x) = f(x) - \bar{f}(x) \\ \, \\ sharp: h(x) = f(x) + g(x) = 2f(x) - \bar{f}(x)
  • sharpness 조절을 위한 가중치를 부여할 수 있다.

    h(x,y)=f(x,y)+αg(x,y)h(x,y)=f(x,y)+α(f(x,y)fˉ(x,y))=(1+α)f(x,y)αfˉ(x,y)h(x,y)=(1+α)f(x,y)αGσ(f(x,y))h(x, y) = f(x, y) + \alpha \cdot g(x, y) \\ \, \\ h(x, y) = f(x, y) + \alpha \cdot (f(x, y) - \bar{f}(x, y)) \\ \, \\ = (1 + \alpha) f(x, y) - \alpha \cdot \bar{f}(x, y)\\ \, \\ h(x, y) = (1 + \alpha) f(x, y) - \alpha \cdot G_\sigma(f(x, y))
  • (3, 3) 사이즈의 블러링 필터를 이용할 경우 아래와 같이 언샤프 마스크 필터를 만들게 된다.

2. 구현

  • OpenCV에서 샤프닝을 위한 별도 함수를 제공하지 않기 때문에 blur()GaussianBlur()를 이용한다.

    Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);
    
    Mat blr;
    blur(src, blr, Size(3, 3));
    
    Mat dst = 2 * src - blr;
    Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);
    
    Mat blr;
    GaussianBlur(src, blr, Size(), 1.0);
    
    Mat dst = 2 * src - blr;
  • 적용 결과

    • 아래는 가중치에 따라 달라진 샤프닝 적용 결과이다. 좌측 사진이 원본, 가운데 사진이 α=1.0\alpha=1.0, 우측이 α=3.0\alpha=3.0이다. α\alpha가 높을수록 날카로운 특성을 더해주기 때문에 더욱 날카로운 사진이 된다.
    • 아래 결과를 통해 Gaussian 블러링의 σ\sigma가 높아짐에 따라 사진이 더욱 날카로워짐을 확인할 수 있다.

📙강의 - 강사 황선규

profile
JUST DO IT.

0개의 댓글