HSV(Hue, Saturation, Value)
HSV(Hue, Saturation, Value)
๊ณต๊ฐ์ ์์์ ํํํ๊ธฐ์ ๊ฐํธํ ์์ ๊ณต๊ฐ์
๋๋ค.
์ด๋ฏธ์ง์์ ์์์ ๊ฒ์ถํ๋ค๊ณ ๊ฐ์ ํ ๋ BGR์ด๋ RGB ํจํด์ผ๋ก๋ ์ธ๊ฐ์ด ์ธ์งํ๋ ์์ญ์ ์์์ ๊ตฌ๋ณํ๊ธฐ์๋ ๋งค์ฐ ์ด๋ ต๊ณ ๋ณต์กํฉ๋๋ค.
ํ์ง๋ง HSV ์์ ๊ณต๊ฐ์ ํ์ฉํ๋ค๋ฉด ๊ฐํธํ๊ณ ๋น ๋ฅด๊ฒ ํน์ ์์์ ๊ฒ์ถํ๊ณ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
์์(Hue)
์ ๋นจ๊ฐ์, ๋
ธ๋์, ํ๋์ ๋ฑ์ผ๋ก ์ธ์๋๋ ์์ ์ค ํ๋ ๋๋ ๋์ ์กฐํฉ๊ณผ ์ ์ฌํ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์๊ฐ์ ๊ฐ๊ฐ์ ์์ฑ์ ์๋ฏธํฉ๋๋ค.
0ยฐ์์ 360ยฐ์ ๋ฒ์๋ก ํํ๋๋ฉฐ, ํ๋์์ 220ยฐ์์ 260ยฐ ์ฌ์ด์ ์์ต๋๋ค. OpenCV์์๋ 0 ~ 179์ ๋ฒ์๋ก ํํ๋ฉ๋๋ค.
์ฑ๋(Saturation)
๋ ์ด๋ฏธ์ง์ ์์ ๊น์ด๋ก, ์์์ด ์ผ๋ง๋ ์ ๋ช
ํ(์์ํ) ์์ธ์ง๋ฅผ ์๋ฏธํฉ๋๋ค.
์๋ฌด๊ฒ๋ ์์ง ์์ ๋ง๊ณ ๊นจ๋ํ๋ฉฐ ์์์ ๊ฐ๊น์ด ๊ฒ์ ์ฑ๋๊ฐ ๋๋ค๊ณ ํํํฉ๋๋ค.
0%์์ 100%์ ๋น์จ๋ก ํํ๋๋ฉฐ, 0%์ ๊ฐ๊น์ธ์๋ก ๋ฌด์ฑ์, 100%์ ๊ฐ๊น์ธ์๋ก ๊ฐ์ฅ ์ ๋ช ํ(์์ํ)์์ด ๋ฉ๋๋ค. OpenCV์์๋ 0 ~ 255์ ๋ฒ์๋ก ํํ๋ฉ๋๋ค.
๋ช
๋(Value)
๋ ์์ ๋ฐ๊ณ ์ด๋์ด ์ ๋๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ช
๋๊ฐ ๋์์๋ก ์์์ด ๋ฐ์์ง๋ฉฐ, ๋ช
๋๊ฐ ๋ฎ์์๋ก ์์์ด ์ด๋์์ง๋๋ค.
0%์์ 100%์ ๋น์จ๋ก ํํ๋๋ฉฐ, 0%์ ๊ฐ๊น์ธ์๋ก ๊ฒ์์, 100%์ ๊ฐ๊น์ธ์๋ก ๊ฐ์ฅ ๋ง์์์ด ๋ฉ๋๋ค. OpenCV์์๋ 0 ~ 255์ ๋ฒ์๋ก ํํ๋ฉ๋๋ค.
- Tip : 0 ~ 360์ ๋ฒ์๋ 1 Byte(uint8)์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฒ ๋๋ฏ๋ก ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ธฐ ์ํด, ์ ๋ฐ์ ๊ฐ์ธ 0 ~ 179์ ๋ฒ์๋ก ํํํฉ๋๋ค.
๋ฉ์ธ ์ฝ๋ (1)
import cv2
src = cv2.imread("Image/14.jpg", cv2.IMREAD_COLOR)
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
cv2.imshow("h", h)
cv2.imshow("s", s)
cv2.imshow("v", v)
cv2.waitKey()
cv2.destroyAllWindows()
์ธ๋ถ ์ฝ๋
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
์์ ๊ณต๊ฐ ๋ณํ ํจ์(cv2.cvtcolor)
๋ก ์ด๋ฏธ์ง์ ์์ ๊ณต๊ฐ์ BGR
์์ HSV
๋ก ๋ณ๊ฒฝํฉ๋๋ค.
๊ฐ๊ฐ์ ์ฑ๋๋ก ๋ถ๋ฆฌํ๊ธฐ ์ํด์ ์ฑ๋ ๋ถ๋ฆฌ ํจ์(cv2.split)
๋ฅผ ์ ์ฉํฉ๋๋ค.
mv = cv2.threshold(src)
๋ ์
๋ ฅ ์ด๋ฏธ์ง(src)
์ ์ฑ๋์ ๋ถ๋ฆฌํ์ฌ ๋ฐฐ์ด(mv)
์ ํํ๋ก ๋ฐํํฉ๋๋ค.
- Tip : ๋ถ๋ฆฌ๋ ์ฑ๋๋ค์
๋จ์ผ ์ฑ๋
์ด๋ฏ๋ก ํ๋ฐฑ์ ์์์ผ๋ก๋ง ํํ๋ฉ๋๋ค.
์ถ๋ ฅ ๊ฒฐ๊ณผ
Hue
Saturation
Value
๋ฉ์ธ ์ฝ๋ (2)
import cv2
src = cv2.imread("Image/tomato.jpg", cv2.IMREAD_COLOR)
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
h = cv2.inRange(h, 8, 20)
orange = cv2.bitwise_and(hsv, hsv, mask = h)
orange = cv2.cvtColor(orange, cv2.COLOR_HSV2BGR)
cv2.imshow("orange", orange)
cv2.waitKey()
cv2.destroyAllWindows()
์ธ๋ถ ์ฝ๋
h = cv2.inRange(h, 8, 20)
orange = cv2.bitwise_and(hsv, hsv, mask = h)
orange = cv2.cvtColor(orange, cv2.COLOR_HSV2BGR)
Hue
์ ๋ฒ์๋ฅผ ์กฐ์ ํ์ฌ ํน์ ์์์ ๋ฒ์๋ง ์ถ๋ ฅํ ์ ์์ต๋๋ค.
๋ฐฐ์ด ์์์ ๋ฒ์ ์ค์ ํจ์(cv2.inRange)
๋ก ์
๋ ฅ๋ ๋ฐฐ์ด์ ํน์ ๋ฒ์ ์์ญ๋ง ์ถ์ถํ ์ ์์ต๋๋ค.
dst = cv2.inRange(src, lowerb, upperb)
๋ ์
๋ ฅ ์ด๋ฏธ์ง(src)
์ ๋ฎ์ ๋ฒ์(lowerb)
์์ ๋์ ๋ฒ์(upperb)
์ฌ์ด์ ์์๋ฅผ ์ถ์ถํฉ๋๋ค.
์ฃผํฉ์
์ ์ฝ 8 ~ 20 ๋ฒ์๋ฅผ ๊ฐ์ต๋๋ค.
์ดํ, ํด๋น ์ถ์ถํ ์์ญ์ ๋ง์คํฌ
๋ก ์ฌ์ฉํด ์ด๋ฏธ์ง ์์ ๋ง์์ ํด๋น ๋ถ๋ถ๋ง ์ถ๋ ฅํฉ๋๋ค.
๋นํธ ์ฐ์ฐ AND(cv2.bitwise_and)
๋ก ๊ฐ๋จํ๊ฒ ๋ง์คํฌ๋ฅผ ๋ง์์ธ ์ ์์ต๋๋ค.
dst = cv2.bitwise_and(src1, src2, mask)
๋ ์
๋ ฅ ์ด๋ฏธ์ง1(src1)
๊ณผ ์
๋ ฅ ์ด๋ฏธ์ง2(src2)
์ ํฝ์
์ ์ด์ง๊ฐ์ด ๋์ผํ ์์ญ๋ง AND ์ฐ์ฐํ์ฌ ๋ฐํํฉ๋๋ค.
๋ง์คํฌ ์์ญ์ด ์กด์ฌํ๋ค๋ฉด ๋ง์คํฌ ์์ญ๋ง AND ์ฐ์ฐ์ ์งํํฉ๋๋ค.
ํน์ ์์ญ(๋ง์คํฌ)์ AND ์ฐ์ฐ์ด ์๋ฃ๋๋ค๋ฉด ๋ค์ HSV
์์ ๊ณต๊ฐ์์ BGR
์์ ๊ณต๊ฐ์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.