๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[v0.19]์˜์ƒ์ฒ˜๋ฆฌ_ ํ•„ํ„ฐ์™€ ์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ, ๋ธ”๋Ÿฌ๋ง ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/Image Processing

[v0.19]์˜์ƒ์ฒ˜๋ฆฌ_ ํ•„ํ„ฐ์™€ ์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ, ๋ธ”๋Ÿฌ๋ง

์ง•์ง•์•ŒํŒŒ์นด 2022. 1. 8. 01:45
728x90
๋ฐ˜์‘ํ˜•

220108 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ๊ท€ํ‰์ด ์„œ์žฌ๋‹˜์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://bkshin.tistory.com/entry/OpenCV-17-%ED%95%84%ED%84%B0Filter%EC%99%80-%EC%BB%A8%EB%B3%BC%EB%A3%A8%EC%85%98Convolution-%EC%97%B0%EC%82%B0-%ED%8F%89%EA%B7%A0-%EB%B8%94%EB%9F%AC%EB%A7%81-%EA%B0%80%EC%9A%B0%EC%8B%9C%EC%95%88-%EB%B8%94%EB%9F%AC%EB%A7%81-%EB%AF%B8%EB%94%94%EC%96%B8-%EB%B8%94%EB%9F%AC%EB%A7%81-%EB%B0%94%EC%9D%B4%EB%A0%88%ED%84%B0%EB%9F%B4-%ED%95%84%ED%84%B0?category=1148027 

 

OpenCV - 17. ํ•„ํ„ฐ(Filter)์™€ ์ปจ๋ณผ๋ฃจ์…˜(Convolution) ์—ฐ์‚ฐ, ํ‰๊ท  ๋ธ”๋Ÿฌ๋ง, ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง, ๋ฏธ๋””์–ธ ๋ธ”๋Ÿฌ๋ง,

์ด๋ฒˆ ํฌ์ŠคํŒ…๋ถ€ํ„ฐ๋Š” ์˜์ƒ ํ•„ํ„ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ… ์—ญ์‹œ 'ํŒŒ์ด์ฌ์œผ๋กœ ๋งŒ๋“œ๋Š” OpenCV ํ”„๋กœ์ ํŠธ(์ด์„ธ์šฐ ์ €)'๋ฅผ ์ •๋ฆฌํ•œ ๊ฒƒ์ž„์„ ๋ฐํž™๋‹ˆ๋‹ค. ์ฝ”๋“œ: github.com/BaekKyunShin/OpenCV_Project_Python/tree

bkshin.tistory.com

 

 

 

 

 

1. ํ•„ํ„ฐ (Filter)์™€ ์ปจ๋ณผ๋ฃจ์…˜ (Convolution)

๊ณต๊ฐ„ ์˜์—ญ ํ•„ํ„ฐ๋ง(spacial domain filtering)

: ์ƒˆ๋กœ์šด ํ”ฝ์…€ ๊ฐ’์„ ์–ป์„ ๋•Œ ํ•˜๋‚˜์˜ ํ”ฝ์…€ ๊ฐ’์ด ์•„๋‹Œ ๊ทธ ์ฃผ๋ณ€ ํ”ฝ์…€๋“ค์˜ ๊ฐ’์„ ํ™œ์šฉ

: ์—ฐ์‚ฐ ๋Œ€์ƒ ํ”ฝ์…€๊ณผ ๊ทธ ์ฃผ๋ณ€ ํ”ฝ์…€๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”ฝ์…€ ๊ฐ’์„ ์–ป๋Š” ๋ฐฉ๋ฒ•

 

๋ธ”๋Ÿฌ๋ง(Blurring)

: ๊ธฐ์กด์˜ ์˜์ƒ์„ ํ๋ฆฟํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ž‘์—…

 

์ปค๋„(kernel)

: ์ฃผ๋ณ€ ํ”ฝ์…€์„ ์–ด๋Š ๋ฒ”์œ„๊นŒ์ง€ ํ™œ์šฉํ• ์ง€ ๊ทธ๋ฆฌ๊ณ  ์—ฐ์‚ฐ์€ ์–ด๋–ป๊ฒŒ ํ• ์ง€๋ฅผ ๊ฒฐ์ •

: ์œˆ๋„(window), ํ•„ํ„ฐ(filter), ๋งˆ์Šคํฌ(mask)๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค

3 x 3 ์ปค๋„๋กœ ์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ

์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ

