์๋ง ๋ด ์ธ์ ์ฒซ ํ๋ก์ ํธ ์๋ ๊ฒ ๊ฐ๋ค.
4๋ช
์ด์ ๊ฐ์ด ํ๋๋ฐ git bash๊ฐ ๊ณ์ ์ค๋ฅ๋์ ๋๊น์ง ๊นํ๋ธ์ ๋ชป ์ฌ๋ ธ๋๊ฒ ๊ธฐ์ต์ ๋จ๋๋ค ใ
ใ
...
์ต๋ํ ๊ทธ ๋น์์ ๊ธฐ์ต๊ณผ ์ฝ๋๋ค์ ๋์ง์ด๋ณด๋ฉฐ ์ ์ด๋ณด๋๋ก ํ๊ฒ ๋ค ใ
ใ
ํ์๋ค๋ผ๋ฆฌ ํ๋ก์ ํธ ์ฃผ์ ๋ฅผ ์ ํ๋ค. 4๋ช
๋ค ์ผ๊ตด์ธ์์ ๊ด๋ จํ์ฌ ๊ด์ฌ์ด ์์๊ธฐ์ ๊ณ ์ฌํ์ฌ ์ฃผ์ ๋ฅผ ์ ํ๊ณ ํ๋ก์ ํธ๋ฅผ ์งํํ ๊ณผ์ ์ ์ ํ๋ค. ์ฃผ์ ๋ ์ผ๊ตด์ ์ ์ธํ ํ๋ฉด์ ๋ธ๋ฌ ์ฒ๋ฆฌํ ๊ฐ์ ์ ๋ฐ๋ผ ๋ฐฐ๊ฒฝ์ ๋ฐ๊ฟ์ฃผ๋, ์ผ์ข
์ ์ธ๊ณต์ง๋ฅ ์นด๋ฉ๋ผ(?)๋ก ์งํ๋ ๊บผ ๊ฐ๋ค. ์์๋ ์ผ๊ตด ํ๋ฐ๊ธฐ->๊ฐ์ ์ธ์-> ๊ฐ์ ์ ๋ฐ๋ฅธ ๋ฐฐ๊ฒฝ ๋ฐ๊ฟ์ฃผ๊ธฐ๋ก ์งํํ๊ธฐ๋ก ํ์์ผ๋ฉฐ, ํ๋ก๊ทธ๋จ์ ๊ฐ์ฅ ๋ณดํธํ๋์ด์๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ชจ๋,ํจํค์ง)๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฉ์ดํ ํ์ด์ฌ
์ ์ฌ์ฉํ๊ธฐ๋ก ํ์๋ค.
ํ์ด์ฌ
ํ๋ก๊ทธ๋จ์ค ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ด์ธ๋ฆด์ง ์ฐพ์๋ณด์๋ค. ์์ ์ฒ๋ฆฌ์ ๊ด๋ จํด์ numpy,ImajeJ,PIL(Python Imaging Library)๋ฑ ๋ง์ ์์์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์กฐ์ฌํด๋ณผ์ ์์๋๋ฐ, ๊ทธ์ค ์๋์ ์ผ๋ก ์์ ์ฒ๋ฆฌ ๋ถ์ผ์ ์ฐ์ด๋ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์๋ค. ๋ฐ๋ก Opencv. Opencv๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ ํจ๊ป ์ฐ๋ฉฐ ์์์ฒ๋ฆฌ ๋ถ์ผ์ ๊ด๋ฒ์ํ๊ฒ ์ฐ์ด๊ณ , ์ฌ์ง์ ์ฝ๊ฒ ๋๋ ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ํธ๋ฆฌํ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ํ๋ก์ ํธ์ธ ์ธ๊ณต์ง๋ฅ ๊ฐ์ ์ธ์ ์นด๋ฉ๋ผ์ ์ ํฉํ๋ค๊ณ ์๊ฐ๋์ด ์ฐ์ Opencv๋ฅผ ์ฐ๊ตฌํด๋ณด๊ธฐ๋ก ํ์๋ค.
์ผ๋จ python์ Opencv๋ฅผ ์ค์นํ๋ ๊ณผ์ ๋ถํฐ ์ฐ์ตํด๋ณด์๋ค. ์ ์ ์งํํ๋ ๊ฒ์ ํ๋ก์ ํธ์ ์ํค์ง ์๊ธฐ ์ํด ์๋์ฝ๋ค๋ฅผ ์ค์น, ์๋์ฝ๋ค ํ๋กฌํํธ์ !pip install opencv-contrib-python์ ์ค์นํ๋ฉด ๋๋ ๊ฐ๋จํ ๊ณผ์ ์ด์๋ค.
Opencv๋ฅผ ์ฐ์ตํ๊ธฐ ์ํ ๊ฐ์ฅ ๊ธฐ์ด ๊ณผ์ ์ธ ์ฌ์ง์ ์ถ๋ ฅํด๋ณด์๋ค.
import cv2
img_file = 'img/figures.jpg' # ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ
img = cv2.imread(img_file) # ์ด๋ฏธ์ง ๋ณ์ ํ ๋น
cv2.imshow('IMG', img) # ํ๋ฉด ํ์ ์ฐฝ์ด๋ฆ : 'IMG'
cv2.waitKey()
cv2.destroyAllWindows()
์ ์ฝ๋๊ฐ Opencv ์ฌ์ง์ถ๋ ฅ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ์ฝ๋๋ค. img_file์ด๋ ๋ณ์์ ์์ ์ด ๋ด์์ฌ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํด์ฃผ๊ณ , img๋ ์ด ์ด๋ฏธ์งํ์ผ์ ์ฝ์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ cv2.imshow๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ์ฌ์ง์ ๋ณด์ฌ์ค ๋ค destroyAllwindows๋ฅผ ์ฌ์ฉํ์ฌ ์ฐฝ์ ๋ซ์์ฃผ๋ฉด ๋๋ค.
ํ๋ก์ ํธ์ ์ฒซ๋ฒ์งธ ๋จ๊ณ์ธ ์ผ๊ตด ํ๋ฐ๊ธฐ๋ฅผ ์์ํ์๋ค. OpenCv๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ๋ฌผ์ ๊ตฌ๋ถํ ์ ์๋๋ก ๋์์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ง์๋๋ฐ, ์ฒ์์ Contour
๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ดํด๋ณด์๋ค.
import cv2
img_color = cv2.imread('C:/Users/GhostDog/Desktop/test.png')
img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
ret, img_binary = cv2.threshold(img_gray,127,255,0)contours,
hierarchy = cv2.findContours(img_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
print(contours)
cv2.drawContours(img_color, contours, 0,(0,0,255),3)
cv2.drawContours(img_color, contours, 1,(0,255,0),3)cv2.imshow("result",img_color)
cv2.waitKey(0)
Coutour
๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ช
์ ๋ฐ๊ธฐ๋ฅผ ํ๋จํ์ฌ ๋ณด์ฌ์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์์ Drawcontours๋ก ๋ ๊ทธ๋ฆผ์ (0,0,255)๋นจ๊ฐ์ ํ
๋๋ฆฌ์ (0,255,0)์ด๋ก์ ํ
๋๋ฆฌ๋ก ์ฃผ๋ณ ๋ฐ๊ธฐ์ ๋ค๋ฅธ ๋ณ๊ณผ ์ผ๊ฐํ์ผ๋ก ๊ตฌ๋ถ์ ํด๋ณด์๋ค. Contour
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒ ๋จ๊ณ์ ๋ชฉํ์ธ ์ผ๊ตด ํ๋ฐ๊ธฐ(์ผ๊ตด๊ณผ ์ ๊ฒฝ ๋ถ๋ฆฌ)๋ฅผ ์๋ํด๋ณด์๋ค.
๋ณด๋ค์ํผ ์ผ๋ถ๋ฌ ๋ฐฐ๊ฒฝ์ ๋ฐ๊ฒํ๊ณ ์ท๊ณผ ์ผ๊ตด์ ๋น๊ต์ ์ด๋์ด ์์ผ๋ก ์
์ด๋ Contour
๋ก๋ ํ ๊ตฌ๋ถ์ด ๋์ง ์์๋ค. ์๋ฃ ์กฐ์ฌ๋ฅผ ๋ํด๋ณด๋ Contour
๋ ๊ทน๋จ์ ์ธ ์์ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ ์ฃผ๋ณ ๋ฐฐ๊ฒฝ ์ฌ๋ฌผ์ด ๋๋ฌด ๋์ ๋๋ฉด ๊ตฌ๋ถ์ด ์ ๋์ง ์์ผ๋ฏ๋ก, ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ค๋ ํ๋ก์ ํธ์ ์ ์ฉ์ํค๊ธฐ์๋ ์ด๋ ค์์ด ์์ด ์ ์ฉ์ํค๊ธฐ ์ด๋ ต๋ค๊ณ ์๊ฐํ์๋ค.
์ผ๊ตด๊ณผ ์ ๊ฒฝ ๋ถ๋ฆฌ์ ํฌ์ปค์ค๋ฅผ ๋ง์ถฐ ํ์ด์ฌ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ์ฐพ์๋ณด์๋ค
.
์ ์ฌ์ง์ ์ผ๊ตด๊ณผ ์ ๊ฒฝ ๋ถ๋ฆฌ์ ์ฐ์ด๋ ๋ํ์ ์ธ ํด๋ค์ด๋ค. ๋น์์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ด๋ จํ์ฌ ํน์ง๊ณผ ์ฅ๋จ์ ์ ์ ๋ฆฌํ ๊ธ์ด ์๊ธฐ์ ์ ์ด๋ดค๋ค.
Magic Wand ์ฌ์ฉ์๊ฐ ํน์ ์์น๋ ์์ญ์ ์ง์ ํ๋ฉด, ๊ทธ์ ์ฐ๊ฒฐ๋ ํฝ์ ๋ค ์ค ๊ทธ ์ฐจ์ด๊ฐ ํน์ ๊ฐ ์ด๋ด์ธ ํฝ์ ๋ค์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. Background์ Foreground์ ํฝ์ ๊ฐ ๋ถํฌ๊ฐ ์๋ก ๊ฒน์น๋ฉด ๊ณค๋ํด์ง๋๋ค.
Intelligent Scissors Mortensen, Barret์ ์ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ง์ฐ์ค๋ฅผ ์์ง์ฌ๊ฐ๋ฉฐ ๋๊ฐ์ ํฌ์ธํธ๋ฅผ seed๋ก ์ง์ ํ์ฌ ์์ญ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ค์๊ฐ์ผ๋ก ํ์ฌ ์ปค์์ ์์น์ ์ง์ seed ์์น ์ฌ์ด์ minimum cost path๋ฅผ ๊ณ์ฐํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ณด์ฌ์ค๋๋ค. ํ์ฌ ํ์๋๋ ๊ฒฝ๋ก๊ฐ ๋ง์์ ๋ค๋ฉด ๊ฒฝ๋ก๋ฅผ ๊ณ ์ ํ๊ณ ํ์ฌ ์์น๋ฅผ ๋ค์ seed๋ก ์ง์ ํฉ๋๋ค. ์ด๋ฅผ ๋ฐ๋ณตํ์ฌ ์์ญ์ ์ ํํ๊ฒ ๋ฉ๋๋ค. ์ด ๋ฐ์ ์ ๊ฒฝ์ฐ ํ ์ค์ณ๊ฐ ๋ณต์กํ ์์ญ์ด๊ฑฐ๋ ์์ ํ ์ค์ณ๊ฐ ์๋ ์์ญ์ ๊ฒฝ์ฐ minimum cost path๊ฐ ์ ์ผํ์ง ์์ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
Bayes matting ์ฌ์ฉ์๊ฐ ์ ์ํ Trimap์ ๋ฐํ์ผ๋ก ํฌ๋ช ๋๋ฅผ ๊ฐ๋๋ก ์ปฌ๋ฌ ๋ถํฌ๋ฅผ ๋ชจ๋ธ๋งํฉ๋๋ค. ์ฌ์ฉ์์ ์์ชฝ ์์ญ๊ณผ ๋ฐ๊นฅ ์์ญ ์ ๋ ฅ์ ์ฌ์ฉ์ ์ ๋ ฅ์ด ํ์ํฉ๋๋ค.
Knockout 2 Trimap์ ์ฌ์ฉํ๋ Bayes matting๊ณผ ๋น์ทํ ๋ฐฉ๋ฒ์ ๋๋ค.
Graph Cut Bayes Matting๊ณผ trimap, ํ๋ฅ ์ปฌ๋ฌ ๋ชจ๋ธ์ ๋ชจ๋ ๊ฐ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ ๋ฐ๋ก ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
Level sets ํธ๋ฏธ๋ถ ๋ฐฉ์ ์์ ์ด์ฉํ์ฌ ์๋์ง ์ต์ํ ๋ฐฉ๋ฒ์ ํตํ์ฌ ํ์ด๋ ๋๋ค. ์๋์ง๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด๋, ์ด๊ธฐํ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
์ ํด๋ค ์ค Grabcut
์ ํ์ด์ฌ
์ ์ ์ฉํ๊ฒ ์ฐ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ๋ค์ด์ Grabcut
์ ์กฐ์ฌํ๊ฒ ๋์๋ค.
GrabCut
์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฏธ์ง์์ ๋ฐฐ๊ฒฝ์ด ์๋ ์ ๊ฒฝ์ ํด๋นํ๋ ์ด๋ฏธ์ง๋ฅผ ์ถ์ถํด ๋ด๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ฏธ์ง์์ ํ๋ฒ์ ์ ๊ฒฝ์ ์ถ์ถํด ๋ด๋ ๊ฒ์ด ์๋ ์ฌ์ฉ์์์ ์ํธ ์์ฉ์ ํตํด ๋จ๊ณ์ ์ผ๋ก ์ ๊ฒฝ์ ์ถ์ถํ๋ค.
์ด ์ํธ์์ฉ์ ํฌ๊ฒ 2๊ฐ์ง ๋จ๊ณ๋ก ์งํ๋๋๋ฐ,
์ฒซ๋ฒ์งธ๋ ์ด๋ฏธ์ง์์ ์ ๊ฒฝ์ด ํฌํจ๋๋ ์์ญ์ ์ฌ๊ฐํ์ผ๋ก ๋๋ต์ ์ผ๋ก ์ง์ ํ๋ค. ๋จ, ์ด๋ ์ง์ ํ ์ฌ๊ฐํ ์์ญ ์์๋ ์ ๊ฒฝ์ด ๋ชจ๋ ํฌํจ๋์ด ์์ด์ผ ํ๋ค.
๋๋ฒ์งธ๋ ์ฒซ๋ฒ์งธ์์ ์ป์ด์ง ์ ๊ฒฝ ์ด๋ฏธ์ง์ ๋ด์ฉ์ค ํฌํจ๋์ด์ง ๋ฐฐ๊ฒฝ ๋ถ๋ถ์ ์ด๋์ธ์ง, ๋๋ฝ๋ ์ ๊ฒฝ ๋ถ๋ถ์ ์ด๋์ธ์ง๋ฅผ ๋งํนํ๋ฉด ์ด๋ฅผ ์ด์ฉํด ๋ค์ ์ ๊ฒฝ ์ด๋ฏธ์ง๊ฐ ์๋กญ๊ฒ ์ถ์ถ๋๋ค.
Grabcut
์ ์ด์ฉํ์ฌ ์๊น contour๋ก ์ ๊ฒฝ ๋ถ๋ฆฌํ๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ํ๋ฒ ๋ถ๋ฆฌํด๋ณด์๋ค.
import numpy as np
import cv2 from matplotlib
import pyplot as plt
img = cv2.imread('C:/Users/GhostDog/Desktop/myface.jpg')
mask = np.zeros(img.shape[:2] ,np.uint8)
bgdModel = np.zeros((1 ,65) ,np.float64)
fgdModel = np.zeros((1 ,65) ,np.float64)
rect = (50 ,50 ,1200 ,700)
cv2.grabCut(img ,mask ,rect ,bgdModel ,fgdModel ,5 ,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2) |(mask==0) ,0 ,1).astype('uint8')
img = img *mask2[: ,: ,np.newaxis]plt.imshow(img) ,plt.colorbar() ,plt.show()
์๊น๋ณด๋ค ํจ์ฌ ์ ๊ฒฝ๋ถ๋ฆฌ๊ฐ ์ ๋ ๊ฒ์ ๋ณผ์ ์๋ค. ๊ทธ๋ฌ๋ ์๊น์ด ์ด๋์์ง ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ์ถํ ํ ๋๋ฆฌ๋ง grabcut์ผ๋ก ๋ถ๋ฆฌํ๊ณ ์๋ณธ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ ํฉ์ฑํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๋น์์ ์ฌ๊ธฐ๊น์ง ๋ณด๊ณ ์๋ฅผ ๊ธฐ๋กํ๋ค.
import numpy as np
import cv2
lowerBound = np.array([13, 155, 53])
upperBound = np.array([56, 216, 119])
##HSV ์์ ์์ญ์ด๋ค, ์ํ๋ ์์ ์์ญ์ผ๋ก ๋ฐ๊พธ๋ฉด ๋๋ค
def showcam():
try:
print ('open cam')
cap = cv2.VideoCapture(0)
except:
print ('Not working')
cap.set(3, 480)
cap.set(4, 320)
# try-except ๋ฌธ๋ฒ์ ์ด์ฉํด ์บ ์ด ์์ด์์๋ ์๋ฌ๋ฅผ ์ถ๋ ฅํ๋ค
while True:
ret, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
#RGB -> HSV ๋ณํ
color_mask = cv2.inRange(hsv, lowerBound, upperBound)
#ํน์ ์์ ๋ฒ์ mask ์ค์น
ret1, thr = cv2.threshold(opening, 127, 255, 0)
#contours ๋ฅผ ์ฐพ๊ธฐ์ํ ์ด์งํ
_, contours, _ = cv2.findContours(thr, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#contours์ฐพ๊ธฐ _,๋ ์ฌ์ฉํ์ง ์๋ ์ธ์๋ผ์ '_'๋ก ๋ฐ๋๋ค
if len(contours) > 0:
for i in range(len(contours)):
area = cv2.contourArea(contours[i])
#contours ์์ญ ๊ตฌํ๊ธฐ
if area > 100: # 100์ด์ ์์ญ์ ๊ฐ์ง ๋ฌผ์ฒด๊ฐ ์์ ๋๋ง
rect = cv2.minAreaRect(contours[i]) #contours๋ฅผ ์ด์ฉํด ์ฌ๊ฐํ์ ๋ง๋ ๋ค
box = cv2.boxPoints(rect) #์ฌ๊ฐํ์ ์ฐพ์ 4์ ์ ๋ฐํํ๋ค.
box = np.int0(box)
cv2.drawContours(frame, [box], 0, (0, 0, 255), 2) #์ฌ๊ฐํ ๋ชจ์์ ๊ทธ๋ฆฐ๋ค
if not ret:
print('error')
break
cv2.imshow('color_bitwise',color_mask)
cv2.imshow('cam_load',frame)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
showcam()
Countour
๋ฅผ ํ
์คํธํด๋ณด๊ธฐ ์ํด ๋น์ ์ด๋ฐ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๊ธฐ๋ ํ์๊ณ
๊ฐ๊ฐ์ง ์คํ ๋ชจ๋ธ๋ก ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ์๋ํด๋ณด๊ธฐ๋ ํ์๋ค.
๊ทธ๋์ ํ
์ํ๋ก์ฐ์ ์ผ๋ผ์ค๋ฅผ ํ์ฉํ์ฌ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค์ ์ผ๊ตด๊ณผ ์ ๊ฒฝ์ ๋ถ๋ฆฌํด ๊ฐ์ ์ ๋ฐ๋ฅธ ๋ฐฐ๊ฒฝ์ ๊พธ๋ฏธ๊ฒ ํ์๋๋ฐ ์ฝ๋๋ฅผ ์์ด๋ฒ๋ฆฐ ๊ฒ ๊ฐ๋ค...
์ ์ฌ์ง์ ๋น์์ img ํด๋์ background_happy๊ฐ ์ฌ๋์ ๊ฐ์ ์ happy๋ก ์ธ์ํ๋ฉด grabcut์ ์ด์ฉํ์ฌ ์ ๊ฒฝ์ ๋ถ๋ฆฌํ ๊ฑด๋ฐ..์ด์งธ ๊ฒฐ๊ณผ๋ฌผ๋ง ์๊ณ ์ฝ๋๊ฐ ์๋ค ใ
ใ
;
์ด์จ๋ ๋์ ์ข์ถฉ์ฐ๋ ํ๋ก์ ํธ๋ ์ด๋ ๊ฒ ๋์ด ๋ฌ๋ค.
์ถ๊ฐ๋ก ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ์ถ๊ฐ๋ก ๋ผํ๋ผ์์์ ๋ํด ์กฐ์ฌํ๋ ๋ณด๊ณ ์๊ฐ ์์ด ๊ฐ์ด ์ฒจ๋ถํ๋ค.
์์ ๊ฐ์ ์์ ๋ผํ๋ผ์์์ด๋ผ ์นญํจ
์์ ๊ฐ์ ์์ ๋ฏธ๋ถ์ฐ์ฐ์๋ผ ์นญํ๋๋ฐ, ๋ฒกํฐ๋ก ๋์ค๋ ๋ฏธ๋ถ์ฐ์ฐ์ 2๊ฐ๋ฅผ ์๋ก ๋ด์ ํ๋ฉด ๋ด์ ์ ๊ฒฐ๊ณผ๋ก ๊ฐ์ ์์น๋ผ๋ฆฌ ๊ณฑ์ ํฉ์ด ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์์. (=๋ผํ๋ผ์์)
์ด ์์ ๊ฒฐ๊ณผ๋ก๋ถํฐ ๋ผํ๋ผ์์์ 2๋ฒ์ ํธ๋ฏธ๋ถ์ ํ ๊ฒฐ๊ณผ๋ก์จ ๋ณผ ์ ์๋ค.
์ด๋ค ์ค์นผ๋ผ ํจ์์ ๋ํ์ฌ ๋ผํ๋ผ์์์ ํ๋ ๊ฒ์, ์์๋๋ก ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ตฌํ๊ณ ๊ทธ๊ฒ์ ๋ฐ์ฐ์ ๊ตฌํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. (=๊ธฐ์ธ๊ธฐ์ ๋ฐ์ฐ)
โป๋ผํ๋ผ์์์ ์๋ก ์ ์์ ์ฒด์ ์ ํ๋ฐ๋์ ๊ด๊ณ๋ฅผ ์๋ก ๋ค ์ ์์ผ๋ฉฐ, ์ ์์ ๋ผํ๋ผ์์์ ์ฒด์ ์ ํ ๋ฐ๋๊ฐ ๋๋ค.
๋ผํ๋ผ์์ ๋ชจ์๋ฆฌ ํฅ์.
์ต์ ์ ๋ํ ๋ณ์ด๊ฐ ์๋ 2์ฐจ ๋ํจ์ ํํ์ ํํฐ. 1์ฐจํจ์์ ๊ธฐ์ดํ ๊ทธ๋ ๋์ธํธ์ ์๋ฐ๋ ํํฐ์ด๋ค.
๋จผ์ ๊ทธ๋ ๋์ธํธ๋ถํฐ ์ค๋ช
์ ํ์๋ฉด, ์์์์ ๊ธฐ์ธ๊ธฐ๋ฅผ gradient๋ผ ํ ์ ์ด gradient๋ฅผ ๊ตฌํ๋ฉด edge๊ฐ์ ์ป์ ์ ์๋ค. ์์์์๋ ๋ฐ์ดํฐ๊ฐ ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ๋์ด๋์ด ์๊ธฐ ๋๋ฌธ์ ์ํ์ ์ธ ๋ฏธ๋ถ ์์์ ํ์ง ์์ง๋ง, ์ธ์ ํ ํ์๋ผ๋ฆฌ์ ์ฐจ์ด๋ฅผ ์ทจํ๋ ์ฐ์ฐ์ ํ๋ค.
๊ทธ๋ฌ๋ ๊ทธ๋ ๋์ธํธ๊ฐ์ 1์ฐจ ๋ฏธ๋ถ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ง์ผ๋ก๋ ๋๋ฌด ๋ง์ ์์ง ํ๋ณด๋ฅผ ์์ฑํ๋ฏ๋ก, ๊ทธ๋ ๋์ธํธ ๊ฐ์ด ๊ตญ์ง์ ์ผ๋ก ์ต๋์ธ ์ ๋ง์ ์์ง๋ก ์ธ์ ํ๋ ๊ฒ์ 2์ฐจ ๋ฏธ๋ถ ์ฐ์ฐ์๋ผ๊ณ ํ๋ค. ์ค์ ์์ง์ ์์๋ 1์ฐจ ๋ฏธ๋ถ์ด ์ต๋๊ฐ ๋๊ณ , 2์ฐจ ๋ฏธ๋ถ์ด ์์ ์ ํต๊ณผํ๋ ์์ฑ์ ์ด์ฉํ์๋ค๊ณ ํ๋ค.์์ ๊ฐ์ ๋ฐฉ๋ฒ์ 2์ฐจ ๋ฏธ๋ถ์ฐ์ฐ์, ์ฆ ๋ผํ๋ผ์์ ์ฐ์ฐ์๋ฅผ ๋์
ํ๋ค ์นญํ๋ค.
๋ผํ๋ผ์์์ ์ ์ ์ 2์ฐจ๋ฏธ๋ถ์ ์ํ ์์ง ํ๋จ ์์ ์ด ์ ๊ณต๋๋ค๋ ์ ์ด๋ค.
์ฌ์ธํ ์์ง ๊ฒ์ถ์ ๋ฌผ๋ฐ, ๋ชจ๋ ๋ฐฉํฅ์ ์์ง ๊ฒ์ถ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์์ ํธํ๋ค.
๊ทธ๋ฌ๋, ์ก์์ ๋ฏผ๊ฐํ์ฌ ์ก์ ์ฑ๋ถ๋ํ ์์์ ๊ฐ์กฐ๋ ์ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ์ฌ ๊ฐ์ฐ์คํ ๋ผํ๋ผ์์์ ์ฌ์ฉํ๋๋ฐ, ๋ผํ๋ผ์์์ ์ ์ฉํ๊ธฐ ์ ์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ก ํํํ๋ฅผ ์ํํ๋ค.
import cv2import numpy as np
def ImageSobel(): imageFile = "C:/Users/JongMin/Desktop/myface.jpg"
img = cv2.imread(imageFile,cv2.IMREAD_GRAYSCALE)
Laplacian = cv2.Laplacian(img,-1)
cv2.imshow("ORIGIN",img)
cv2.imshow("Laplacain",Laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()ImageSobel()