Sharpening Filter & Median Filtering 개념 및 실습

2022. 9. 1. 14:30IT/computer vision

SMALL

Sharpening Filter

1. 교재의 예제 7.1.2의 코드는 아래의 마스크를 사용해서 입력 영상의 에지를 강조해서 선명한 영상을 만들었다.

아래의 마스크를 입력 영상에 적용해 보라. 에지와 같은 영상이 출력되는지 확인해 보라. 그리고 아래의 마스크를 사용해서 선명한 영상을 만드는 코드를 작성해 보라. 강의자료의 수식을 사용해서 구현하시오. 이 수식을 사용하면 왜 선명하게 되는지 생각해 보기 바란다.

Sharpening Filter ?

  • 샤프닝 필터
    • 엣지나 디테일한 성분을 찾아서 영상을 강화시키는 것
      • 엣지, 디테일한 성분 : 밝기 단계에서 밝기가 급격하게 변화되는 영상의 특징
    • 입력 화소에서 이웃 화소끼리 차이를 크게 되도록 출력 화소를 만들어서 날카로운 느낌이 나게 만드는 것임
      • 영상의 세세한 부분을 강조할 수 있으며, 경계 부분에서 명암 대비가 증가되는 효과를 낼 수 있음
    • 블러링에서 마스크의 원소값을 모두 같게 했다면, 샤프닝에서는 마스크 원소들의 값 차이가 커지도록 구성하면 됨
  • 위 수식을 사용하면 왜 선명하게 되는가?

 💡 f(x,y)- 원본값과 Laplacian 값을 빼거나(더하면) 값이 급격하게 커지기 때문에, 밝기차가 더 커져서 엣지가 강화되어 디테일이 선명하게 된 영상을 획득 가능하다.

 

 

  • 수식 구현 코드
import numpy as np, cv2
# 회선 수행 함수 - 행렬 처리 방식(속도 면에서 유리)

def filter(image, mask):
    height = image.shape[0] # 높이
    width = image.shape[1] # 너비
    dst = np.zeros((height, width), np.float32) # 회선 결과 저장 행렬
    ycenter, xcenter = mask.shape[0]//2, mask.shape[1]//2 # 마스크 중심 좌표
    for i in range(ycenter, height - ycenter):
        for j in range(xcenter, width - xcenter):
            y1, y2 = i - ycenter, i + ycenter + 1 # 관심 영역 높이 범위
            x1, x2 = j - xcenter, j + xcenter + 1 # 관심 영역 너비 범위
            roi = image[y1:y2, x1:x2].astype('float32') # 관심 영역 형변환(3x3)
            dst[i, j] = 5 * roi[ycenter][xcenter] - roi[ycenter + 1][xcenter] - roi[ycenter - 1][xcenter] - roi[ycenter][xcenter + 1] - roi[ycenter][xcenter - 1]
    return dst

image = cv2.imread('dog.jpg', cv2.IMREAD_GRAYSCALE)
if image is None: raise Exception("영상파일 읽기 오류")

data1 = [0, -1, 0,
          -1, 5, -1,
          0, -1, 0]

mask1 = np.array(data1, np.float32).reshape(3,3) # 회선 수행
sharpen1 = filter2(image, mask1)
sharpen1 = cv2.convertScaleAbs(sharpen1)

cv2.imshow("image", image) # 결과 행렬을 윈도우에 표시
cv2.imshow("sharpen1", sharpen1)
cv2.waitKey(0)

 


Median Filtering

  • 미디언(median) 필터링 : 중간값 필터링
    1. 입력 영상에서 해당 입력 화소를 중심으로 마스크를 씌워 마스크 크기 내에 있는 입력 화소들을 가져옴
    2. 마스크 범위 내에 있는 화소값들을 크기 순으로 정렬함
    3. 정렬된 화소값 중에서 중간값을 취하여 출력 화소로 지정함
    4. 위와 같은 과정을 마스크를 이동하며 모든 입력 화소에 대해 수행해서 출력 영상을 생성함

  • 미디언 필터링 과정에서 마스크 영역 내의 심하게 차이가 나는 화소들은 정렬로 인해 최하위 값이나 취상위 값이 됨.
  • 중간값 이외의 다른 나머지 값들은 출력 화소로 지정되지 않고 제거됨.
  • 일정 영역에 다른 화소들과 밝기가 심하게 차이 나는 화소
    • "salt and pepper", 임펄스 잡음(impulse noise) 잡음을 제거하는 데 효과적임
      • 다만 마스크의 크기가 커지면, 잡음 제거 성능은 향상되지만 모든 화소를 순회하며 마스크 범위에 대해 정렬 알고리즘을 수행해야 하는 부담 때문에 수행 시간이 기하급수적으로 증가함
    • salt and pepper : black과 white pixel로 구성된 노이즈
    • background가 검정색이기 때문에 salt and pepper

만약 median filtering을 적용한다면?

위 사진처럼 잡음이 없이 깨끗해진다

  • 실습 코드

LIST