본문 바로가기

etc/FastCampus 챌린지

[패스트캠퍼스 수강 후기] 컴퓨터비전인강 100% 환급 챌린지 41 회차

728x90
반응형


Filter 종류

하기 내용을 참고 하였습니다.
https://webnautes.tistory.com/1255

FilterContentsconvolutionKernel과 src과 곱하고blurkernel과 src과 곱, 평균GaussianBlurmedianBlurBilateralFilter선형 처리 x, 엣지와 노이즈를 줄여줌, 부드러운 영상

convolution

이미지 convolution 방법
kernel과 image상에 대응되는 값끼리 곱하고 모두 더하기 그값을 중앙에 있는 값에 대치함
https://webnautes.tistory.com/1044

주의

이미지의 테두리(edge)의 경우는 계산하기 어려운데 두 가지 방법을 사용함
1. 빈 공간을 0으로 채우고 계산 2. 인접 영역의 값을 copy함

smoothing

현재 위치의 pixel과 이웃 pixel값을 평균으로 결정
단점: 1. 영상의 선명도가 떨어짐
장점: 1. 노이즈 제거, 2. 끊어진 edge연결

dstList =[] dstList.append(cv2.cvtColor(src, cv2.COLOR_BGR2RGB)) for i in list(range(1,10)): kernel = np.ones((i,i), np.float32)/(i*i) dst = cv2.filter2D(src, -1, kernel) dstList.append(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)) fig, axes = plt.subplots(2,5) for i in range(2): for j in range(5): axes[i, j].imshow(dstList[i*5 + j]) axes[i, j].set_title('{}'.format(i*5+j)) plt.show()

Sharpening

목적방법edge 검출라플라시안(Laplacian) Mask, 마스크 합은 0선명도 업라플라시안 Mask합을 1로 함, 중앙 값을 1 더함, 합이 1임

blur

box형태의 kernel을 이미지에 적용한 후 평균 값을 box의 중심점에 적용함
boxFilter() 와 같은 기능
cv2.blur(src, ksize=3) #cv2.boxFilter()

GaussianBlur

방법: 중심에 있는 픽셀에 높은 가중치 부여함
차이: 일반 blur 모든 픽셀에 똑 같은 가중치를 부여
목적:
edge가 남아 있는 가운데 blur이된다.
Canny로 에지 검출전 노이즈 제거 목적
blur = cv2.GaussianBlur(src, (5,5), 0) blur = cv2.GaussianBlur(src, (5,5), 100)

medianBlur

kernel window와 pixel의 값들을 정렬한 후 중간 값을 선택함
salt-and-pepper noise 제거에 탁월
목적: 무작위 노이즈 제거 효과(화이트 노이즈)
단점: 에지가 사라 질 수도 있음
kernel window가 다음과 같다면 해당 값들을 오름차순 정렬한다.
|102|67|84| |224|189|33| |212|163|54|
33, 54, 67, 84, _102_, 163, 189, 212, 224 이중에 102가 중간 값이고 중앙에 있는 189를 102으로 변경한다.
dst2 = cv2.medianBlur(src, ksize=7) # ksize는 1보다 큰 홀수

Bilateral Filter

목적: 에지를 보존하면서 노이즈 감소
경계선을 유지하면서 Gaussian Blur처리 함
src: 입력 이미지
dst: 출력 이미지
d: 필터링에 이용하는 이웃한 픽셀의 지름을 정의 불가능한 경우 sigmaspace를 사용
sigmaColor: 클수록 이웃한 픽셀과 기준 색상의 영향이 컨진다.
sigmaSpace: 값이 클수록 긴밀하게 주변 픽셀에 영향을 미친다. d>0이면 영향을 받지 않음, d<=0 면 d 값에 비례함
from matplotlib import pyplot as plt import cv2 src = cv2.imread('img.png') dst1 = cv2.bilateralFilter(src, d=10, sigmaColor=50, sigmaSpace=50) dst2 = cv2.bilateralFilter(src, d=-1, sigmaColor=50, sigmaSpace=50) # d<0 이면 sigmaSpace영향을 받는다. fig, ax0 = plt.subplots(3,3) ax0[0,0].imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB)) ax0[1,0].imshow(cv2.cvtColor(dst1, cv2.COLOR_BGR2RGB)) ax0[1,1].imshow(cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB)) ax0[0,0].set_title('origin') ax0[1,0].set_title('d=10') ax0[1,1].set_title('d=-1') ax0[0,0].axis('off') ax0[1,0].axis('off') ax0[1,1].axis('off') plt.show()

728x90
반응형