일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- CNN
- E-P1
- install
- 알고리즘
- mean
- index
- 삼성소프트웨어멤버십
- GT-S80
- imread
- pip
- SciPy
- keras
- GitHub
- Series
- Button
- DFS
- synology
- Numpy
- dataframe
- LSTM
- pycharm
- SPL
- Splunk
- mariadb
- Lotto
- Python
- pandas
- RNN
- javascript
- ipad
- Today
- Total
잠토의 잠망경
[OpenCV] Filter 본문
Filter 종류
하기 내용을 참고 하였습니다.
https://webnautes.tistory.com/1255
Filter | Contents |
---|---|
convolution | Kernel과 src과 곱하고 |
blur | kernel과 src과 곱, 평균 |
GaussianBlur | |
medianBlur | |
BilateralFilter | 선형 처리 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()