๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[v0.11]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง ์ฐ์ฐ (ํฉ์ฑ, ์ํ ๋ธ๋ ๋ฉ, ๋ง์คํน) ๋ณธ๋ฌธ
[v0.11]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง ์ฐ์ฐ (ํฉ์ฑ, ์ํ ๋ธ๋ ๋ฉ, ๋ง์คํน)
์ง์ง์ํ์นด 2022. 1. 2. 16:07220102 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ๊ทํ์ด ์์ฌ๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
OpenCV - 9. ์ด๋ฏธ์ง ์ฐ์ฐ (ํฉ์ฑ, ์ํ ๋ธ๋ ๋ฉ, ๋ง์คํน)
์ด๋ฒ ํฌ์คํ ์์๋ ์ด๋ฏธ์ง ์ฐ์ฐ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์ญ์ 'ํ์ด์ฌ์ผ๋ก ๋ง๋๋ OpenCV ํ๋ก์ ํธ(์ด์ธ์ฐ ์ )'๋ฅผ ์ ๋ฆฌํ ๊ฒ์์ ๋ฐํ๋๋ค. ์ฝ๋: github.com/BaekKyunShin/OpenCV_Project_Python/t
bkshin.tistory.com
1. ์ด๋ฏธ์ง ์ฐ์ฐ
: ํ ํฝ์ ์ด ๊ฐ์ง ์ ์๋ ๊ฐ์ ๋ฒ์๋ 0~255
cv2.add(src1, src2, dest, mask, dtype)
: src1๊ณผ src2 ๋ํ๊ธฐ
- src1 : ์ฒซ ๋ฒ์งธ ์ ๋ ฅ ์ด๋ฏธ์ง
- src2 : ๋ ๋ฒ์งธ ์ ๋ ฅ ์ด๋ฏธ์ง
- dest(optional) : ์ถ๋ ฅ ์์
- mask(optional) : mask ๊ฐ์ด 0์ด ์๋ ํฝ์ ๋ง ์ฐ์ฐ
- dtype(optional) : ์ถ๋ ฅ ๋ฐ์ดํฐ ํ์ (dtype)
cv2.subtract(src1, src2, dest, mask, dtype)
: src1์์ src2 ๋นผ๊ธฐ
- cv2.add()์ ํ๋ผ๋ฏธํฐ ๋์ผ
cv2.multiply(src1, src2, dest, scale, dtype)
: src1๊ณผ src2 ๊ณฑํ๊ธฐ
- scale(optional) : ์ฐ์ฐ ๊ฒฐ๊ณผ์ ์ถ๊ฐ ์ฐ์ฐํ ๊ฐ
cv2.divide(src1, src2, dest, scale, dtype)
: src1์ src2๋ก ๋๋๊ธฐ
- cv2.multiply()์ ํ๋ผ๋ฏธํฐ ๋์ผ
# ์ด๋ฏธ์ง์ ์ฌ์น ์ฐ์ฐ
import cv2
import numpy as np
# ---โ ์ฐ์ฐ์ ์ฌ์ฉํ ๋ฐฐ์ด ์์ฑ
a = np.uint8([[200, 50]])
b = np.uint8([[100, 100]])
#---โก NumPy ๋ฐฐ์ด ์ง์ ์ฐ์ฐ
add1 = a + b
sub1 = a - b
mult1 = a * 2
div1 = a / 3
# ---โข OpenCV API๋ฅผ ์ด์ฉํ ์ฐ์ฐ
add2 = cv2.add(a, b)
sub2 = cv2.subtract(a, b)
mult2 = cv2.multiply(a , 2)
div2 = cv2.divide(a, 3)
#---โฃ ๊ฐ ์ฐ์ฐ ๊ฒฐ๊ณผ ์ถ๋ ฅ
print("numpy-----OpenCV API")
print(add1, add2)
print(sub1, sub2)
print(mult1, mult2)
print(div1, div2)
numpy--------------OpenCV API
[[ 44 150]] [[255 150]]
[[100 206]] [[100 0]]
[[144 100]] [[255 100]]
[[66.66666667 16.66666667]] [[67 17]]
1) numpy
add1 :
[ 200 + 100 = 300 -> 300 - 255 - 1 = 44 , 50 + 100 = 150]
unit8 ํ์ ์ ๊ฐ์ ๋ฒ์๋ 0 ~ 255์ด๋ฏ๋ก 255๋ฅผ ๋๋ ๊ฐ์ ๋ค์ 0๋ถํฐ ์นด์ดํ
sub1 :
[ 200 - 100 = 100, 50 - 100 = -50 -> -50 + 255 + 1 = 206 ]
mult1 :
[ 200 * 2 = 400 -> 400 - 255 - 1 = 144, 50 * 2= 100 ]
div1 :
[ 200 / 3 = 66.666, 50 / 3 = 16.6666]
2) OpenCV API
add2 :
[ 200 + 100 = 300 -> 255 , 50 + 100 = 150 ]
cv2.add() ํจ์๋ฅผ ํ์ฉํ๋ฉด 255๋ฅผ ์ด๊ณผํ๋ ๋ชจ๋ ๊ฐ์ 255๋ก ๋ฐํ
sub2 :
[ 200 - 100 = 100, 50 - 100 = -50 -> 0 ]
OpenCV์์๋ 0๋ณด๋ค ์์ ๋ชจ๋ ๊ฐ์ 0์ผ๋ก ๋ฐํ
mult2 :
[ 200 * 2 = 400 -> 255, 50 * 2= 100 ]
div2 :
[ 200 / 3 = 66.666 -> 67, 50 / 3 = 16.6666 -> 17]
๊ณฑํ๊ธฐ์ ๋๋๊ธฐ ์ฐ์ฐ๋ 255๋ฅผ ์ด๊ณผํ๊ฑฐ๋ 0๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง ์๊ณ , ์์์ ์ ๊ฐ์ง ์์
+) mask์ ๊ฐ
# mask์ ๋์ ํ ๋น ์ฐ์ฐ
import cv2
import numpy as np
#---โ ์ฐ์ฐ์ ์ฌ์ฉํ ๋ฐฐ์ด ์์ฑ
a = np.array([[1, 2]], dtype=np.uint8)
b = np.array([[10, 20]], dtype=np.uint8)
#---โก 2๋ฒ์งธ ์์๊ฐ 0์ธ ๋ง์คํฌ ๋ฐฐ์ด ์์ฑ
mask = np.array([[1, 0]], dtype=np.uint8)
#---โข ๋์ ํ ๋น๊ณผ์ ๋น๊ต ์ฐ์ฐ
c1 = cv2.add(a, b, None, mask)
print(c1)
c2 = cv2.add(a, b, b.copy(), mask)
print(c2, b)
c3 = cv2.add(a, b, b, mask)
print(c3, b)
mask์ ๊ฐ
[[11 0]]
[[11 20]] [[10 20]]
[[11 20]] [[11 20]]
1) cv2.add(a, b, None, mask)
[ 1 + 10 = 11, 0]
๋ฐฐ์ด์ด [1, 0]์ธ mask๋ฅผ ์ง์ -> mask ๊ฐ์ด 0์ด ์๋ ์์น์ ์๋ ํฝ์ ๋ง ์ฐ์ฐ
2) cv2.add(a, b, b.copy(), mask)
[ 1 + 10 = 11, 0] [ 10, 20 ]
3) cv2.add(a, b, b, mask)
[ 1 + 10 = 11, 0] [ 11, 20 ]
a์ b์ ์ฒซ ๋ฒ์งธ ์์๋ง ๋ํ์ฌ b์ ์ฒซ ๋ฒ์งธ ์์์ ์ ์ฉ
2. ์ด๋ฏธ์ง ํฉ์ฑ
: numpy์ ํฉ ์ฐ์ฐ์ ์ํํ๋ฉด ํฝ์ ๊ฐ์ด 255๊ฐ ๋๋ ๊ฒฝ์ฐ ์ด๊ณผ ๊ฐ๋ง์ ๊ฐ์ง -> ์ด๋ฏธ์ง๊ฐ ๊ฒ์์์ ๊ฐ๊น๊ฒ
: cv2.add() ์ฐ์ฐ์ ํ๋ฉด ๋๋ถ๋ถ์ ํฝ์ ๊ฐ์ด 255 ๊ฐ๊น์ด ๋ชฐ๋ฆฌ๋ ํ์์ด ๋ฐ์ -> ์์์ด ์ ์ฒด์ ์ผ๋ก ํ์๊ฒ
# ์ด๋ฏธ์ง ๋จ์ ํฉ์ฑ
import cv2
import numpy as np
import matplotlib.pylab as plt
# ---โ ์ฐ์ฐ์ ์ฌ์ฉํ ์ด๋ฏธ์ง ์ฝ๊ธฐ
img1 = cv2.imread('img/wing_wall.jpg')
img2 = cv2.imread('img/yate.jpg')
# ---โก ์ด๋ฏธ์ง ๋ง์
img3 = img1 + img2 # ๋ํ๊ธฐ ์ฐ์ฐ
img4 = cv2.add(img1, img2) # OpenCV ํจ์
imgs = {'img1':img1, 'img2':img2, 'img1+img2': img3, 'cv.add(img1, img2)': img4}
# ---โข ์ด๋ฏธ์ง ์ถ๋ ฅ
for i, (k, v) in enumerate(imgs.items()):
plt.subplot(2,2, i + 1)
plt.imshow(v[:,:,::-1])
plt.title(k)
plt.xticks([]); plt.yticks([])
plt.show()
-> numpy ๋ ๊ฑฐ๋ญํ๊ฒ
-> openCV๋ ํ์๊ฒ
+) ์ํ ๋ธ๋ ๋ฉ
: ๋ ์ด๋ฏธ์ง๋ฅผ ์ ๋๋ก ํฉ์ฑํ๋ ค๋ฉด ๊ฐ๊ฐ์ ์ด๋ฏธ์ง์ ๊ฐ์ค์น๋ฅผ ์ฃผ๊ณ ํฉํด์ผ ํ๋ค
: ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ ์ ์๋๋ฐ, ์ด ๊ฐ์ค์น๋ฅผ ์ํ(alpha) ๊ฐ
: ์๋ก์ด ์ด๋ฏธ์ง ์ํ(alpha)๋ฅผ ํ์ฉํ์ฌ ํฉ์ฑ ๊ฒฐ๊ณผ ํฝ์ ๊ฐ g(x)๋ฅผ ๊ตฌํ๋ ๊ณต์
cv2.addWeight(img1, alpha, img2, beta, gamma)
- img1, img2 : ํฉ์ฑํ ๋ ์ด๋ฏธ์ง
- alpha : img1์ ์ง์ ํ ๊ฐ์ค์น(์ํ ๊ฐ)
- beta : img2์ ์ง์ ํ ๊ฐ์ค์น, ํํ (1-alpha) ์ ์ฉ
- gamma : ์ฐ์ฐ ๊ฒฐ๊ณผ์ ๊ฐ๊ฐํ ์์, ํํ 0 ์ ์ฉ
# ์ํ ๋ธ๋ ๋ฉ
import cv2
import numpy as np
alpha = 0.5 # ํฉ์ฑ์ ์ฌ์ฉํ ์ํ ๊ฐ
#---โ ํฉ์ฑ์ ์ฌ์ฉํ ์์ ์ฝ๊ธฐ
img1 = cv2.imread('img/wing_wall.jpg')
img2 = cv2.imread('img/yate.jpg')
# ---โก NumPy ๋ฐฐ์ด์ ์์์ ์ง์ ์ฐ์ฐํด์ ์ํ ๋ธ๋ ๋ฉ ์ ์ฉ
blended = img1 * alpha + img2 * (1-alpha)
blended = blended.astype(np.uint8) # ์์์ ๋ฐ์์ ์ ๊ฑฐํ๊ธฐ ์ํจ
cv2.imshow('img1 * alpha + img2 * (1-alpha)', blended)
# ---โข addWeighted() ํจ์๋ก ์ํ ๋ธ๋ ๋ฉ ์ ์ฉ
dst = cv2.addWeighted(img1, alpha, img2, (1-alpha), 0)
cv2.imshow('cv2.addWeighted', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
+) ํธ๋๋ฐ์ด์ฉ
# ํธ๋๋ฐ๋ก ์ํ ๋ธ๋ ๋ฉ
import cv2
import numpy as np
win_name = 'Alpha blending' # ์ฐฝ ์ด๋ฆ
trackbar_name = 'fade' # ํธ๋ ๋ฐ ์ด๋ฆ
# ---โ ํธ๋ ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์
def onChange(x):
alpha = x/100
dst = cv2.addWeighted(img1, 1-alpha, img2, alpha, 0)
cv2.imshow(win_name, dst)
# ---โก ํฉ์ฑ ์์ ์ฝ๊ธฐ
img1 = cv2.imread('img/wing_wall.jpg')
img2 = cv2.imread('img/yate.jpg')
# ---โข ์ด๋ฏธ์ง ํ์ ๋ฐ ํธ๋ ๋ฐ ๋ถ์ด๊ธฐ
cv2.imshow(win_name, img1)
cv2.createTrackbar(trackbar_name, win_name, 0, 100, onChange)
cv2.waitKey()
cv2.destroyAllWindows()
3. ๋นํธ์์ด์ฆ ์ฐ์ฐ
: ๋ ์ด๋ฏธ์ง๋ฅผ ํฉ์ฑํ ๋ ํน์ ์์ญ๋ง ์ ํํ๊ฑฐ๋ ํน์ ์์ญ๋ง ์ ์ธํ๋ ๋ฑ์ ์ ๋ณ์ ์ธ ์ฐ์ฐ
cv2.bitwise_and(img1, img2, mask=None)
: ๊ฐ ํฝ์ ์ ๋ํด AND ์ฐ์ฐ
cv2.bitwise_or(img1, img2, mask=None)
: ๊ฐ ํฝ์ ์ ๋ํด OR ์ฐ์ฐ
cv2.bitwise_xor(img1, img2, mask=None)
: ๊ฐ ํฝ์ ์ ๋ํด XOR ์ฐ์ฐ
cv2.bitwise_not(img1, img2, mask=None)
: ๊ฐ ํฝ์ ์ ๋ํด NOT ์ฐ์ฐ
- img1, img2๋ ์ฐ์ฐ์ ํ ์ด๋ฏธ์ง
- ๋ ์ด๋ฏธ์ง๋ ๋์ผํ shape๋ฅผ ๊ฐ์ง๊ธฐ
- mask๋ 0์ด ์๋ ํฝ์ ๋ง ์ฐ์ฐ
# ๋นํธ์์ด์ฆ ์ฐ์ฐ
import numpy as np, cv2
import matplotlib.pylab as plt
#--โ ์ฐ์ฐ์ ์ฌ์ฉํ ์ด๋ฏธ์ง ์์ฑ
img1 = np.zeros( ( 200,400), dtype=np.uint8)
img2 = np.zeros( ( 200,400), dtype=np.uint8)
img1[:, :200] = 255 # ์ผ์ชฝ์ ํฐ์(255), ์ค๋ฅธ์ชฝ์ ๊ฒ์ ์(0)
img2[100:200, :] = 255 # ์์ชฝ์ ๊ฒ์ ์(0), ์๋์ชฝ์ ํฐ์(255)
#--โก ๋นํธ์์ด์ฆ ์ฐ์ฐ
bitAnd = cv2.bitwise_and(img1, img2)
bitOr = cv2.bitwise_or(img1, img2)
bitXor = cv2.bitwise_xor(img1, img2)
bitNot = cv2.bitwise_not(img1)
#--โข Plot์ผ๋ก ๊ฒฐ๊ณผ ์ถ๋ ฅ
imgs = {'img1':img1, 'img2':img2, 'and':bitAnd,
'or':bitOr, 'xor':bitXor, 'not(img1)':bitNot}
for i, (title, img) in enumerate(imgs.items()):
plt.subplot(3,2,i+1)
plt.title(title)
plt.imshow(img, 'gray')
plt.xticks([]); plt.yticks([])
plt.show()
1) and
: 1 + 0 = 0 : 1 + 0 = 0
: 1 + 1 = 1 : 1 + 0 = 0
2) or
: 1 + 0 = 1 : 0 + 0 = 0
: 1 + 1 = 1 : 0 + 1 = 1
3) xor
: 1 + 0 = 1 : 0 + 0 = 0
: 1 + 1 = 0 : 0 + 1 = 1
4) not (img1)
: img1๊ณผ ๋ฐ๋๋ก
+) bitwize๋ก ์ํ๋ ๋ถ๋ถ๋ง ๋ผ๊ธฐ
# bitwise_and ์ฐ์ฐ์ผ๋ก ๋ง์คํนํ๊ธฐ
import numpy as np, cv2
import matplotlib.pylab as plt
#--โ ์ด๋ฏธ์ง ์ฝ๊ธฐ
img = cv2.imread('img/lena.png')
#--โก ๋ง์คํฌ ๋ง๋ค๊ธฐ
mask = np.zeros_like(img)
cv2.circle(mask, (260,210), 100, (255,255,255), -1)
#cv2.circle(๋์์ด๋ฏธ์ง, (์์ x, ์์ y), ๋ฐ์ง๋ฆ, (์์), ์ฑ์ฐ๊ธฐ)
#--โข ๋ง์คํน
masked = cv2.bitwise_and(img, mask)
#--โฃ ๊ฒฐ๊ณผ ์ถ๋ ฅ
cv2.imshow('original', img)
cv2.imshow('mask', mask)
cv2.imshow('masked', masked)
cv2.waitKey()
cv2.destroyAllWindows()
-> AND ์ฐ์ฐ์ True(0์ด ์๋ ๊ฐ)์ True(0์ด ์๋ ๊ฐ)๊ฐ ํฉํด์ง ๋ถ๋ถ๋ง True๊ฐ ์ถ๋ ฅ
4. ๋ ์ด๋ฏธ์ง์ ์ฐจ์ด
diff = cv2.absdiff(img1, img2)
- img1, img2 : ์
๋ ฅ ์ด๋ฏธ์ง
- diff : ๋ ์ด๋ฏธ์ง์ ์ฐจ์ ์ ๋ ๊ฐ
# ๋ ์ด๋ฏธ์ง์ ์ฐจ๋ฅผ ํตํด ๋๋ฉด์ ์ฐจ์ด ์ฐพ์๋ด๊ธฐ
import numpy as np, cv2
#--โ ์ฐ์ฐ์ ํ์ํ ์์์ ์ฝ๊ณ ๊ทธ๋ ์ด์ค์ผ์ผ๋ก ๋ณํ
img1 = cv2.imread('img/robot_arm1.jpg')
img2 = cv2.imread('img/robot_arm0.jpg')
img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
#--โก ๋ ์์์ ์ ๋๊ฐ ์ฐจ ์ฐ์ฐ
diff = cv2.absdiff(img1_gray, img2_gray)
#--โข ์ฐจ ์์์ ๊ทน๋ํ ํ๊ธฐ ์ํด ์ฐ๋ ์ํ๋ ์ฒ๋ฆฌ ๋ฐ ์ปฌ๋ฌ๋ก ๋ณํ
_, diff = cv2.threshold(diff, 1, 255, cv2.THRESH_BINARY)
diff_red = cv2.cvtColor(diff, cv2.COLOR_GRAY2BGR)
diff_red[:,:,2] = 0
#--โฃ ๋ ๋ฒ์งธ ์ด๋ฏธ์ง์ ๋ณํ ๋ถ๋ถ ํ์
spot = cv2.bitwise_xor(img2, diff_red)
#--โค ๊ฒฐ๊ณผ ์์ ์ถ๋ ฅ
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('diff', diff)
cv2.imshow('spot', spot)
cv2.waitKey()
cv2.destroyAllWindows()
- ํ์์กฐ๋ก ๋ณํ๋ ๋ ์ด๋ฏธ์ง์ ์ฐจ์ด ๊ตฌํ๊ธฐ
- ์ฐจ์ด๋ฅผ ๋๋ ทํ๊ฒ ํ๊ธฐ ์ํด cv2.threshold() ์ฌ์ฉํ์ฌ 1๋ณด๋ค ํฐ ๊ฐ์ 255๋ก, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 0์ผ๋ก ๋ฐ๊พธ๊ธฐ
- ์์ ํํํ๊ธฐ ์ํด cv2.cvtColor() ์ฌ์ฉํ์ฌ ์์ ์ค์ผ์ผ์ ์ฐจ์ ๋ณ๊ฒฝ ํ ๋นจ๊ฐ์์ผ๋ก ๋ณ๊ฒฝ
- cv2.bitwise_xor() ์ผ๋ก ์ฐจ์ด ์๋ ๊ณณ์ด ๋นจ๊ฐ ์์ญ์ผ๋ก ํ์
5. ์ด๋ฏธ์ง ํฉ์ฑ๊ณผ ๋ง์คํน
: ๋ ์ด๋ฏธ์ง๋ฅผ ํฉ์ฑ -> ์ผ๋ฐ์ ์ผ๋ก ํ๋์ ์ด๋ฏธ์ง๋ ๋ฐฐ๊ฒฝ๊ณผ ์ ๊ฒฝ(๋ฐฐ๊ฒฝ์ด ์๋ ์ค์ ์ด๋ฏธ์ง)
: BGRA ์์ ํ์์ผ๋ก ํํํ ๋,
๋ฐฐ๊ฒฝ์ A(์ํ, alpha)๊ฐ 0์ด๊ณ , ์ ๊ฒฝ์ A๊ฐ 255 ( A๊ฐ 0์ด๋ฉด ํฌ๋ช ํ๊ณ , 255๋ฉด ๋ถํฌ๋ช )
# ํฌ๋ช
๋ฐฐ๊ฒฝ PNG ํ์ผ์ ์ด์ฉํ ํฉ์ฑ
import cv2
import numpy as np
#--โ ํฉ์ฑ์ ์ฌ์ฉํ ์์ ์ฝ๊ธฐ, ์ ๊ฒฝ ์์์ 4์ฑ๋ png ํ์ผ
img_fg = cv2.imread('img/opencv_logo.png', cv2.IMREAD_UNCHANGED)
img_bg = cv2.imread('img/clover.jpg')
#--โก ์ํ์ฑ๋์ ์ด์ฉํด์ ๋ง์คํฌ์ ์ญ๋ง์คํฌ ์์ฑ
_, mask = cv2.threshold(img_fg[:,:,3], 1, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
#--โข ์ ๊ฒฝ ์์ ํฌ๊ธฐ๋ก ๋ฐฐ๊ฒฝ ์์์์ ROI ์๋ผ๋ด๊ธฐ
img_fg = cv2.cvtColor(img_fg, cv2.COLOR_BGRA2BGR)
h, w = img_fg.shape[:2]
roi = img_bg[10:10+h, 10:10+w ]
#--โฃ ๋ง์คํฌ ์ด์ฉํด์ ์ค๋ ค๋ด๊ธฐ
masked_fg = cv2.bitwise_and(img_fg, img_fg, mask=mask)
masked_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
#--โฅ ์ด๋ฏธ์ง ํฉ์ฑ
added = masked_fg + masked_bg
img_bg[10:10+h, 10:10+w] = added
cv2.imshow('mask', mask)
cv2.imshow('mask_inv', mask_inv)
cv2.imshow('masked_fg', masked_fg)
cv2.imshow('masked_bg', masked_bg)
cv2.imshow('added', added)
cv2.imshow('result', img_bg)
cv2.waitKey()
cv2.destroyAllWindows()
- _, mask = cv2.threshod(img_fg[:, :, 3], 1, 255, cv2.THRESH_BINARY)๋ฅผ ํธ์ถํ์ฌ ๋ฐฐ๊ฒฝ๊ณผ ์ ๊ฒฝ์ ๋ถ๋ฆฌํ๋ ๋ง์คํฌ
- mask_inv = cv2.bitwise_not(mask)์ด๋ฏ๋ก mask_inv๋ mask์ ๋ฐ๋ (์ฆ, ๋ฐฐ๊ฒฝ์ ํฐ์, ์ ๊ฒฝ์ ๊ฒ์์)
+) ์์ ๋ณ๋ก ์ถ์ถ
cv2.inRange(hsv, lower, upper)
: hsv์ ๋ชจ๋ ๊ฐ ์ค lower์ upper ๋ฒ์ ์ฌ์ด์ ์๋ ๊ฐ์ 255, ๋๋จธ์ง ๊ฐ์ 0์ผ๋ก ๋ณํ
# HSV ์์์ผ๋ก ๋ง์คํน
import cv2
import numpy as np
import matplotlib.pylab as plt
#--โ ํ๋ธ ์์ ์ฝ์ด์ HSV๋ก ๋ณํ
img = cv2.imread("img/cube.JPG")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#--โก ์์๋ณ ์์ญ ์ง์
blue1 = np.array([90, 50, 50])
blue2 = np.array([120, 255,255])
green1 = np.array([45, 50,50])
green2 = np.array([75, 255,255])
red1 = np.array([0, 50,50])
red2 = np.array([15, 255,255])
red3 = np.array([165, 50,50])
red4 = np.array([180, 255,255])
yellow1 = np.array([20, 50,50])
yellow2 = np.array([35, 255,255])
# --โข ์์์ ๋ฐ๋ฅธ ๋ง์คํฌ ์์ฑ
mask_blue = cv2.inRange(hsv, blue1, blue2)
mask_green = cv2.inRange(hsv, green1, green2)
mask_red = cv2.inRange(hsv, red1, red2)
mask_red2 = cv2.inRange(hsv, red3, red4)
mask_yellow = cv2.inRange(hsv, yellow1, yellow2)
#--โฃ ์์๋ณ ๋ง์คํฌ๋ก ์์๋ง ์ถ์ถ
res_blue = cv2.bitwise_and(img, img, mask=mask_blue)
res_green = cv2.bitwise_and(img, img, mask=mask_green)
res_red1 = cv2.bitwise_and(img, img, mask=mask_red)
res_red2 = cv2.bitwise_and(img, img, mask=mask_red2)
res_red = cv2.bitwise_or(res_red1, res_red2)
res_yellow = cv2.bitwise_and(img, img, mask=mask_yellow)
#--โค ๊ฒฐ๊ณผ ์ถ๋ ฅ
imgs = {'original': img, 'blue':res_blue, 'green':res_green,
'red':res_red, 'yellow':res_yellow}
for i, (k, v) in enumerate(imgs.items()):
plt.subplot(2,3, i+1)
plt.title(k)
plt.imshow(v[:,:,::-1])
plt.xticks([]); plt.yticks([])
plt.show()
ํ ์ ์ด๋ก์ด ์๋๋๊ฑฐ์ง
+) ์์์ ์ด์ฉํ ๋ง์คํน ๋ฐฉ์์ ํฌ๋ก๋งํค(chroma key)
# ํฌ๋ก๋งํค ๋ง์คํน๊ณผ ํฉ์ฑ
import cv2
import numpy as np
import matplotlib.pylab as plt
#--โ ํฌ๋ก๋งํค ๋ฐฐ๊ฒฝ ์์๊ณผ ํฉ์ฑํ ๋ฐฐ๊ฒฝ ์์ ์ฝ๊ธฐ
img1 = cv2.imread('img/sample.jpeg')
img2 = cv2.imread('img/wing_wall.jpg')
#--โก ROI ์ ํ์ ์ํ ์ขํ ๊ณ์ฐ
height1, width1 = img1.shape[:2]
height2, width2 = img2.shape[:2]
x = (width2 - width1)//2
y = height2 - height1
w = x + width1
h = y + height1
#--โข ํฌ๋ก๋งํค ๋ฐฐ๊ฒฝ ์์์์ ํฌ๋ก๋งํค ์์ญ์ 10ํฝ์
์ ๋๋ก ์ง์
chromakey = img1[:10, :10, :]
offset = 20
#--โฃ ํฌ๋ก๋งํค ์์ญ๊ณผ ์์ ์ ์ฒด๋ฅผ HSV๋ก ๋ณ๊ฒฝ
hsv_chroma = cv2.cvtColor(chromakey, cv2.COLOR_BGR2HSV)
hsv_img = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
#--โค ํฌ๋ก๋งํค ์์ญ์ H๊ฐ์์ offset ๋งํผ ์ฌ์ ๋ฅผ ๋์ด์ ๋ฒ์ ์ง์
# offset ๊ฐ์ ์ฌ๋ฌ์ฐจ๋ก ์๋ ํ ๊ฒฐ์
#chroma_h = hsv_chroma[0]
chroma_h = hsv_chroma[:,:,0]
lower = np.array([chroma_h.min()-offset, 100, 100])
upper = np.array([chroma_h.max()+offset, 255, 255])
#--โฅ ๋ง์คํฌ ์์ฑ ๋ฐ ๋ง์คํน ํ ํฉ์ฑ
mask = cv2.inRange(hsv_img, lower, upper)
mask_inv = cv2.bitwise_not(mask)
roi = img2[y:h, x:w]
fg = cv2.bitwise_and(img1, img1, mask=mask_inv)
bg = cv2.bitwise_and(roi, roi, mask=mask)
img2[y:h, x:w] = fg + bg
#--โฆ ๊ฒฐ๊ณผ ์ถ๋ ฅ
cv2.imshow('chromakey', img1)
cv2.imshow('added', img2)
cv2.waitKey()
cv2.destroyAllWindows()
+) cv2.seamlessClone() ํจ์ ์ด๋ฏธ์ง ํฉ์ฑ!
dst = cv2.seamlessClone(src, dst, mask, coords, flags, output)
: ์ํ ๊ฐ์ด๋ ๋ง์คํฌ๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์์๋๋จ
: mask๋ img1์ ์ ์ฒด ์์ญ์ 255๋ก ์ฑ์์ ํด๋น ์์ญ ์ ๋ถ๊ฐ ํฉ์ฑ์ ๋์์์ ํํ
- src : ์
๋ ฅ ์ด๋ฏธ์ง, ์ผ๋ฐ์ ์ผ๋ก ์ ๊ฒฝ
- dst : ๋์ ์ด๋ฏธ์ง, ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ๊ฒฝ
- mask : ๋ง์คํฌ, src์์ ํฉ์ฑํ๊ณ ์ ํ๋ ์์ญ์ 255, ๋๋จธ์ง๋ 0
- coords : src๊ฐ ๋์ด๊ธฐ ์ํ๋ dst์ ์ขํ (์ค์)
- flags : ํฉ์ฑ ๋ฐฉ์
- ์ ๋ ฅ ์๋ณธ์ ์ ์งํ๋ cv2.NORMAL_CLONE
- ์ ๋ ฅ๊ณผ ๋์์ ํผํฉํ๋ cv2.MIXED_CLONE
- output(optional) : ํฉ์ฑ ๊ฒฐ๊ณผ
# SeamlessClone์ ํ์ฉํ ์ด๋ฏธ์ง ํฉ์ฑ
import cv2
import numpy as np
import matplotlib.pylab as plt
#--โ ํฉ์ฑ ๋์ ์์ ์ฝ๊ธฐ
img1 = cv2.imread("img/flower1.jpg")
img2= cv2.imread("img/hand.jpg")
#--โก ๋ง์คํฌ ์์ฑ, ํฉ์ฑํ ์ด๋ฏธ์ง ์ ์ฒด ์์ญ์ 255๋ก ์
ํ
mask = np.full_like(img1, 255)
#--โข ํฉ์ฑ ๋์ ์ขํ ๊ณ์ฐ(img2์ ์ค์)
height, width = img2.shape[:2]
center = (width//2, height//2)
#--โฃ seamlessClone ์ผ๋ก ํฉ์ฑ
normal = cv2.seamlessClone(img1, img2, mask, center, cv2.NORMAL_CLONE)
mixed = cv2.seamlessClone(img1, img2, mask, center, cv2.MIXED_CLONE)
#--โค ๊ฒฐ๊ณผ ์ถ๋ ฅ
cv2.imshow('normal', normal)
cv2.imshow('mixed', mixed)
cv2.waitKey()
cv2.destroyAllWindows()
-> ์ผ์ชฝ cv2.NORMAL_CLONE ์ผ ๋๋ ๊ฝ์ ์ ๋ช ํ์ง๋ง ์ฃผ๋ณ์ ํผ๋ถ๊ฐ ๋ค์ ๋ญ๊ฐ์ง
-> ์ค๋ฅธ์ชฝ cv2.MIXED_CLONE ์ผ ๋๋ ๊ฝ์ ๋ค์ ํ๋ฆฌ์ง๋ง ์ฃผ๋ณ ํผ๋ถ์ ์ ๋งค์นญ์ด ๋๊ฒ ํฉ์ฑ
ํ. .๊ธธ์๋ฐ
'๐ฉโ๐ป IoT (Embedded) > Image Processing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[v0.13]์์์ฒ๋ฆฌ_2์ฐจ์ ํ์คํ ๊ทธ๋จ๊ณผ ์ญํฌ์ (0) | 2022.01.05 |
---|---|
[v0.12]์์์ฒ๋ฆฌ_ํ์คํ ๊ทธ๋จ(Histogram) (0) | 2022.01.05 |
[v0.10]์์์ฒ๋ฆฌ_OpenCV_๋ฐ์ด๋๋ฆฌ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ์ค๋ ์ํ๋ฉ (0) | 2021.12.30 |
[v0.9]์์์ฒ๋ฆฌ_OpenCV_์ด๋ฏธ์ง ์์ํํ๋ฐฉ์(BGR, HSV, YUV) (0) | 2021.12.30 |
[v0.8]์์์ฒ๋ฆฌ_OpenCV_์ด๋ฏธ์ง ๋ด ๊ด์ฌ์์ญ (ROI) (0) | 2021.12.30 |