๐ ๋ณธ ์์ ๋ Window10์ VSCode, Python3.11.0๋ก ์์ฑ๋์์ต๋๋ค.
ํํฐ(filter)๋ผ๋ ๋ง์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฑธ๋ฌ ๋ด๊ตฌ ์ผ๋ถ๋ง ํต๊ณผ์ํค๋ ์ฅ์น๋ฅผ ์๋ฏธํ๋ค.
์์์ฒ๋ฆฌ์์ ํํฐ๋ ์์์์ ์ํ๋ ์ ๋ณด๋ง ํต๊ณผ์ํค๋ ์ญํ ์ ํ๋ค.
- ๋ ธ์ด์ฆ ์ ๊ฑฐ
- Smoothing
- Sharping
์์์ ํํฐ๋ง์ ๋ณดํต ๋ง์คํฌ(mask)๋ผ๊ณ ๋ถ๋ฅด๋ ์์ ํ๋ ฌ์ ์ด์ฉํ๋ค.
๋ง์คํฌ๋ ํํฐ๋ง์ ์ฑ๊ฒฉ์ ์ ์ํ๋ ํ๋ ฌ๋ก ์ปค๋(kernel), ์๋์ฐ(Window)๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ๋ง์คํฌ ์์ฒด๋ฅผ ํํฐ๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
๋ง์คํฌ๋ ์ง์ฌ๊ฐํ ํ๋ ฌ ๋๋ ์ ๋ฐฉํ ํ๋ ฌ์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค. ๋ํ ํ์ํ๋ค๋ฉด ๋ค์ํ ํํ์ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ธฐ๋ณธ ํํฐ๋ง
๊ธฐ๋ณธ์ ์ธ ํํฐ๋ง์ Numpy๋ก ๋ง๋ ํ๋ ฌ๊ณผ filter2D ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
import numpy as np
import cv2
img = cv2.imread("test.png")
img = cv2.resize(img,(480,480))
cv2.imshow("origin",img)
for i in [3,6,10]:
kernel = np.ones((i,i),np.uint8) / i ** 2
filtering = cv2.filter2D(img,-1,kernel=kernel)
cv2.imshow(f"{i}x{i}filter",filtering)
cv2.waitKey(0)
cv2.destroyAllWindows()
์ํ๋ฉด์ ๋ถ๋๋ฝ๊ฒ ํ๋ ์ ๋ณด์ฑ(embossing) ํํฐ๋ง ํ ์ ์๋ค.
import numpy as np
import cv2
img = cv2.imread("test.png",cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img,(480,480))
cv2.imshow("origin",img)
kernel = np.array([[-1, -1, 0], [-1, 0, 1], [0, 1, 1]])
filtering = cv2.filter2D(img,-1,kernel=kernel)
filtering = np.uint8(filtering)
cv2.imshow("filter",filtering)
cv2.waitKey(0)
cv2.destroyAllWindows()
๋ธ๋ฌ๋ง(Blurring) : ์์์ ๋ถ๋๋ฝ๊ฒ
๋ธ๋ฌ๋ง ๊ธฐ๋ฒ์ด๋ ์ด์ ์ด ๋ง์ง ์์ ์ฌ์ง์ฒ๋ผ ์์์ ๋ถ๋๋ฝ๊ฒ ๋ง๋๋ ํํฐ๋ง ๊ธฐ๋ฒ์ผ๋ก smoothing์ด๋ผ๊ณ ๋ ํ๋ค.
์๋๋ ํํฐ๋ฅผ ๋ง๋ค์ด์ ํํฐ๋ง์ ํด์ผํ์ง๋ง OpenCV๋ blur๋ก ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
blur์ ์ฌ์ฉ๋๋ ํํฐ๋ ํ๊ท ๊ฐ ํํฐ(3x3, 5x5, 7x7)์ด๋ค.
import numpy as np
import cv2
img = cv2.imread("test.png")
img = cv2.resize(img,(480,480))
cv2.imshow("origin",img)
blur = cv2.blur(img,(3,3))
cv2.imshow("blur",blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
๊ฐ์ฐ์์ ํํฐ๋ง(Gaussian Filtering) : ์ก์์ ์ ๊ฑฐ
๊ฐ์ฐ์์ ํํฐ๋ง์ ๊ฐ์ฐ์์ ๋ถํฌ ํจ์๋ฅผ ๊ทผ์ฌํ์ฌ ์์ฑํ ํํฐ ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ ํํฐ๋ง ๊ธฐ๋ฒ์ด๋ค.
๊ฐ์ฐ์์ ๋ถํฌ๋ ํ๊ท ์ ์ค์ฌ์ผ๋ก ์ข์ฐ ๋์นญ์ ์ข ๋ชจ์(bell shape)์ ๊ฐ๋ ํ๋ฅ ๋ถํฌ๋ฅผ ๋งํ๋ฉฐ ์ ๊ท๋ถํฌ๋ก๋ ๋ถ๋ฆฐ๋ค.
GaussianBlur ํจ์๋ฅผ ํตํด ํํฐ๋ง์ ํ ์ ์๋ค.
import numpy as np
import cv2
img = cv2.imread("test.png")
img = cv2.resize(img,(480,480))
cv2.imshow("origin",img)
gaussian = cv2.GaussianBlur(img,(0,0),sigmaX=3) # sigmaX์ ๊ฐ์ ๋ฐ๋ผ ํํฐ๋ง ๊ฐ๋ ๋ฐ๋
cv2.imshow("gaussian",gaussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
๋ฏธ๋์ ํํฐ๋ง(Median Filtering) : ์๊ธ ํ์ถ ์ก์ ์ ๊ฑฐ์ฉ
๋ฏธ๋์ ํํฐ๋ง์ ๋ฐ๋ก ์ปค๋์ ๋ง๋ค์ด ํํฐ๋ง์ ํ์ง ์๊ณ ์ปค๋ ์๋์ฐ์ ์๋ ๋ชจ๋ ํฝ์ ์ ์ ๋ ฌํ์ฌ ์ค๊ฐ๊ฐ์ ์ ํํ์ฌ ํํฐ๋งํ๋ค.
์ก์ ํฝ์ ๊ฐ์ด ์ฃผ๋ณ ํฝ์ ๊ฐ๊ณผ ํฐ ์ฐจ์ด๊ฐ ์๋ ๊ฒฝ์ฐ์ ํจ๊ณผ์ ์ผ๋ก ๋์ํ๋ค.
medianBlur ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํํฐ๋ง ํ๋ค.
import numpy as np
import cv2
img = cv2.imread("test.png")
img = cv2.resize(img,(480,480))
cv2.imshow("origin",img)
median = cv2.medianBlur(img,7)
cv2.imshow("median",median)
cv2.waitKey(0)
cv2.destroyAllWindows()
์๋ฐฉํฅ ํํฐ๋ง(Bilateral Filtering)
๋ ํฝ์ ์ ๋ช ์๊ฐ ์ฐจ์ด ๋ํ ์ปค๋์ ๋ฃ์ด ๊ฐ์ค์น๋ก ๊ณฑํ๋ค.
ํฝ์ ์ ์ฐจ์ด๊ฐ ํฌ๋ค๋ฉด ๊ฐ์ค์น๊ฐ 0์ ๊ฐ๊น์ด ๊ฐ์ด ๋์ด ํฉ์ณ์ง์ง ์์ผ๋ฏ๋ก ์์ญ๊ณผ ์์ญ ์ฌ์ด์ฆ์ ๊ฒฝ๊ณ์ ์ด ์ ๋ณด์ ๋ ์ ์๋ค.
์ฃ์ง๋ฅผ ๋ณด์กดํด์ฃผ๊ณ ๊ธฐ์กด์ ํฝ์ ๊ณผ ์ด์ ํฝ์ ๊ฐ์ ๊ฑฐ๋ฆฌ, ํฝ์ ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ๋ธ๋ฌ๋ง์ ์งํํ๋ค.
bilateralFilter๋ก ํํฐ๋ง ํ ์ ์๋ค.
import numpy as np
import cv2
img = cv2.imread("test.png")
img = cv2.resize(img,(480,480))
cv2.imshow("origin",img)
bilateral = cv2.bilateralFilter(img,d=-1,sigmaColor=10,sigmaSpace=5)
cv2.imshow("bilateral",bilateral)
cv2.waitKey(0)
cv2.destroyAllWindows()
์คํ๋(sharpening)
์์์ ๋ ์นด๋กญ๊ฒ ๋ง๋๋ ์ฒ๋ฆฌ์ด๋ค.
์ ํ์ง ์์์ ๋ณด๋ค ์ ๋ช ํ๊ฒ ๋ง๋ ๋ค.
์ค์ฌ ํ์๊ฐ๊ณผ ์ธ์ ํ์๊ฐ์ ์ฐจ์ด๋ฅผ ๋ ํฌ๊ฒ ๋ง๋ ๋ค.
์คํ๋์ Numpy๋ก ์คํ๋ ๋ง์คํฌ๋ฅผ ๋ง๋ค์ด ํํฐ๋ง ํ๋ค.
import numpy as np
import cv2
img = cv2.imread("test.png")
img = cv2.resize(img,(480,480))
cv2.imshow("origin",img)
blur = cv2.blur(img,(3,3))
cv2.imshow("blur",blur)
mask = np.asarray([[-1,-1,-1],
[-1,9,-1],
[-1,-1,-1]], dtype = np.float32)
sharpening_img = cv2.filter2D(blur,-1, mask)
cv2.imshow("sharp",sharpening_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Canny Edge
์์์์ ํ์์ ๋ฐ๊ธฐ๊ฐ ๊ธ๊ฒฉํ๊ฒ ๋ณํ๋ ๋ถ๋ถ์ ์์ง(edge)๋ผ๊ณ ํ๋ค.
์์์์์ ์๋นํ ๋ฐ๊ธฐ ์ฐจ์ด๊ฐ ์๋ ๊ณณ์ด๊ณ , ๋๊ฒ ๋ฌผ์ฒด์ ์ค๊ณฝ์ (๊ฒฝ๊ณ์ )์ ํด๋นํ๋ค.
์์ง๋ฅผ ๊ฒ์ถํ ์ ์์ผ๋ฉด ๋ฌผ์ฒด์ ์ค๊ณฝ์ ์ ์ ์ ์๋ค.
์ด๋ฌํ ์์ง๋ฅผ ๊ฒ์ถํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ผ๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ "Canny Edge" ๊ฒ์ถ ๋ฐฉ๋ฒ์ด๋ค.
Canny Edge์ ์ฐ์ฐ ์์
- ์ก์ ์ต์ : ์์ง๋ฅผ ๊ฒ์ถํ๊ธฐ ์ ์ 5x5 ๊ฐ์ฐ์์ ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์ก์์ ์ ๊ฑฐ.
- ๊ทธ๋ผ๋์ธํธ ๊ณ์ฐ : Sobal ๋ง์คํฌ๋ก ์ํ ๋ฐ ์์ง ๋ฐฉํฅ์ 1์ฐจ ๋ฏธ๋ถ๊ฐ์ ์ป์.
- ๋ถํ์ํ ์์ง๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ๊ทธ๋ผ๋์ธํธ์ ๊ฐ์ด ๊ทธ๋ผ๋์ธํธ ๋ฐฉํฅ์ ์ธ์ ํ์ ์ค์์ ์ต๋๊ฐ์ธ์ง๋ฅผ ํ์ธ.
- ๋ชจ๋ ์์ง ํ๋ณด๋ค์ด ์ค์ ์์ง์ธ์ง ์๋์ง๋ฅผ ๊ฒฐ์
Canny ์์ง๋ Canny ํจ์๋ก ๊ตฌํ ์ ์๋ค.
import numpy as np
import cv2
img = cv2.imread("test.png")
img = cv2.resize(img,(480,480))
cv2.imshow("origin",img)
# cv2.Canny(์ด๋ฏธ์ง,ํ์ ์๊ณ๊ฐ,์์ ์๊ณ๊ฐ, sobal ๋ง์คํฌ ํฌ๊ธฐ)
edge = cv2.Canny(img,100,255)
cv2.imshow("canny",edge)
cv2.waitKey(0)
cv2.destroyAllWindows()
'AI > Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Computer Vision] ์์ง(Edge) ๊ฒ์ถ (0) | 2024.09.02 |
---|---|
[Computer Vision] ์์์ ๊ธฐํํ์ ๋ณํ (0) | 2024.08.30 |
[Computer Vision] ์์์ ๋ช ์ ์ ์ด (0) | 2024.08.28 |
[Computer Vision] ํ ์คํธ ์ฝ์ ๋ฐ ์ ์ฉํ ๊ธฐ๋ฅ (0) | 2024.08.28 |
[Computer Vision] ๊ทธ๋ฆฌ๊ธฐ ํจ์ (0) | 2024.08.27 |