: ์ผ๋Œ€์ผ๋กœ ๋Œ€์‘ํ•˜๋Š” ์œ„์น˜์— ์žˆ๋Š” ์ปค๋„์˜ ์š”์†Œ์™€ ๋Œ€์‘ํ•˜๋Š” ์ž…๋ ฅ ํ”ฝ์…€ ๊ฐ’์„ ๊ณฑํ•ด์„œ ๋ชจ๋‘ ํ•ฉํ•œ ๊ฒƒ์„

๊ฒฐ๊ณผ ํ”ฝ์…€ ๊ฐ’์œผ๋กœ ๊ฒฐ์ •

: ์—ฐ์‚ฐ์„ ๋งˆ์ง€๋ง‰ ํ”ฝ์…€๊นŒ์ง€ ๋ฐ˜๋ณต

์ถœ์ฒ˜:&amp;amp;nbsp;https://www.slipp.net/wiki/pages/viewpage.action?pageId=26641520

dst = cv2.filter2D(src, ddepth, kernel, dst, anchor, delta, borderType)

: ์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐํ•˜๊ธฐ
- src : ์ž…๋ ฅ ์˜์ƒ, Numpy ๋ฐฐ์—ด
- ddepth: ์ถœ๋ ฅ ์˜์ƒ์˜ dtype (-1: ์ž…๋ ฅ ์˜์ƒ๊ณผ ๋™์ผ)
- kernel: ์ปจ๋ณผ๋ฃจ์…˜ ์ปค๋„, float32์˜ n x n ํฌ๊ธฐ ๋ฐฐ์—ด
- dst(optional): ๊ฒฐ๊ณผ ์˜์ƒ
- anchor(optional): ์ปค๋„์˜ ๊ธฐ์ค€์ , default: ์ค‘์‹ฌ์  (-1, -1)
- delta(optional): ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋œ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€ํ•  ๊ฐ’borderType(optional): ์™ธ๊ณฝ ํ”ฝ์…€ ๋ณด์ • ๋ฐฉ๋ฒ• ์ง€์ •

 

 

 

 

 

2. ํ‰๊ท  ๋ธ”๋Ÿฌ๋ง (Average Blurring)

๋ธ”๋Ÿฌ๋ง์€ ์ดˆ์ ์ด ๋งž์ง€ ์•Š๋“ฏ์ด ์˜์ƒ์„ ํ๋ฆฟํ•˜๊ฒŒ ํ•˜๋Š” ์ž‘์—…

: ํ‰๊ท  ๋ธ”๋Ÿฌ๋ง์€ ์ฃผ๋ณ€ ํ”ฝ์…€ ๊ฐ’๋“ค์˜ ํ‰๊ท ์„ ์ ์šฉ

: ์ฃผ๋ณ€ ํ”ฝ์…€๋“ค์˜ ํ‰๊ท ๊ฐ’์„ ์ ์šฉํ•˜๋ฉด ํ”ฝ์…€ ๊ฐ„ ์ฐจ์ด๊ฐ€ ์ ์–ด์ ธ ์„ ๋ช…๋„๊ฐ€ ๋–จ์–ด์ ธ ์ „์ฒด์ ์œผ๋กœ ํ๋ฆฟํ•˜๋‹ค

# ํ‰๊ท  ํ•„ํ„ฐ๋ฅผ ์ƒ์ƒํ•˜์—ฌ ๋ธ”๋Ÿฌ ์ ์šฉ
import cv2
import numpy as np

img = cv2.imread('img/night.jpg')
'''
#5x5 ํ‰๊ท  ํ•„ํ„ฐ ์ปค๋„ ์ƒ์„ฑ    ---โ‘ 
kernel = np.array([[0.04, 0.04, 0.04, 0.04, 0.04],
                   [0.04, 0.04, 0.04, 0.04, 0.04],
                   [0.04, 0.04, 0.04, 0.04, 0.04],
                   [0.04, 0.04, 0.04, 0.04, 0.04],
                   [0.04, 0.04, 0.04, 0.04, 0.04]])
'''
# 5x5 ํ‰๊ท  ํ•„ํ„ฐ ์ปค๋„ ์ƒ์„ฑ  ---โ‘ก
kernel = np.ones((5,5))/5**2
# ํ•„ํ„ฐ ์ ์šฉ             ---โ‘ข
blured = cv2.filter2D(img, -1, kernel)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
cv2.imshow('origin', img)
cv2.imshow('avrg blur', blured) 
cv2.waitKey()
cv2.destroyAllWindows()

&amp;amp;nbsp;5 x 5 ํ‰๊ท  ๋ธ”๋Ÿฌ๋ง ํ•„ํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ปจ๋ณผ๋ฃจ์…˜ ์—ฐ์‚ฐ

# 5x5 ํ‰๊ท  ๋ธ”๋Ÿฌ๋ง ํ•„ํ„ฐ ์ปค๋„ ์ƒ์„ฑ

