▶ 영상 공간 필터링
- 개념
- 영상에서 원하는 정보는 통과, 나머지는 걸러내는 작업
- 대표적인 필터 : 잡음 제거, 부드러운 성분 제거.
- 필터(마스크, 커널, 윈도우,...)와 합성곱 연산
▷ 합성곱 연산
▶ 경계선 처리
현재는 하이퍼파라미터로 BORDER_CONSTANT로 적용된다.
BlurFilter
영상을 부드럽게 하는 필터
- cv2.boxFilter, cv2.blur
- cv2.GaussianBlur
- cv2.BILATERALFILTER
- cv2.medianBlur
▶ GaussianBlur
▶ bilateralFilter
- 가우시안 필터를 양방향으로 두번 실행한다.
- 가우시안 잡음에 효과적이다.
- 엣지가 아닌 부분에서만 블러링을 한다.
▶ Edge-preserving noise removal filter
▶ MedianBlur
bilateralFilter에 비해 계산량이 적은것이 장점.
▶ 미분과 경사도
- 함수 또는 데이터의 변화율
- 함수의 순간 변화율
▷ 1차 미분과 차분
▷ 2차 미분과 차분
▷ 차분의 종류
▶ 2차원 함수의 편미분
- 2차원 함수의 편미분
▶ 영상에서의 경사도
- 크기와 방향
▶ 영상에서의 2차 미분
- 라플라시안 (Laplacian)
- 1차 미분은 엣지 존재 여부 파악
- 2차 미분은 엣지 밝기 변화 파악 가능
- 에지 위치에 zero-crossing
- 밝기 값이 점차적으로 변화되는 영역에 대해서는 반응을 보이지 않음
- 잡음에 민감
▶ 샤프닝 필터링
- 언샤프 마스크 필터
- 블러링이 적용된 날카롭지 않은 영상을 만드는$ 필터링
▶ 일반적 필터링
- 컨볼루션 연산
- 마스크르르 사용자가 지정
▶ 영상과 마스크의 합성곱
- cv2.filter2D
- Kernel을 통해 이미지를 필터링
- cv2.sepFilter2D
- 이미지의 x, y를 각각의 커널을 통해 필터링
Blur Filter¶
cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None) -> dst
• src: 입력 영상. 각 채널 별로 처리됨.
• dst: 출력 영상. src와 같은 크기, 같은 타입.
• ksize: 가우시안 커널 크기. (0, 0)을 지정하면 sigma 값에 의해 자동 결정됨
• sigmaX: x방향 sigma.
• sigmaY: y방향 sigma. 0이면 sigmaX와 같게 설정.
• borderType: 가장자리 픽셀 확장 방식.
굳이 잘 안쓴다.
cv2.medianBlur(src, ksize, dst=None) -> dst
• src : 입력 영상. 각 채널 별로 처리됨
• ksize : 커널 크기. 1보다 큰 홀수를 지정. 숫자 하나를 집어주면 됌
• dst : 출력 영상, src와 같은 크기, 같은 타입
import cv2
import numpy as np
lena = cv2.imread('./image/lena.jpg')
blur = cv2.blur(lena, (10, 10))
boxFilter = cv2.boxFilter(lena, -1, (10, 10))
GaussianBlur = cv2.GaussianBlur(lena, (0,0), 20)
medianBlur = cv2.medianBlur(lena, 11)
bf100_50 = cv2.bilateralFilter(lena, -1, 100, 50)
cv2.imshow('blur', blur)
cv2.imshow('boxFilter', boxFilter)
cv2.imshow('GaussianBlur', GaussianBlur)
cv2.imshow('medianBlur', medianBlur)
cv2.imshow('bilateralFilter', bf100_50)
cv2.waitKey()
cv2.destroyAllWindows()
넘파이로 bordertype에 의한 변화 확인¶
import cv2
import numpy as np
src1 = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=np.uint8)
dst1 = np.zeros(shape=(3,3))
for i in range(3) :
for j in range(3) :
dst1[i, j] = np.mean(src1[i:i+3, j:j+3])
dst1 = np.uint8(dst1)
cv2.boxFilter(src1, -1, (3, 3), borderType=cv2.BORDER_CONSTANT)
array([[1, 2, 2],
[3, 5, 4],
[3, 4, 3]], dtype=uint8)
BorderType에 따른 변화 확인¶
import cv2
import numpy as np
lena = cv2.imread('./image/lena.jpg')
constant = cv2.boxFilter(lena, -1, (30, 30), borderType=cv2.BORDER_CONSTANT)
replicate = cv2.boxFilter(lena, -1, (30, 30), borderType=cv2.BORDER_REPLICATE)
reflect = cv2.boxFilter(lena, -1, (30, 30), borderType=cv2.BORDER_REFLECT)
reflect_101= cv2.boxFilter(lena, -1, (30, 30), borderType=cv2.BORDER_REFLECT_101)
cv2.imshow('constant', constant)
cv2.imshow('replicate', replicate)
cv2.imshow('reflect', reflect)
cv2.imshow('reflect_101', reflect_101)
cv2.waitKey()
cv2.destroyAllWindows()
bilateralFilter¶
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None) -> dst
• src: 입력 영상. 8비트 또는 실수형, 1채널 또는 3채널.
• d: 필터링에 사용될 이웃 픽셀의 거리(지름), 음수(-1)를 입력하면 sigmaSpace 값에 의해 자동 결정(권장)
• sigmaColor: 색 공간에서 필터의 표준 편차
• sigmaSpace: 좌표 공간에서 필터의 표준 편차
• dst: 출력 영상. src와 같은 크기, 같은 타입.
• borderType: 가장자리 픽셀 처리 방식
import cv2
import numpy as np
lena = cv2.imread('./image/lena.jpg')
bf10_5 = cv2.bilateralFilter(lena, -1, 10, 5)
bf100_80 = cv2.bilateralFilter(lena, -1, 100, 80)
bf100_50 = cv2.bilateralFilter(lena, -1, 100, 50)
cv2.imshow('lena', lena)
cv2.imshow('bf10_5', bf10_5)
cv2.imshow('bf100_80', bf100_80)
cv2.imshow('bf100_50', bf100_50)
cv2.waitKey()
cv2.destroyAllWindows()
medianBlur¶
cv2.medianBlur(src, ksize, dst=None) -> dst
• src : 입력 영상. 각 채널 별로 처리됨
• ksize : 커널 크기. 1보다 큰 홀수를 지정. 숫자 하나를 집어주면 됌
• dst : 출력 영상, src와 같은 크기, 같은 타입
import cv2
import numpy as np
lena = cv2.imread('./image/lena.jpg')
medianBlur2 = cv2.medianBlur(lena, 11)
medianBlur51 = cv2.medianBlur(lena, 51)
medianBlur101 = cv2.medianBlur(lena, 101)
cv2.imshow('medianBlur2', medianBlur11)
cv2.imshow('medianBlur51', medianBlur51)
cv2.imshow('medianBlur101', medianBlur101)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
import numpy as np
lena = cv2.imread('./image/lena.jpg')
medianBlur2 = cv2.medianBlur(lena, 11)
medianBlur51 = cv2.medianBlur(lena, 51)
medianBlur101 = cv2.medianBlur(lena, 101)
cv2.imshow('medianBlur2', medianBlur11)
cv2.imshow('medianBlur51', medianBlur51)
cv2.imshow('medianBlur101', medianBlur101)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
import numpy as np
lena = cv2.imread('./image/saltNpepper_lena.png')
lena_mb= cv2.medianBlur(lena, 3)
titanic = cv2.imread('./image/saltNpepper_tit.png')
titanic_mb= cv2.medianBlur(titanic, 11)
athens = cv2.imread('./image/saltNpepper_athens.png')
athens_mb = cv2.medianBlur(athens, 7)
wall = cv2.imread('./image/saltNpepper_wall.png')
wall_mb = cv2.medianBlur(wall, 9)
cv2.imshow('lena', lena)
cv2.imshow('lena_mb', lena_mb)
cv2.imshow('titanic', titanic)
cv2.imshow('titanic_mb', titanic_mb)
cv2.imshow('athens', athens)
cv2.imshow('athens_mb', athens_mb)
cv2.imshow('wall', wall)
cv2.imshow('wall_mb', wall_mb)
cv2.waitKey()
cv2.destroyAllWindows()
bilateralFilter으로는 안됨¶
import cv2
import numpy as np
lena = cv2.imread('./image/saltNpepper_lena.png')
lena_bf = cv2.bilateralFilter(lena, -1, 100, 90)
titanic = cv2.imread('./image/saltNpepper_tit.png')
titanic_bf = cv2.bilateralFilter(titanic, -1, 100, 90)
athens = cv2.imread('./image/saltNpepper_athens.png')
athens_bf = cv2.bilateralFilter(athens, -1, 100, 90)
wall = cv2.imread('./image/saltNpepper_wall.png')
wall_bf = cv2.bilateralFilter(wall, -1, 100, 90)
cv2.imshow('lena', lena)
cv2.imshow('lena_bf', lena_bf)
cv2.imshow('titanic', titanic)
cv2.imshow('titanic_bf', titanic_bf)
cv2.imshow('athens', athens)
cv2.imshow('athens_bf', athens_bf)
cv2.imshow('wall', wall)
cv2.imshow('wall_bf', wall_bf)
cv2.waitKey()
cv2.destroyAllWindows()
sobel()¶
import cv2
import numpy as np
img = np.zeros(shape=(512,512), dtype=np.uint8)+255
pt1 = 200,200
pt2 = 300,300
src = cv2.rectangle(img, pt1, pt2, (0,0,0), -1)
gx = cv2.Sobel(src, ddepth=-1, dx=1, dy=0, ksize=3)
gy = cv2.Sobel(src, ddepth=-1, dx=0, dy=1, ksize=3)
gxo = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=3)
gyo = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=3)
print(‘- ddepth = -1’)
print(gx[195:205, 195:205])
print(gx[295:305, 295:305])
print(gy[195:205, 195:205])
print(gy[295:305, 295:305])
print(‘- ddepth = cv2.CV_32F’)
print(gxo[195:205, 195:205])
print(gxo[295:305, 295:305])
print(gyo[195:205, 195:205])
print(gyo[295:305, 295:305])
gxo = np.abs(gxo)
gyo = np.abs(gyo)
print(‘- 32F after absolute’)
print(gxo[195:205, 195:205])
print(gxo[295:305, 295:305])
print(gyo[195:205, 195:205])
print(gyo[295:305, 295:305])
gxo = np.sqrt(gxo)
gyo = np.sqrt(gyo)
print(‘- 32F after root’)
print(gxo[195:205, 195:205])
print(gxo[295:305, 295:305])
print(gyo[195:205, 195:205])
print(gyo[295:305, 295:305])
gxo = cv2.normalize(gxo, 0, 255, norm_type=cv2.NORM_MINMAX)
gyo = cv2.normalize(gyo, 0, 255, norm_type=cv2.NORM_MINMAX)
print(‘- 32F after stretching’)
print(gxo[195:205, 195:205])
print(gxo[295:305, 295:305])
print(gyo[195:205, 195:205])
print(gyo[295:305, 295:305])
cv2.imshow(‘src’, src)
cv2.imshow(‘gxo’, gxo)
cv2.imshow(‘gyo’, gyo)
cv2.imshow(‘gxo+gyo’, gxo+gyo)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -255. -255. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -765. -765. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -1020. -1020. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -1020. -1020. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -1020. -1020. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -1020. -1020. 0. 0. 0. 0.]]
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. -255. -255. 0. 0. 0.]
[ 0. 0. 0. 0. 0. -255. -255. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -255. -255. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -765. -765. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -1020. -1020. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -1020. -1020. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -1020. -1020. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -1020. -1020. 0. 0. 0. 0.]]
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. -255. -255. 0. 0. 0.]
[ 0. 0. 0. 0. 0. -255. -255. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
magnitude()¶
# sobel 적용 후 magnitude로 에지 추출
import cv2
import numpy as np
img = np.zeros(shape=(512,512), dtype=np.uint8)+255
pt1 = 200,200
pt2 = 300,300
src = cv2.rectangle(img, pt1, pt2, (0,0,0), -1)
gxo = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=3)
gyo = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=3)
mag = cv2.magnitude(gxo, gyo)
dstM = cv2.normalize(mag, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
cv2.imshow('src', src)
cv2.imshow('dstM', dstM)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
lena로 실습¶
# Lena, sobel 적용 후 magnitude로 에지 추출
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', 0)
gx = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=3)
gy = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=3)
gx1 = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=9)
gy1 = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=9)
mag = cv2.magnitude(gx, gy)
mag1 = cv2.magnitude(gx1, gy1)
dstM = cv2.normalize(mag, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
dstM1 = cv2.normalize(mag1, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
cv2.imshow('src', src)
cv2.imshow('dstM', dstM)
cv2.imshow('dstM1', dstM1)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
-1
laplacian()¶
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', 0)
lap = cv2.Laplacian(src, cv2.CV_32F)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(lap)
print('lap : ', minVal, maxVal, minLoc, maxLoc)
print(lap[:10, :10])
dst = cv2.convertScaleAbs(lap)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(dst)
print('lap : ', minVal, maxVal, minLoc, maxLoc)
print(lap[:10, :10])
dst2 = cv2.normalize(dst, None, 0, 255, cv2.NORM_MINMAX)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(dst2)
print('lap : ', minVal, maxVal, minLoc, maxLoc)
print(lap[:10, :10])
cv2.imshow('lap', lap)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
lap : -239.0 189.0 (404, 181) (221, 287)
[[ -4. 0. 2. 6. -9. 10. -7. 4. -7. 6.]
[ 1. 0. -1. 2. -9. 16. -8. 4. -6. 5.]
[ 0. 2. -4. 4. -9. 11. -7. 5. -10. 6.]
[ 4. -1. -3. 1. -6. 11. -6. 5. -10. 1.]
[ -3. -4. -1. 5. -5. 11. -11. 1. -5. -3.]
[ -1. -3. -3. 10. -8. 11. -11. 5. -1. -4.]
[ 0. -2. 1. 5. -6. 5. -8. 11. -1. -5.]
[ -2. -2. -1. 10. -15. 7. -10. 23. 9. -14.]
[ 6. 3. 0. 1. 4. -4. -4. 1. -38. 16.]
[ 3. 0. 0. -1. -1. -2. 1. 9. -9. 11.]]
lap : 0.0 239.0 (1, 0) (404, 181)
[[ -4. 0. 2. 6. -9. 10. -7. 4. -7. 6.]
[ 1. 0. -1. 2. -9. 16. -8. 4. -6. 5.]
[ 0. 2. -4. 4. -9. 11. -7. 5. -10. 6.]
[ 4. -1. -3. 1. -6. 11. -6. 5. -10. 1.]
[ -3. -4. -1. 5. -5. 11. -11. 1. -5. -3.]
[ -1. -3. -3. 10. -8. 11. -11. 5. -1. -4.]
[ 0. -2. 1. 5. -6. 5. -8. 11. -1. -5.]
[ -2. -2. -1. 10. -15. 7. -10. 23. 9. -14.]
[ 6. 3. 0. 1. 4. -4. -4. 1. -38. 16.]
[ 3. 0. 0. -1. -1. -2. 1. 9. -9. 11.]]
lap : 0.0 255.0 (1, 0) (404, 181)
[[ -4. 0. 2. 6. -9. 10. -7. 4. -7. 6.]
[ 1. 0. -1. 2. -9. 16. -8. 4. -6. 5.]
[ 0. 2. -4. 4. -9. 11. -7. 5. -10. 6.]
[ 4. -1. -3. 1. -6. 11. -6. 5. -10. 1.]
[ -3. -4. -1. 5. -5. 11. -11. 1. -5. -3.]
[ -1. -3. -3. 10. -8. 11. -11. 5. -1. -4.]
[ 0. -2. 1. 5. -6. 5. -8. 11. -1. -5.]
[ -2. -2. -1. 10. -15. 7. -10. 23. 9. -14.]
[ 6. 3. 0. 1. 4. -4. -4. 1. -38. 16.]
[ 3. 0. 0. -1. -1. -2. 1. 9. -9. 11.]]
-1
gaussian filter 적용¶
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', 0)
# 가우시안 핉저 적용
GaussianBlur = cv2.GaussianBlur(src, (3,3), 3)
# 1차 미분
gx = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=3)
gy = cv2.Sobel(src, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=3)
mag = cv2.magnitude(gx, gy)
dstM = cv2.normalize(mag, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
# 2차 미분
lap = cv2.Laplacian(src, cv2.CV_32F)
lap1 = cv2.Laplacian(GaussianBlur, cv2.CV_32F)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(lap)
print('lap : ', minVal, maxVal, minLoc, maxLoc)
print(lap[:10, :10])
dst = cv2.convertScaleAbs(lap)
dst1 = cv2.convertScaleAbs(lap1)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(dst)
print('lap : ', minVal, maxVal, minLoc, maxLoc)
print(lap[:10, :10])
dstM1 = cv2.normalize(dst, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
dstM2 = cv2.normalize(dst1, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(dst2)
print('lap : ', minVal, maxVal, minLoc, maxLoc)
print(lap[:10, :10])
cv2.imshow('src', src)
cv2.imshow('dstM', dstM)
cv2.imshow('dstM1', dstM1)
cv2.imshow('dstM2', dstM2)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
# 가우시안 블러로 잡음을 제거 한 후 2차 미분을 할 경우 잡음이 제거되는 효과를 볼 수 있다.
# 1차 미분에 비해 좋은 효과를 얻기 위해 손이 많이 가는 단점이 있었다.
lap : -239.0 189.0 (404, 181) (221, 287)
[[ -4. 0. 2. 6. -9. 10. -7. 4. -7. 6.]
[ 1. 0. -1. 2. -9. 16. -8. 4. -6. 5.]
[ 0. 2. -4. 4. -9. 11. -7. 5. -10. 6.]
[ 4. -1. -3. 1. -6. 11. -6. 5. -10. 1.]
[ -3. -4. -1. 5. -5. 11. -11. 1. -5. -3.]
[ -1. -3. -3. 10. -8. 11. -11. 5. -1. -4.]
[ 0. -2. 1. 5. -6. 5. -8. 11. -1. -5.]
[ -2. -2. -1. 10. -15. 7. -10. 23. 9. -14.]
[ 6. 3. 0. 1. 4. -4. -4. 1. -38. 16.]
[ 3. 0. 0. -1. -1. -2. 1. 9. -9. 11.]]
lap : 0.0 239.0 (1, 0) (404, 181)
[[ -4. 0. 2. 6. -9. 10. -7. 4. -7. 6.]
[ 1. 0. -1. 2. -9. 16. -8. 4. -6. 5.]
[ 0. 2. -4. 4. -9. 11. -7. 5. -10. 6.]
[ 4. -1. -3. 1. -6. 11. -6. 5. -10. 1.]
[ -3. -4. -1. 5. -5. 11. -11. 1. -5. -3.]
[ -1. -3. -3. 10. -8. 11. -11. 5. -1. -4.]
[ 0. -2. 1. 5. -6. 5. -8. 11. -1. -5.]
[ -2. -2. -1. 10. -15. 7. -10. 23. 9. -14.]
[ 6. 3. 0. 1. 4. -4. -4. 1. -38. 16.]
[ 3. 0. 0. -1. -1. -2. 1. 9. -9. 11.]]
lap : 0.0 255.0 (3, 0) (398, 179)
[[ -4. 0. 2. 6. -9. 10. -7. 4. -7. 6.]
[ 1. 0. -1. 2. -9. 16. -8. 4. -6. 5.]
[ 0. 2. -4. 4. -9. 11. -7. 5. -10. 6.]
[ 4. -1. -3. 1. -6. 11. -6. 5. -10. 1.]
[ -3. -4. -1. 5. -5. 11. -11. 1. -5. -3.]
[ -1. -3. -3. 10. -8. 11. -11. 5. -1. -4.]
[ 0. -2. 1. 5. -6. 5. -8. 11. -1. -5.]
[ -2. -2. -1. 10. -15. 7. -10. 23. 9. -14.]
[ 6. 3. 0. 1. 4. -4. -4. 1. -38. 16.]
[ 3. 0. 0. -1. -1. -2. 1. 9. -9. 11.]]
-1
unshapmask filter¶
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', cv2.IMREAD_GRAYSCALE)
blur = cv2.GaussianBlur(src, ksize=(3,3), sigmaX=0.0)
sharp = src - blur
ret = blur + sharp
ret1 = blur + sharp * 2
ret2 = src + sharp
ret3 = src + sharp * 2
cv2.imshow('src', src)
cv2.imshow('blur', blur)
cv2.imshow('sharp', sharp)
cv2.imshow('ret', ret)
cv2.imshow('ret1', ret1)
cv2.imshow('ret2', ret2)
cv2.imshow('ret3', ret3)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
-1
filter2D, sepFilter2D¶
filter2D : kernel을 통해 이미지를 필터링
sepFilter2D : 이미지의 KernelX, Kernely를 각각의 커널을 통해 필터링
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', cv2.IMREAD_GRAYSCALE)
dst = cv2.filter2D(src, -1, (3,3))
dst2 = cv2.sepFilter2D(src, cv2.CV_32F, 3, 3) # 조금 빠르다.
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
'Python' 카테고리의 다른 글
[Python] openCV : Labeling (0) | 2022.11.17 |
---|---|
[Python] openCV : Morphology (0) | 2022.11.17 |
[Python] openCV : Histogram (0) | 2022.11.10 |
[Python] openCV : normalization (0) | 2022.11.10 |
[Python] openCV : image access (0) | 2022.11.10 |