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

[v0.20]์˜์ƒ์ฒ˜๋ฆฌ_๊ฒฝ๊ณ„ ๊ฒ€์ถœ ๋ณธ๋ฌธ

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

[v0.20]์˜์ƒ์ฒ˜๋ฆฌ_๊ฒฝ๊ณ„ ๊ฒ€์ถœ

์ง•์ง•์•ŒํŒŒ์นด 2022. 1. 11. 00:44
728x90
๋ฐ˜์‘ํ˜•

220110 ์ž‘์„ฑ

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

https://bkshin.tistory.com/entry/OpenCV-18-%EA%B2%BD%EA%B3%84-%EA%B2%80%EC%B6%9C-%EB%AF%B8%EB%B6%84-%ED%95%84%ED%84%B0-%EB%A1%9C%EB%B2%84%EC%B8%A0-%EA%B5%90%EC%B0%A8-%ED%95%84%ED%84%B0-%ED%94%84%EB%A6%AC%EC%9C%97-%ED%95%84%ED%84%B0-%EC%86%8C%EB%B2%A8-%ED%95%84%ED%84%B0-%EC%83%A4%EB%A5%B4-%ED%95%84%ED%84%B0-%EB%9D%BC%ED%94%8C%EB%9D%BC%EC%8B%9C%EC%95%88-%ED%95%84%ED%84%B0-%EC%BA%90%EB%8B%88-%EC%97%A3%EC%A7%80?category=1148027 

 

OpenCV - 18. ๊ฒฝ๊ณ„ ๊ฒ€์ถœ (๋ฏธ๋ถ„ ํ•„ํ„ฐ, ๋กœ๋ฒ„์ธ  ๊ต์ฐจ ํ•„ํ„ฐ, ํ”„๋ฆฌ์œ— ํ•„ํ„ฐ, ์†Œ๋ฒจ ํ•„ํ„ฐ, ์ƒค๋ฅด ํ•„ํ„ฐ, ๋ผํ”Œ๋ผ์‹œ

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

bkshin.tistory.com

 

 

 

 

 

 

1. ๊ธฐ๋ณธ ๋ฏธ๋ถ„ ํ•„ํ„ฐ

์ƒคํ”„๋‹ (Sharpening)

: ์˜์ƒ์˜ ๊ฒฝ๊ณ„๋ฅผ ์„ ๋ช…ํ•˜๊ณ  ๋šœ๋ ทํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค

: ์˜์ƒ์—์„œ ๊ฒฝ๊ณ„๋ฅผ ๊ฒ€์ถœํ•˜์—ฌ ๊ฒฝ๊ณ„์— ์žˆ๋Š” ํ”ฝ์…€ ๊ฐ•์กฐ

 

1) ๊ฒฝ๊ณ„(์—ฃ์ง€)๋ฅผ ๊ฒ€์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”ฝ์…€ ๊ฐ’์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ์ง€์  ์ฐพ๊ธฐ

2) ์—ฐ์†๋œ ํ”ฝ์…€ ๊ฐ’์— ๋ฏธ๋ถ„์„ ํ•˜์—ฌ ์ฐพ๊ธฐ

3) ํ”ฝ์…€์€ ์—ฐ์† ๊ณต๊ฐ„ ์•ˆ์— ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฏธ๋ถ„ ๊ทผ์‚ฌ๊ฐ’ ๊ตฌํ•˜๊ธฐ

  • ์„œ๋กœ ๋ถ™์–ด ์žˆ๋Š” ํ”ฝ์…€ ๊ฐ’์„ ๋นผ๊ธฐ
  • x๋ฐฉํ–ฅ, y๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ๊ฐ ํ”ฝ์…€ ๊ฐ’์„ ๋นผ๋ฉด ๋ฏธ๋ถ„ ๊ทผ์‚ฌ๊ฐ’

x๋ฐฉํ–ฅ, y๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ๊ฐ ํ”ฝ์…€ ๊ฐ’์„ ๋นผ๋ฉด ๋ฏธ๋ถ„ ๊ทผ์‚ฌ๊ฐ’
์˜์ƒ ๋‚ด ํ”ฝ์…€ ๊ฐ’์˜ ๋ฏธ๋ถ„ ๊ทผ์‚ฌ๊ฐ’ ์—ฐ์‚ฐ์„ ์œ„ํ•œ ์ปจ๋ณผ๋ฃจ์…˜ ์ปค๋„