kernel = np.ones((5,5))/5**2

- 5 x 5 ํ•„ํ„ฐ์˜ ์š”์†Œ ๊ฐœ์ˆ˜์ธ 5**2(=25)๋กœ ๋‚˜๋ˆ„๊ธฐ

 

์ถœ์ฒ˜:&amp;amp;nbsp;https://hsg2510.tistory.com/112

- ํ•„ํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก ํ‰๊ท  ๋ธ”๋Ÿฌ๋ง์„ ์ ์šฉํ–ˆ์„ ๋•Œ ์„ ๋ช…๋„๊ฐ€ ๋” ๋–จ์–ด์ง„๋‹ค

 

 

 

 

+) opencv ์˜ ํ‰๊ท  ๋ธ”๋Ÿฌ๋ง ํ•จ์ˆ˜

dst = cv2.blur(src, ksize, dst, anchor, borderType)

: ์ปค๋„์˜ ํฌ๊ธฐ๋งŒ ์ •ํ•ด์ฃผ๋ฉด ์•Œ์•„์„œ ํ‰๊ท  ์ปค๋„์„ ์ƒ์„ฑํ•ด์„œ ํ‰๊ท  ๋ธ”๋Ÿฌ๋ง์„ ์ ์šฉํ•œ ์˜์ƒ์„ ์ถœ๋ ฅ

: ์ปค๋„ ํฌ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ™€์ˆ˜


- src : ์ž…๋ ฅ ์˜์ƒ, numpy ๋ฐฐ์—ด
- ksize : ์ปค๋„์˜ ํฌ๊ธฐ
- ๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” cv2.filter2D()์™€ ๋™์ผ

 

dst = cv2.boxFilter(src, ddepth, ksize, dst, anchor, normalize, borderType)

: normalize์— True๋ฅผ ์ „๋‹ฌํ•˜๋ฉด cv2.blur() ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ

 

- ddepth : ์ถœ๋ ฅ ์˜์ƒ์˜ dtype (-1: ์ž…๋ ฅ ์˜์ƒ๊ณผ ๋™์ผ)

- normalize(optional) : ์ปค๋„ ํฌ๊ธฐ๋กœ ์ •๊ทœํ™”(1/ksize²) ์ง€์ • ์—ฌ๋ถ€ (Boolean), default=True

- ๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” cv2.filter2D()์™€ ๋™์ผ

# ๋ธ”๋Ÿฌ ์ „์šฉ ํ•จ์ˆ˜๋กœ ๋ธ”๋Ÿฌ๋ง ์ ์šฉ
import cv2
import numpy as np

file_name = 'img/taekwonv1.jpg'
img = cv2.imread(file_name)

# blur() ํ•จ์ˆ˜๋กœ ๋ธ”๋Ÿฌ๋ง  ---โ‘ 
blur1 = cv2.blur(img, (10,10))
# boxFilter() ํ•จ์ˆ˜๋กœ ๋ธ”๋Ÿฌ๋ง ์ ์šฉ ---โ‘ก
blur2 = cv2.boxFilter(img, -1, (10,10))

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
merged = np.hstack( (img, blur1, blur2))
cv2.imshow('blur', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

&amp;amp;nbsp;cv2.blur() ํ•จ์ˆ˜์™€ cv2.boxFilter() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‰๊ท  ๋ธ”๋Ÿฌ๋ง

- ๋‘ ํ•จ์ˆ˜ ๋™์ผํ•œ ์ด๋ฏธ์ง€ ์ถœ๋ ฅ !

 

 

 

 

 

3. ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง(Gaussian Blurring)

: ๊ฐ€์šฐ์‹œ์•ˆ ๋ถ„ํฌ๋ฅผ ๊ฐ–๋Š” ์ปค๋„๋กœ ๋ธ”๋Ÿฌ๋ง ํ•˜๋Š” ๊ฒƒ

: ๊ฐ€์šฐ์‹œ์•ˆ ๋ถ„ํฌ(gaussian distribution)๋ž€ ์ •๊ทœ ๋ถ„ํฌ(normal distribution)์ด๋ผ๊ณ ๋„ ํ•จ

: ํ‰๊ท  ๊ทผ์ฒ˜์— ๋ชฐ๋ ค ์žˆ๋Š” ๊ฐ’๋“ค์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ๊ณ  ํ‰๊ท ์—์„œ ๋ฉ€์–ด์งˆ์ˆ˜๋ก ๊ทธ ๊ฐœ์ˆ˜๊ฐ€ ์ ์–ด์ง€๋Š” ๋ถ„ํฌ

: ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง ์ปค๋„์€ ์ค‘์•™๊ฐ’์ด ๊ฐ€์žฅ ํฌ๊ณ  ์ค‘์•™์—์„œ ๋ฉ€์–ด์งˆ์ˆ˜๋ก ๊ทธ ๊ฐ’์ด ์ž‘์•„์ง„๋‹ค

์ถœ์ฒ˜:&amp;amp;nbsp;https://hsg2510.tistory.com/112

 

- ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง ์ปค๋„์„ ์ ์šฉํ•˜๋ฉด ๋Œ€์ƒ ํ”ฝ์…€์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ๋งŽ์€ ์˜ํ–ฅ์„ ์ฃผ๊ณ ,

๋ฉ€์–ด์งˆ์ˆ˜๋ก ์ ์€ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—

์›๋ž˜์˜ ์˜์ƒ๊ณผ ๋น„์Šทํ•˜๋ฉด์„œ๋„ ๋…ธ์ด์ฆˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํšจ๊ณผ

 

cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)

