๐์ด ํฌ์คํธ์์ Gaussian Filter์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ก์์ ์ ๊ฑฐํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋๋ฝ๊ฒ ํด์ฃผ๊ณ ํฝ์ ๋ค ๋ง๋ค ๊ฐ์ค์น๋ฅผ ๋์ด ์ค์์ ์์นํ ํฝ์ ์ด ๊ฐ์ค์น๊ฐ ๋๊ณ ์ค์ ํฝ์ ์์ ๋ฉ์ด์ง์๋ก ๊ฐ์ค์น๋ฅผ ์ฝํ๊ฒ ๋๋ ํํฐ์ด๋ค.
๊ฐ์ฐ์์ ํํฐ๋ฅผ ์์์ผ๋ก ๋ณด๋ฉด
๋ก ํํํ ์ ์์ต๋๋ค.
์ ์์์ ๊ทธ๋ํ๋ก ์ดํดํด๋ณด๋ฉด
์ ๊ฐ์ต๋๋ค.
ํธ์ฐจ()๊ฐ ํฌ๋ฉด ํด์๋ก ๊ฐ์ค์น๋ค์ด ๋๋ฆฌ ๋ถํฌ ๋์ด ํ์ฑ๋๊ณ
ํธ์ฐจ๊ฐ ์์ผ๋ฉด ์์์๋ก ๊ฐ์ค์น๋ค์ด ์ค์์ ๋ฐ์งํ๊ฒ ๋๋ค.
gaussian_filter3x3 = np.array([[1, 2, 1],
[2, 4, 2],
[1, 2, 1]])
gaussian_filter3x3 = gaussian_filter3x3 / np.sum(gaussian_filter3x3)
gaussian_filter5x5 = np.array([[1, 2, 4, 2, 1],
[2, 4, 8, 4, 2],
[4, 8,16, 8, 4],
[2, 4, 8, 4, 2],
[1, 2, 4, 2, 1]])
gaussian_filter5x5 = gaussian_filter5x5 / np.sum(gaussian_filter5x5)
# 3x3
result_box3x3 = Convolution2D(box_filter3x3, image_man)
cv2_imshow(result_box3x3)
# 5x5
result_box5x5 = Convolution2D(box_filter5x5, image_man)
cv2_imshow(result_box5x5)
์ ์ฌ์ง๋ค์ ๋น๊ตํด๋ณด๋ฉด ํํฐ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐํจ์ ๋ฐ๋ผ smoothing ํจ๊ณผ๊ฐ ์์์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ๋ก ํ๊ท ํํฐ์ ๊ฐ์ฐ์์ํํฐ๋ฅผ ๋น๊ตํด๋ณด๊ฒ ์ต๋๋ค.
https://velog.io/@mykirk98/AVERAGE-FILTER
๐ํ๊ท ํํฐ์ ๋ํ ์ค๋ช
์ ์ด ํฌ์คํธ์ ์ค๋ช
๋์ด์์ผ๋ ๊ถ๊ธํ์๋ฉด ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
ํ๊ท ํํฐ์ ๊ฐ์ฐ์์ ํํฐ๋ฅผ ๋น๊ตํด๋ณด๋ฉด ์ฐจ์ด๊ฐ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
โ๏ธ๊ทธ ์ด์ ๋ ํํฐ์ ๊ฐ์ค์น ์ฐจ์ด์
๋๋ค. ๊ฐ์ฐ์์ ํํฐ๋ ํํฐ์ ์ค์์ผ๋ก ๊ฐ์๋ก ๊ฐ์ค์น๋ฅผ ๋๊ฒ ๋์ง๋ง, ํ๊ท ํํฐ๋ ๋ชจ๋ ์ธ๋ฑ์ค๊ฐ ๋ค ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ฏ๋ก ๊ฐ์ค์น๋ฅผ ๋๋ ๊ฐ์ฐ์์ ํํฐ๊ฐ ๋ฏธ์ธํ์ง๋ง ๋น๊ต์ ํ๊ท ํํฐ๋ณด๋ค ์ ๋ช
ํจ์ ๊ฐ์ง ์ ์์ต๋๋ค.
# size : ์ปค๋ ํฌ๊ธฐ sigma : ํ์คํธ์ฐจ (sigma^2 : ๋ถ์ฐ)
def Gaussian(size, sigma):
#์ค์ฌ์์๋ถํฐ์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
array = np.arange((size//2)*(-1), (size//2)+1)
#x^2+y^2 ๋ฐฐ์ด ์ด๊ธฐํ
xx_yy_array = np.zeros((size, size))
for x in range(size):
for y in range(size):
#์ค์ฌ์์๋ถํฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๊ณฑํฉ์ผ๋ก ๊ณ์ฐ
xx_yy_array[x,y] = array[x]**2+array[y]**2
# ํํฐ ์ด๊ธฐํ
filter = np.zeros((size, size))
for x in range(size):
for y in range(size):
# ์ํ์ ์์ ๊ตฌํ๋ถ
filter[x,y] = 1 / (2 * np.pi * sigma**2) * np.exp(-xx_yy_array[x,y]/(2 * sigma**2))
# Scaling
filter /= filter.sum()
return filter
์ ๊ฐ ๊ฐ์ฐ์์ ํํฐ ํจ์๋ ์ด๋ ์ต๋๋ค.
์ด์ ์ด๋ฏธ์ง์ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
# ํ์คํธ์ฐจ๋ 5, 11X11 ํฌ๊ธฐ์ ๊ฐ์ฐ์์ ํํฐ ๊ฐ์ฒด ์์ฑ
gaussian_11X11 = Gaussian(11, 5)
# ํํฐ ์ ์ฉ
gaussian_MJ = cv2.filter2D(image_MJ, -1, gaussian_11X11)
# cv2.filter2D(src, ddepth, kernel)
#src: ํํฐ๋ฅผ ์ ์ฉํ ๋์ ์ด๋ฏธ์ง
#ddepth: ๊ฒฐ๊ณผ ์ด๋ฏธ์ง์ ๋ฐ์ดํฐ ํ์
์ ๊ฒฐ์ ํ๋ ํ๋ผ๋ฏธํฐ. -1์ ์ฃผ๋ฉด src์ ๋์ผํ ๋ฐ์ดํฐ ํ์
์ ๊ฐ์ง๊ฒ ๋จ
#kernel: ์ ์ฉํ ํํฐ
์๋ณธ ์ด๋ฏธ์ง
๊ฐ์ฐ์์ ํํฐ ์ ์ฉ ์ด๋ฏธ์ง
์ ๋ ํ์คํธ์ฐจ๋ฅผ ํฌ๊ฒ ์ฃผ์ด ๊ฐ์ค์น๋ฅผ ๋ถ์ฐ์ํจ ๊ฐ์ฐ์์ ํํฐ๋ฅผ ์ ์ฉํ์ต๋๋ค.
๊ฒฐ๊ณผ๋ ํ๋ฆฟํ๊ฒ ๋์์ฃ .
๋ฐ๋๋ก ํ์คํธ์ฐจ๋ฅผ ์๊ฒ ์ฃผ๊ณ ํํฐ์ ์ฌ์ด์ฆ๋ฅผ 3X3 or 5X5๋ก ์ค๋ค๋ฉด ๋์ฑ ์ ๋ช
ํด์ง๋ ์ด๋ฏธ์ง๋ฅผ ๋์ถํ ์ ์์ต๋๋ค.
์ ๋ ๊ฐ๋ฐ์์ธ๋ฐ ๊ฐ์ด ๊ต๋ฅ ๋ง์ด ํด๋ด์ ใ ใ ! ์๋ก ํ์ดํ ํฉ์๋ค!