# ๋ฏธ๋ถ„ ์ปค๋„๋กœ ๊ฒฝ๊ณ„ ๊ฒ€์ถœ
import cv2
import numpy as np

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

#๋ฏธ๋ถ„ ์ปค๋„ ์ƒ์„ฑ ---โ‘ 
gx_kernel = np.array([[ -1, 1]])
gy_kernel = np.array([[ -1],[ 1]])

# ํ•„ํ„ฐ ์ ์šฉ ---โ‘ก
edge_gx = cv2.filter2D(img, -1, gx_kernel)
edge_gy = cv2.filter2D(img, -1, gy_kernel)
# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
merged = np.hstack((img, edge_gx, edge_gy))
cv2.imshow('edge', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

x๋ฐฉํ–ฅ, y๋ฐฉํ–ฅ์˜ ๋ฏธ๋ถ„ ์ปค๋„์„ ์ƒ์„ฑํ•˜์—ฌ ํ•„ํ„ฐ๋ง์„ ์ ์šฉ

- x ๋ฐฉํ–ฅ ๋ฏธ๋ถ„ ํ•„ํ„ฐ๋Š” ์„ธ๋กœ ๋ฐฉํ–ฅ์˜ ๊ฒฝ๊ณ„ ๊ฒ€์ถœ!

=> ์ขŒ์šฐ ํ”ฝ์…€ ๊ฐ’์˜ ์ฐจ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•„ํ„ฐ๋ง

- y ๋ฐฉํ–ฅ ๋ฏธ๋ถ„ ํ•„ํ„ฐ๋Š” ๊ฐ€๋กœ ๋ฐฉํ–ฅ์˜ ๊ฒฝ๊ณ„ ๊ฒ€์ถœ!

=> ์ƒํ•˜ ํ”ฝ์…€ ๊ฐ’์˜ ์ฐจ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•„ํ„ฐ๋ง

 

์™•์‹ ๊ธฐ

 

 

 

 

 

2. ๋กœ๋ฒ„์ธ  ๊ต์ฐจ ํ•„ํ„ฐ (Robert Cross Filter)

๋กœ๋ฒ„์ธ  ๊ต์ฐจ ํ•„ํ„ฐ๋ฅผ ์œ„ํ•œ ์ปจ๋ณผ๋ฃจ์…˜ ์ปค๋„

: ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ +1, -1์„ ๋ฐฐ์น˜์‹œ์ผœ ์‚ฌ์„  ๊ฒฝ๊ณ„ ๊ฒ€์ถœ ํšจ๊ณผ ๋†’์ธ๋‹ค

: ๋…ธ์ด์ฆˆ์— ๋ฏผ๊ฐํ•˜๋‹ค

# ๋กœ๋ฒ„์ธ  ๊ต์ฐจ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•œ ๊ฒฝ๊ณ„ ๊ฒ€์ถœ
import cv2
import numpy as np

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

# ๋กœ๋ฒ„์ธ  ์ปค๋„ ์ƒ์„ฑ ---โ‘ 
gx_kernel = np.array([[1,0], [0,-1]])
gy_kernel = np.array([[0, 1],[-1,0]])

# ์ปค๋„ ์ ์šฉ ---โ‘ก 
edge_gx = cv2.filter2D(img, -1, gx_kernel)
edge_gy = cv2.filter2D(img, -1, gy_kernel)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
merged = np.hstack((img, edge_gx, edge_gy, edge_gx+edge_gy))
cv2.imshow('roberts cross', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

๋กœ๋ฒ„์ธ  ๊ต์ฐจ ํ•„ํ„ฐ๋กœ ์‚ฌ์„  ๊ฒฝ๊ณ„ ๊ฒ€์ถœ

- ๋Œ€๊ฐ์„  ํ•˜๋‹ˆ๊นŒ ์˜ค๋ฅธ์ชฝ ์œ„๊ฐ€ ์„ ๋ช…ํ•˜๊ตฐ

- ๊ฑฐ๊พธ๋กœ ํ•ด๋ณผ๊นŒ

๋น„์Šทํ•˜๋‹ค

 

 

 

 

 

3. ํ”„๋ฆฌ์œ— ํ•„ํ„ฐ (Prewitt Filter)

: x์ถ•๊ณผ y์ถ•์˜ ๊ฐ ๋ฐฉํ–ฅ์œผ๋กœ ์ฐจ๋ถ„์„ ์„ธ ๋ฒˆ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฒฝ๊ณ„๋ฅผ ๊ฒ€์ถœํ•˜๋Š” ํ•„ํ„ฐ

: ์ƒํ•˜/์ขŒ์šฐ ๊ฒฝ๊ณ„๋Š” ๋šœ๋ ทํ•˜๊ฒŒ ์ž˜ ๊ฒ€์ถœํ•˜์ง€๋งŒ ๋Œ€๊ฐ์„  ๊ฒ€์ถœ์ด ์•ฝํ•˜๋‹ค

&nbsp;x์ถ•๊ณผ y์ถ•์˜ ๊ฐ ๋ฐฉํ–ฅ์œผ๋กœ ์ฐจ๋ถ„์„ ์„ธ ๋ฒˆ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฒฝ๊ณ„๋ฅผ ๊ฒ€์ถœํ•˜๋Š” ํ”„๋ฆฌ์œ— ํ•„ํ„ฐ

# ํ”„๋ฆฌ์œ— ๋งˆ์Šคํฌ๋ฅผ ์ ์šฉํ•œ ๊ฒฝ๊ณ„ ๊ฒ€์ถœ
import cv2
import numpy as np

file_name = "img/sudoku.jpg"
img = cv2.imread(file_name)

# ํ”„๋ฆฌ์œ— ์ปค๋„ ์ƒ์„ฑ
gx_k = np.array([[-1,0,1], [-1,0,1],[-1,0,1]])
gy_k = np.array([[-1,-1,-1],[0,0,0], [1,1,1]])

# ํ”„๋ฆฌ์œ— ์ปค๋„ ํ•„ํ„ฐ ์ ์šฉ
edge_gx = cv2.filter2D(img, -1, gx_k)
edge_gy = cv2.filter2D(img, -1, gy_k)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
merged = np.hstack((img, edge_gx, edge_gy, edge_gx+edge_gy))
cv2.imshow('prewitt', 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;ํ”„๋ฆฌ์œ— ํ•„ํ„ฐ (์ƒํ•˜/์ขŒ์šฐ)

 

 

 

 

 

4. ์†Œ๋ฒจ ํ•„ํ„ฐ (Sovel Filter)

: ์ค‘์‹ฌ ํ”ฝ์…€์˜ ์ฐจ๋ถ„ ๋น„์ค‘์„ ๋‘ ๋ฐฐ๋กœ ์ค€ ํ•„ํ„ฐ

: x์ถ•, y์ถ•, ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์˜ ๊ฒฝ๊ณ„ ๊ฒ€์ถœ์— ๋ชจ๋‘ ๊ฐ•ํ•จ

: ์ปค๋„์˜ ์ค‘์‹ฌ์—์„œ ๋ฉ€์–ด์งˆ์ˆ˜๋ก ์—ฃ์ง€ ๋ฐฉํ–ฅ์„ฑ์˜ ์ •ํ™•๋„๊ฐ€ ๋–จ์–ด์ง„๋‹ค

์ค‘์‹ฌ ํ”ฝ์…€์˜ ์ฐจ๋ถ„ ๋น„์ค‘์„ ๋‘ ๋ฐฐ ์†Œ๋ฒจ ํ•„ํ„ฐ

dst = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
- src : ์ž…๋ ฅ ์˜์ƒ
- ddepth : ์ถœ๋ ฅ ์˜์ƒ์˜ dtype (-1: ์ž…๋ ฅ ์˜์ƒ๊ณผ ๋™์ผ)
- dx, dy : ๋ฏธ๋ถ„ ์ฐจ์ˆ˜ (0, 1, 2 ์ค‘ ์„ ํƒ, ๋‘˜ ๋‹ค 0์ผ ์ˆ˜๋Š” ์—†์Œ)
- ksize : ์ปค๋„์˜ ํฌ๊ธฐ (1, 3, 5, 7 ์ค‘ ์„ ํƒ)
- scale : ๋ฏธ๋ถ„์— ์‚ฌ์šฉํ•  ๊ณ„์ˆ˜
- delta : ์—ฐ์‚ฐ ๊ฒฐ๊ณผ์— ๊ฐ€์‚ฐํ•  ๊ฐ’

# ์†Œ๋ฒจ ๋งˆ์Šคํฌ๋ฅผ ์ ์šฉํ•œ ๊ฒฝ๊ณ„ ๊ฒ€์ถœ
import cv2
import numpy as np

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

# ์†Œ๋ฒจ ์ปค๋„์„ ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ ์—ฃ์ง€ ๊ฒ€์ถœ ---โ‘ 
## ์†Œ๋ฒจ ์ปค๋„ ์ƒ์„ฑ
gx_k = np.array([[-1,0,1], [-2,0,2],[-1,0,1]])
gy_k = np.array([[-1,-2,-1],[0,0,0], [1,2,1]])
## ์†Œ๋ฒจ ํ•„ํ„ฐ ์ ์šฉ
edge_gx = cv2.filter2D(img, -1, gx_k)
edge_gy = cv2.filter2D(img, -1, gy_k)

# ์†Œ๋ฒจ API๋ฅผ ์ƒ์„ฑํ•ด์„œ ์—ฃ์ง€ ๊ฒ€์ถœ
sobelx = cv2.Sobel(img, -1, 1, 0, ksize=3)
sobely = cv2.Sobel(img, -1, 0, 1, ksize=3) 

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
merged1 = np.hstack((img, edge_gx, edge_gy, edge_gx+edge_gy))
merged2 = np.hstack((img, sobelx, sobely, sobelx+sobely))
merged = np.vstack((merged1, merged2))
cv2.imshow('sobel', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

์œ„) ์†Œ๋ฒจ ์ปค๋„ ์ง์ ‘ ์ƒ์„ฑ&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;์•„๋ž˜) ์†Œ๋ฒจ API cv2.Sobel&nbsp;

 

 

 

 

 

5. ์ƒค๋ฅด ํ•„ํ„ฐ (Scharr Filter)

: ์†Œ๋ฒจ ํ•„ํ„ฐ ๊ฐœ์„ ํ•œ ํ•„ํ„ฐ

์ƒค๋ฅผ ํ•„ํ„ฐ๋ฅผ ์œ„ํ•œ ์ปจ๋ณผ๋ฃจ์…˜ ์ปค๋„

dst = cv2.Scharr(src, ddepth, dx, dy, dst, scale, delta, borderType)
- ksize๊ฐ€ ์—†๋‹ค

- ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” cv2.Sobel()๊ณผ ๋™์ผ

# ์ƒค๋ฅด ๋งˆ์Šคํฌ๋ฅผ ์ ์šฉํ•œ ๊ฒฝ๊ณ„ ๊ฒ€์ถœ
import cv2
import numpy as np

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

# ์ƒค๋ฅด ์ปค๋„์„ ์ง์ ‘ ์ƒ์„ฑํ•ด์„œ ์—ฃ์ง€ ๊ฒ€์ถœ ---โ‘ 
gx_k = np.array([[-3,0,3], [-10,0,10],[-3,0,3]])
gy_k = np.array([[-3,-10,-3],[0,0,0], [3,10,3]])
edge_gx = cv2.filter2D(img, -1, gx_k)
edge_gy = cv2.filter2D(img, -1, gy_k)

# ์ƒค๋ฅด API๋กœ ์—ฃ์ง€ ๊ฒ€์ถœ ---โ‘ก
scharrx = cv2.Scharr(img, -1, 1, 0)
scharry = cv2.Scharr(img, -1, 0, 1)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
merged1 = np.hstack((img, edge_gx, edge_gy))
merged2 = np.hstack((img, scharrx, scharry))
merged = np.vstack((merged1, merged2))
cv2.imshow('Scharr', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

- ์œ„) ์ƒค๋ฅด ์ปค๋„ ์ง์ ‘ ์ƒ์„ฑ&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;์•„๋ž˜) ์ƒค๋ฅด API cv2.Scharr

 

 

 

 

 

6. ๋ผํ”Œ๋ผ์‹œ์•ˆ ํ•„ํ„ฐ (Laplacian Filter)

: 2์ฐจ ๋ฏธ๋ถ„์„ ์ ์šฉ

: ๊ฒฝ๊ณ„๋ฅผ ๋” ์ œ๋Œ€๋กœ ๊ฒ€์ถœ

 

dst = cv2.Laplacian(src, ddepth, dst, ksize, scale, delta, borderType)
- ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” cv2.Sobel()๊ณผ ๋™์ผ

# ๋ผํ”Œ๋ผ์‹œ์•ˆ ๋งˆ์Šคํฌ๋ฅผ ์ ์šฉํ•œ ๊ฒฝ๊ณ„ ๊ฒ€์ถœ
import cv2
import numpy as np

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

# ๋ผํ”Œ๋ผ์‹œ์•ˆ ํ•„ํ„ฐ ์ ์šฉ ---โ‘ 
edge = cv2.Laplacian(img, -1)

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

2์ฐจ ๋ฏธ๋ถ„์„ ์ ์šฉํ•œ ๋ผํ”Œ๋ผ์‹œ์•ˆ ํ•„ํ„ฐ

- ๊ฒฝ๊ณ„ ๋šœ๋ ท

- ๊น”๋”ํ•˜๋„ค ๊ทผ๋ฐ ์กฐ๊ธˆ ํฌ๋ฏธํ•œ๋””..

 

 

 

 

 

7. ์บ๋‹ˆ ์—ฃ์ง€ (Canny Edge)

: ํ•œ ๊ฐ€์ง€ ํ•„ํ„ฐ๋งŒ ์‚ฌ์šฉ์ด ์•„๋‹Œ, 4 ๋‹จ๊ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ๊ฒฝ๊ณ„๋ฅผ ๊ฒ€์ถœ

 

1) ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ

: 5 x 5 ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง ํ•„ํ„ฐ๋กœ ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ
2) ๊ฒฝ๊ณ„ ๊ทธ๋ ˆ๋””์–ธํŠธ ๋ฐฉํ–ฅ ๊ณ„์‚ฐ

: ์†Œ๋ฒจ ํ•„ํ„ฐ๋กœ ๊ฒฝ๊ณ„ ๋ฐ ๊ทธ๋ ˆ๋””์–ธํŠธ ๋ฐฉํ–ฅ ๊ฒ€์ถœ
3) ๋น„์ตœ๋Œ€์น˜ ์–ต์ œ(Non-Maximum Suppression)

: ๊ทธ๋ ˆ๋””์–ธํŠธ ๋ฐฉํ–ฅ์—์„œ ๊ฒ€์ถœ๋œ ๊ฒฝ๊ณ„ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’๋งŒ ์„ ํƒํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ œ๊ฑฐ
4) ์ด๋ ฅ ์Šค๋ ˆ์‹œํ™€๋”ฉ

: ๋‘ ๊ฐœ์˜ ๊ฒฝ๊ณ„ ๊ฐ’(Max, Min)์„ ์ง€์ •ํ•ด์„œ ๊ฒฝ๊ณ„ ์˜์—ญ์— ์žˆ๋Š” ํ”ฝ์…€๋“ค ์ค‘