: ์ปค๋„ ํฌ๊ธฐ์™€ ํ‘œ์ค€ ํŽธ์ฐจ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง์„ ์ ์šฉ


- src : ์ž…๋ ฅ ์˜์ƒ
- ksize : ์ปค๋„ ํฌ๊ธฐ (์ฃผ๋กœ ํ™€์ˆ˜)
- sigmaX : X ๋ฐฉํ–ฅ ํ‘œ์ค€ํŽธ์ฐจ (0: auto)      -> ์ž๋™์œผ๋กœ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉ
- sigmaY(optional) : Y ๋ฐฉํ–ฅ ํ‘œ์ค€ํŽธ์ฐจ (default: sigmaX)     -> ์ƒ๋žตํ•˜๋ฉด sigmaX ๊ฐ’๊ณผ ๋™์ผ
- borderType(optional) : ์™ธ๊ณฝ ํ…Œ๋‘๋ฆฌ ๋ณด์ • ๋ฐฉ์‹

 

ret = cv2.getGaussianKernel(ksize, sigma, ktype)

: ์ปค๋„ ํฌ๊ธฐ์™€ ํ‘œ์ค€ ํŽธ์ฐจ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ๋ฅผ ๋ฐ˜ํ™˜

: ๋ฐ˜ํ™˜๋œ ํ•„ํ„ฐ๋Š” 1์ฐจ์›์ด๋ฏ€๋กœ cv2.filter2D() ํ•จ์ˆ˜์— ์‚ฌ์šฉํ•˜๋ ค๋ฉด ret * ret.T์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ

 

- ret : ๊ฐ€์šฐ์‹œ์•ˆ ์ปค๋„ (1์ฐจ์›์ด๋ฏ€๋กœ ret * ret.T ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•จ)

# ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง
import cv2
import numpy as np

img = cv2.imread('img/gaussian_noise.jpg')

# ๊ฐ€์šฐ์‹œ์•ˆ ์ปค๋„์„ ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ ๋ธ”๋Ÿฌ๋ง  ---โ‘ 
k1 = np.array([[1, 2, 1],
                   [2, 4, 2],
                   [1, 2, 1]]) *(1/16)
blur1 = cv2.filter2D(img, -1, k1)

# ๊ฐ€์šฐ์‹œ์•ˆ ์ปค๋„์„ API๋กœ ์–ป์–ด์„œ ๋ธ”๋Ÿฌ๋ง ---โ‘ก
k2 = cv2.getGaussianKernel(3, 0)
blur2 = cv2.filter2D(img, -1, k2*k2.T)

# ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ API๋กœ ๋ธ”๋Ÿฌ๋ง ---โ‘ข
blur3 = cv2.GaussianBlur(img, (3, 3), 0)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print('k1:', k1)
print('k2:', k2*k2.T)
merged = np.hstack((img, blur1, blur2, blur3))
cv2.imshow('gaussian blur', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์˜ ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง

- ์ฒซ ๋ฒˆ์งธ๋Š” ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ cv2.filter2D() ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ๋ธ”๋Ÿฌ๋ง

- ๋‘ ๋ฒˆ์งธ๋Š” cv2.getGaussianKernel() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ€์šฐ์‹œ์•ˆ ์ปค๋„ ์–ป๊ณ  cv2.filter2D() ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ๋ธ”๋Ÿฌ๋ง

- ์„ธ ๋ฒˆ์งธ๋Š” cv2.GaussianBlur() ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•„ํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๊ตฌํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง์„ ์ ์šฉ

- ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง์€ ๋…ธ์ด์ฆˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํšจ๊ณผ

 

 

 

 

 

4. ๋ฏธ๋””์–ธ ๋ธ”๋Ÿฌ๋ง(Median Blurring)

: ์ปค๋„์˜ ํ”ฝ์…€ ๊ฐ’ ์ค‘ ์ค‘์•™๊ฐ’์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ

: ๋ฏธ๋””์–ธ ๋ธ”๋Ÿฌ๋ง์€ ์†Œ๊ธˆ-ํ›„์ถ” ์žก์Œ์„ ์ œ๊ฑฐํ•˜๋Š” ํšจ๊ณผ

: ์†Œ๊ธˆ-ํ›„์ถ” ์žก์Œ์ด๋ž€ ์ด๋ฏธ์ง€์— ์†Œ๊ธˆ๊ณผ ํ›„์ถ”๋ฅผ ๋ฟŒ๋ฆฐ ๊ฒƒ๊ณผ ๊ฐ™์ด ์ƒ๊ธด ์žก์Œ

 

dst = cv2.medianBlur(src, ksize)
src: ์ž…๋ ฅ ์˜์ƒ
ksize: ์ปค๋„ ํฌ๊ธฐ

# ๋ฏธ๋””์–ธ ๋ธ”๋Ÿฌ๋ง
import cv2
import numpy as np

img = cv2.imread("img/salt_pepper_noise.jpg")

# ๋ฏธ๋””์–ธ ๋ธ”๋Ÿฌ ์ ์šฉ --- โ‘ 
blur = cv2.medianBlur(img, 5)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ 
merged = np.hstack((img,blur))
cv2.imshow('media', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

&amp;amp;nbsp;๋ฏธ๋””์–ธ ๋ธ”๋Ÿฌ๋ง์„ ์ ์šฉํ•˜๋‹ˆ ์†Œ๊ธˆ-ํ›„์ถ” ์žก์Œ์ด ์ œ๊ฑฐ

 

 

 

 

 

5. ๋ฐ”์ด๋ ˆํ„ฐ๋Ÿด ํ•„ํ„ฐ(Bilateral Filter)

: ๊ฒฝ๊ณ„๋ฅผ ํ๋ฆฟํ•˜๊ฒŒ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ณด์™„

: ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ์™€ ๊ฒฝ๊ณ„ ํ•„ํ„ฐ๋ฅผ ๊ฒฐํ•ฉ

: ๊ฒฝ๊ณ„๋„ ๋šœ๋ ทํ•˜๊ณ  ๋…ธ์ด์ฆˆ๋„ ์ œ๊ฑฐ๋˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค

 

dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst, borderType)
- src : ์ž…๋ ฅ ์˜์ƒ
- d : ํ•„ํ„ฐ์˜ ์ง๊ฒฝ(diameter), 5๋ณด๋‹ค ํฌ๋ฉด ๋งค์šฐ ๋Š๋ฆผ
- sigmaColor : ์ƒ‰๊ณต๊ฐ„์˜ ์‹œ๊ทธ๋งˆ ๊ฐ’
- sigmaSpace : ์ขŒํ‘œ ๊ณต๊ฐ„์˜ ์‹œ๊ทธ๋งˆ ๊ฐ’

# ๋ฐ”์ด๋ ˆํ„ฐ๋Ÿด ํ•„ํ„ฐ์™€ ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ ๋น„๊ต
import cv2
import numpy as np

img = cv2.imread("img/gaussian_noise.jpg")

# ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ ์ ์šฉ ---โ‘ 
blur1 = cv2.GaussianBlur(img, (5,5), 0)

# ๋ฐ”์ด๋ ˆํ„ฐ๋Ÿด ํ•„ํ„ฐ ์ ์šฉ ---โ‘ก
blur2 = cv2.bilateralFilter(img, 5, 75, 75)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
merged = np.hstack((img, blur1, blur2))
cv2.imshow('bilateral', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ๋ฐ”์ด๋ ˆํ„ฐ๋Ÿด ํ•„ํ„ฐ

 

- ๊ฐ€์šฐ์‹œ์•ˆ์€ ๊ฒฝ๊ณ„๊ฐ’ ํ๋ฆฟ, ๋” ํ๋ฆฌ๋ฉํ……..

- ๋ฐ”์ด๋ ˆํ„ฐ๋Ÿด์€ ๋…ธ์ด์ฆˆ ์ค„๋ฉด์„œ ๊ฒฝ๊ณ„๊ฐ’ ์œ ์ง€, ๊ฐ€์šฐ์‹œ์•ˆ๋ณด๋‹จ ์„ ๋ช… ๋šœ๋ ท

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments