본문 바로가기
OpenCV/OpenCV-Chapter

CH04 Opencv-Python 필터링(filtering) - Median, bilateral 잡읍제거

by kiimy 2021. 12. 18.
728x90

영상의 잡음 제거

영상의 잡음?

- 영상의 픽셀 값에 추가되는 원치 않는 형태의 신호

잡음(noise)종류

• 가우시안 잡음 (Gaussian noise)

• 소금&후추 잡음, 솔트 패퍼 (Salt&Pepper)


Median Filter

• 주변 픽셀들의 값들을 정렬하여 그 중앙값(median)으로 픽셀 값을 대체

소금-후추 잡음 제거에 효과적

• Quailty가 좋지 않아서 잘 안쓰임

 

filtering 방법이 sort 알고리즘을 사용하여 가운데 값을 선택

# 이미지에 노이즈 추가 함수
def noisy(noisy_type, image):
    if noisy_type == 'speckle':
        row,col,ch = image.shape
        gauss = np.random.randn(row,col,ch)
        gauss = gauss.reshape(row,col,ch)        
        noisy = image + image * gauss
        return noisy
        
cv2.medianBlur(src, ksize, dst=None) -> dst

Bilateral 양방향 필터

- 가우시안 잡음 제거에는 가우시안 필터가 효과적 but

 

• 에지 보전 잡음 제거 필터(edge-preserving noise removal filter)의 하나

(평균 값 필터 또는 가우시안 필터)Edge부근에서도 픽셀 값을 평탄하게 만드는 단점이 있음

=가우시안 블러를 너무 심하게 블러링하게되면(sigmaX값 크면) edge정보가 무너짐

 

기준 픽셀과 이웃 픽셀과의 거리, 그리고 픽셀 값의 차이를 함께 고려하여 블러링 정도를 조절

기존 pixel과 이웃 pixel과의 거리(유클리디안?)

 

edge가 아닌 부분에서만 blurring ==> edge 보존
= pixel이 평탄하면 blurring, 
= edge가 포함된 부분은 가우시안 함수의 일부분만  가져와서 filtering으로 사용 = Gaussian modify

 

sigma가 커지면 속도가 느려짐 
* why? 
가우시안 필터는 똑같은 모양의 필터마스크를 모든 픽셀에 적용하니 속도가 빠름
but 양방향 필터는
가우시안 필터를 만들고 각각의 픽셀마다 modify를 진행해 모든 픽셀마다 다른 형태의
filter를 만들어서 filtering을 진행


Gaussian / Bilateral

# image profile?? 2차원으로 pixle값의 높낮이를 표현한

src = cv2.imread('ch04\\images\\lenna.bmp')

if src is None:
    print('Image load failed!')
    sys.exit()

# cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
'''
d: 필터링에 사용될 이웃 픽셀의 거리(지름). 
음수(-1)를 입력하면 sigmaSpace 값에 의해 자동 결정됨.
sigmaColor: 색 공간에서 필터의 표준 편차
sigmaSpace: 좌표 공간에서 필터의 표준 편차
'''
# sigmaColor = edge를 판단하는 sigma(임계값), 너무크면 가우시안과 별다를게 없음 
# 가우시안 분포에서 +-2~3 sigma 보다 크다면 다른 값, 
#                  +-2~3 sigma 사이면 비슷한 값
# sigmaSpace 값 = filter_mask = 8*sigmaSpace + 1 or 6*sigmaSpace +1
dst = cv2.bilateralFilter(src, d=-1, sigmaColor=10, sigmaSpace=5)

src / dst == Edge가 살아있으면서 주변이 부드러워짐

728x90

댓글