ํฐ ๊ฒฝ๊ณ„ ๊ฐ’(Max) ๋ฐ–์˜ ํ”ฝ์…€๊ณผ ์—ฐ๊ฒฐ์„ฑ์ด ์—†๋Š” ํ”ฝ์…€ ์ œ๊ฑฐ

 

edges = cv2.Canny(img, threshold1, threshold2, edges, apertureSize, L2gardient)
- img : ์ž…๋ ฅ ์˜์ƒ
- threshold1, threshold2 : ์ด๋ ฅ ์Šค๋ ˆ์‹œํ™€๋”ฉ์— ์‚ฌ์šฉํ•  Min, Max ๊ฐ’
- apertureSize : ์†Œ๋ฒจ ๋งˆ์Šคํฌ์— ์‚ฌ์šฉํ•  ์ปค๋„ ํฌ๊ธฐ
- L2gradient : ๊ทธ๋ ˆ๋””์–ธํŠธ ๊ฐ•๋„๋ฅผ ๊ตฌํ•  ๋ฐฉ์‹ (True: ์ œ๊ณฑ ํ•ฉ์˜ ๋ฃจํŠธ False: ์ ˆ๋Œ“๊ฐ’์˜ ํ•ฉ)
- edges : ์—ฃ์ง€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฐ–๋Š” 2์ฐจ์› ๋ฐฐ์—ด

# ์บ๋‹ˆ ์—ฃ์ง€ ๊ฒ€์ถœ
import cv2, time
import numpy as np

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

# ์ผ€๋‹ˆ ์—ฃ์ง€ ์ ์šฉ 
edges = cv2.Canny(img,100,200)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
cv2.imshow('Original', img)
cv2.imshow('Canny', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

4๋‹จ๊ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ผ€๋‹ˆ ์—ฃ์ง€ ํ•„ํ„ฐ

- ๊ฒฝ๊ณ„ ๊ฒ€์ถœ ๊ตฟ๊ตฟ

 

 

 

์ถ”์–ต๋‹๋Š”๋‹ค..

์Šค๋„์ฟ 

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