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

[v0.22]์˜์ƒ์ฒ˜๋ฆฌ_๋ชจํด๋กœ์ง€(Morphology) ์—ฐ์‚ฐ ๋ณธ๋ฌธ

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

[v0.22]์˜์ƒ์ฒ˜๋ฆฌ_๋ชจํด๋กœ์ง€(Morphology) ์—ฐ์‚ฐ

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

220112 ์ž‘์„ฑ

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

https://bkshin.tistory.com/entry/OpenCV-20-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%94%BC%EB%9D%BC%EB%AF%B8%EB%93%9CImage-Pyramids?category=1148027 

 

OpenCV - 20. ์ด๋ฏธ์ง€ ํ”ผ๋ผ๋ฏธ๋“œ(Image Pyramid)

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

bkshin.tistory.com

 

 

 

 

 

์ด๋ฏธ์ง€ ํ”ผ๋ผ๋ฏธ๋“œ(image pyramid)

: ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ํ”ผ๋ผ๋ฏธ๋“œ์ฒ˜๋Ÿผ ๋‹จ๊ณ„์ ์œผ๋กœ ํ™•๋Œ€ํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œํ•˜๋Š” ์ž‘์—…

 

 

1. ๊ฐ€์šฐ์‹œ์•ˆ ํ”ผ๋ผ๋ฏธ๋“œ (gaussian pyramid)

: ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•œ ๋’ค ์ด๋ฏธ์ง€ ํ”ผ๋ผ๋ฏธ๋“œ๋ฅผ ๊ตฌ์„ฑ

 

dst = cv2.pyrDown(src, dst, dstsize, borderType)

: ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•œ ๋’ค ๋ชจ๋“  ์ง์ˆ˜ ํ–‰๊ณผ ์—ด์„ ์‚ญ์ œํ•ด ์ž…๋ ฅ ์˜์ƒ์˜ 1/4 ํฌ๊ธฐ๋กœ ์ถ•์†Œ

 

dst = cv2.pyrUp(src, dst, dstsize, borderType)

:  0์œผ๋กœ ์ฑ„์›Œ์ง„ ์ง์ˆ˜ ํ–‰๊ณผ ์—ด์„ ์ƒˆ๋กญ๊ฒŒ ์‚ฝ์ž…ํ•˜๊ณ  ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•ด

์ฃผ๋ณ€ ํ”ฝ์…€๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• (ํฌ๊ธฐ๋Š” 4๋ฐฐ ํ™•๋Œ€)

 

- src : ์ž…๋ ฅ ์˜์ƒ

- dst : ๊ฒฐ๊ณผ ์˜์ƒ

- distsize : ๊ฒฐ๊ณผ ์˜์ƒ ํฌ๊ธฐ

- borderType : ์™ธ๊ณฝ ๋ณด์ • ๋ฐฉ์‹

# ๊ฐ€์šฐ์‹œ์•ˆ ์ด๋ฏธ์ง€ ํ”ผ๋ผ๋ฏธ๋“œ
import cv2

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

# ๊ฐ€์šฐ์‹œ์•ˆ ์ด๋ฏธ์ง€ ํ”ผ๋ผ๋ฏธ๋“œ ์ถ•์†Œ
smaller = cv2.pyrDown(img) # img x 1/4
# ๊ฐ€์šฐ์‹œ์•ˆ ์ด๋ฏธ์ง€ ํ”ผ๋ผ๋ฏธ๋“œ ํ™•๋Œ€
bigger = cv2.pyrUp(img) # img x 4

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
cv2.imshow('img', img)
cv2.imshow('pyrDown', smaller)
cv2.imshow('pyrUp', bigger)
cv2.waitKey(0)
cv2.destroyAllWindows()

๊ฐ€์šฐ์‹œ์•ˆ ํ”ผ๋ผ๋ฏธ๋“œ๋กœ 4๋ฐฐ ํ™•๋Œ€, 1/4 ์ถ•์†Œ

- ํ™•๋Œ€, ์ถ•์†Œ ์ด๋ฏธ์ง€์˜ ํ™”์งˆ์ด ๊ตฌ์งˆ๊ตฌ์งˆ~

 

 

 

2. ๋ผํ”Œ๋ผ์‹œ์•ˆ ํ”ผ๋ผ๋ฏธ๋“œ (laplacian pyramid)

: cv2.pyUp(), cv2.pyDown() ์˜ ํ™”์งˆ ๋–จ์–ด์ง€๋Š” ๋ฌธ์ œ์ ์„ ๊ฐœ์„ ํ•œ ๋ฐฉ์‹

# ๋ผํ”Œ๋ผ์‹œ์•ˆ ํ”ผ๋ผ๋ฏธ๋“œ๋กœ ์˜์ƒ ๋ณต์›
import cv2
import numpy as np

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

# ์›๋ณธ ์˜์ƒ์„ ๊ฐ€์šฐ์‹œ์•ˆ ํ”ผ๋ผ๋ฏธ๋“œ๋กœ ์ถ•์†Œ
smaller = cv2.pyrDown(img)
# ์ถ•์†Œํ•œ ์˜์ƒ์„ ๊ฐ€์šฐ์‹œ์•ˆ ํ”ผ๋ผ๋ฏธ๋“œ๋กœ ํ™•๋Œ€
bigger = cv2.pyrUp(smaller)

# ์›๋ณธ์—์„œ ํ™•๋Œ€ํ•œ ์˜์ƒ ๋นผ๊ธฐ
laplacian = cv2.subtract(img, bigger)
# ํ™•๋Œ€ ํ•œ ์˜์ƒ์— ๋ผํ”Œ๋ผ์‹œ์•ˆ ์˜์ƒ ๋”ํ•ด์„œ ๋ณต์›
restored = bigger + laplacian

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ (์›๋ณธ ์˜์ƒ, ๋ผํ”Œ๋ผ์‹œ์•ˆ, ํ™•๋Œ€ ์˜์ƒ, ๋ณต์› ์˜์ƒ)
merged = np.hstack((img, laplacian, bigger, restored))
cv2.imshow('Laplacian Pyramid', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

       ์›๋ณธ                                      ๋ผํ”Œ๋ผ์‹œ์•ˆ                                     ํ™•๋Œ€                                         ๋ณต์›

- ๋ผํ”Œ๋ผ์‹œ์•ˆ ํ”ผ๋ผ๋ฏธ๋“œ = ( cv2.pyUp() ์ด๋ฏธ์ง€ - ์›๋ณธ ์ด๋ฏธ์ง€ ) + bigger ์ด๋ฏธ์ง€ (cv2.pyUp())

- ๋ผํ”Œ๋ผ์‹œ์•ˆ ์ด๋ฏธ์ง€ ํฌ๋ฏธํ•˜์ง€๋งŒ ๊ฒฝ๊ณ„ ์•ฝ๊ฐ„ ๋ณด์ž…๋‹ˆ๋”,,

- ํ™•๋Œ€(cv2.pyUp()) ์˜์ƒ์€ ํ™”์งˆ ๋–จ์–ด์ง€๊ณ 

- ๋ณต์›(๋ผํ”Œ๋ผ์‹œ์•ˆ) ์˜์ƒ์€ ํ™”์งˆ ๋ณต๊ตฌ!

 

 

 

 

 

 

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