π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[v0.15]μμμ²λ¦¬_μ΄λ―Έμ§ μ΄λ, νλ/μΆμ, νμ λ³Έλ¬Έ
[v0.15]μμμ²λ¦¬_μ΄λ―Έμ§ μ΄λ, νλ/μΆμ, νμ
μ§μ§μνμΉ΄ 2022. 1. 6. 01:54220106 μμ±
<λ³Έ λΈλ‘κ·Έλ κ·νμ΄ μμ¬λμ λΈλ‘κ·Έλ₯Ό μ°Έκ³ ν΄μ 곡λΆνλ©° μμ±νμμ΅λλ€>
OpenCV - 13. μ΄λ―Έμ§ μ΄λ(Translation), νλ/μΆμ(Scaling), νμ (Rotation)
μ΄λ² ν¬μ€ν μμλ μ΄λ―Έμ§λ₯Ό μ΄λ, νλ, μΆμ, νμ νλ λ°©λ²μ λν΄ μμλ³΄κ² μ΅λλ€. μ΄λ² ν¬μ€ν μμ 'νμ΄μ¬μΌλ‘ λ§λλ OpenCV νλ‘μ νΈ(μ΄μΈμ° μ )'λ₯Ό μ 리ν κ²μμ λ°νλλ€. μ½λ: github.
bkshin.tistory.com
1. μ΄λ―Έμ§ μ΄λ
: μλ μλ μ’νμ μ΄λμν€λ €λ 거리λ§νΌ λνκΈ°
x_new = x_old + dβ
y_new = y_old + dβ
x_new = 1 * x_old + 0 * y_old + dβ
y_new = 0 * x_old + 1 * y_old + dβ
λ³ν νλ ¬
: μ΄λ―Έμ§μ μ΄λ€ μ’νλ₯Ό λ€λ₯Έ μ’νλ‘ μ΄λμμΌμ£Όλ νλ ¬
: μ΄λ€ μ’νλ₯Ό μ ν λ³ν(linear tranformations) ν΄μ£Όλ νλ ¬
: μ΄λ€ μ’νμ λ³ν νλ ¬μ κ³±ν΄μ£Όλ©΄ λ€λ₯Έ μ’νκ° κ΅¬ν΄μ§λ νλ ¬
dst = cv2.warpAffine(src, matrix, dsize, dst, flags, borderMode, borderValue)
- src : μλ³Έ μ΄λ―Έμ§, numpy λ°°μ΄
- matrix : 2 x 3 λ³ννλ ¬, dtype=float32
- dsize : κ²°κ³Ό μ΄λ―Έμ§μ ν¬κΈ°, (width, height)
- flags(optional) : 보κ°λ² μκ³ λ¦¬μ¦ νλκ·Έ
- cv2.INTER_LINEAR : default κ°, μΈμ ν 4κ° ν½μ κ°μ 거리 κ°μ€μΉ μ¬μ© => μ£Όλ‘ νλ
- cv2.INTER_NEAREST : κ°μ₯ κ°κΉμ΄ ν½μ κ° μ¬μ©
- cv2.INTER_AREA : ν½μ μμ κ΄κ³λ₯Ό μ΄μ©ν μ¬μνλ§ => μ£Όλ‘ μΆμ
- cv2.INTER_CUBIC : μΈμ ν© 16κ° ν½μ κ°μ 거리 κ°μ€μΉ μ¬μ© => μ£Όλ‘ νλ
- borderMode(optional) : μΈκ³½ μμ 보μ νλκ·Έ
- cv2.BORDER_CONSTANT : κ³ μ μμ κ°
- cv2.BORDER_REPLICATE : κ°μ₯μ리 볡μ
- cv2.BORDER_WRAP : λ°λ³΅
- cv2.BORDER_REFLECT : λ°μ¬
- borderValue(optional) : cv2.BORDER_CONSTANT μΈκ³½ μμ 보μ νλκ·ΈμΌ κ²½μ° μ¬μ©ν μμ κ° (default=0)
- dst : κ²°κ³Ό μ΄λ―Έμ§
# νν μ΄λ
import cv2
import numpy as np
img = cv2.imread('img/whiteman.png')
rows,cols = img.shape[0:2] # μμμ ν¬κΈ°
dx, dy = 100, 50 # μ΄λν ν½μ
거리
# ---β λ³ν νλ ¬ μμ±
mtrx = np.float32([[1, 0, dx],
[0, 1, dy]])
# ---β‘ λ¨μ μ΄λ
dst = cv2.warpAffine(img, mtrx, (cols+dx, rows+dy))
# ---β’ νλ½λ μΈκ³½ ν½μ
μ νλμμΌλ‘ 보μ
dst2 = cv2.warpAffine(img, mtrx, (cols+dx, rows+dy), None, \
cv2.INTER_LINEAR, cv2.BORDER_CONSTANT, (255,0,0) )
# ---β£ νλ½λ μΈκ³½ ν½μ
μ μλ³Έμ λ°μ¬ μμΌμ 보μ
dst3 = cv2.warpAffine(img, mtrx, (cols+dx, rows+dy), None, \
cv2.INTER_LINEAR, cv2.BORDER_REFLECT)
cv2.imshow('original', img)
cv2.imshow('trans',dst)
cv2.imshow('BORDER_CONSTATNT', dst2)
cv2.imshow('BORDER_FEFLECT', dst3)
cv2.waitKey(0)
cv2.destroyAllWindows()
+) μΈκ³½ μμ 보μ μ 보κ°λ² νλΌλ―Έν° λ³λ‘
+ 보μ λ²μ΄λ
Interpolation(μΈν°ν΄λ μ΄μ , 보κ°)
: μλ €μ§ μ§μ μ κ° μ¬μ΄(μ€κ°)μ μμΉν κ°μ μλ €μ§ κ°μΌλ‘λΆν° μΆμ
: κΈ°ννμ λ³ν ( νλ, νμ λ± )ν λ, μμμ μλ¬΄λ° μ 보λ₯Ό λ°μ§ λͺ»νλ pixel μκΉ
-> μ£Όλ³μ μκ³ μλ κ°λ€μ μ΄μ©νμ¬ pixel μ κ°μ μ λνλ κ³Όμ
2. μ΄λ―Έμ§ νλ λ° μΆμ
: κΈ°μ‘΄μ μ’νμ νΉμ ν κ°μ κ³±νκΈ°
x_new = aβ * x_old
y_new = aβ * y_old
x_new = aβ * x_old + 0 * y_old + 0 * 1
y_new = 0 * x_old + aβ * y_old + 0 * 1
cv2.warpAffine() ν¨μλ λ³ν νλ ¬μ΄ 2 x 3 νλ ¬μ΄ μλλ©΄ μ€λ₯λ₯Ό λΈλ€
=> 2 x 3 νλ ¬λ‘ νννκΈ° !
# νλ ¬μ μ΄μ©ν μ΄λ―Έμ§ νλ λ° μΆμ
import cv2
import numpy as np
img = cv2.imread('img/jam.jpeg')
height, width = img.shape[:2]
# --β 0.5λ°° μΆμ λ³ν νλ ¬
m_small = np.float32([[0.5, 0, 0],
[0, 0.5,0]])
# --β‘ 2λ°° νλ λ³ν νλ ¬
m_big = np.float32([[2, 0, 0],
[0, 2, 0]])
# --⒠보κ°λ² μ μ© μμ΄ νλ μΆμ
dst1 = cv2.warpAffine(img, m_small, (int(height*0.5), int(width*0.5)))
dst2 = cv2.warpAffine(img, m_big, (int(height*2), int(width*2)))
# --⣠보κ°λ² μ μ©ν νλ μΆμ
dst3 = cv2.warpAffine(img, m_small, (int(height*0.5), int(width*0.5)), \
None, cv2.INTER_AREA)
dst4 = cv2.warpAffine(img, m_big, (int(height*2), int(width*2)), \
None, cv2.INTER_CUBIC)
# κ²°κ³Ό μΆλ ₯
cv2.imshow("original", img)
cv2.imshow("small", dst1)
cv2.imshow("big", dst2)
cv2.imshow("small INTER_AREA", dst3)
cv2.imshow("big INTER_CUBIC", dst4)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 보κ°λ² μ 무μ μ°¨μ΄κ°... λμΌλ‘ λ΄€μ λ λ±ν μ°¨μ΄μ μ΄ μλκ»΄μ§λ€!
+) cv2.resize() λ‘ νλ λ° μΆμ
cv2.resize(src, dsize, dst, fx, fy, interpolation)
- src : μ
λ ₯ μλ³Έ μ΄λ―Έμ§
- dsize : μΆλ ₯ μμ ν¬κΈ° (νλ/μΆμ λͺ©ν ν¬κΈ°, (width, height)νμ), μλ΅νλ©΄ fx, fy λ°°μ¨μ μ μ©
- fx, fy : λ³κ²½ν ν¬κΈ° λ°°μ¨, dsizeκ° μ£Όμ΄μ§λ©΄ dsizeλ₯Ό μ μ©ν¨
- interpolation : 보κ°λ² μκ³ λ¦¬μ¦ μ ν νλκ·Έ (cv2.warpAffine()κ³Ό λμΌ)
- dst : κ²°κ³Ό μ΄λ―Έμ§
# cv2.reize()λ‘ μ΄λ―Έμ§ νλ λ° μΆμ
import cv2
import numpy as np
img = cv2.imread('img/hobbang.jpeg')
height, width = img.shape[:2]
#--β ν¬κΈ° μ§μ μΌλ‘ μΆμ
dst1 = cv2.resize(img, (int(width*0.5), int(height*0.5)), \
interpolation=cv2.INTER_AREA)
#--β‘ λ°°μ¨ μ§μ μΌλ‘ νλ
dst2 = cv2.resize(img, None, None, 2, 2, cv2.INTER_CUBIC)
#--β’ κ²°κ³Ό μΆλ ₯
cv2.imshow("original", img)
cv2.imshow("small", dst1)
cv2.imshow("big", dst2)
cv2.waitKey(0)
cv2.destroyAllWindows()
- small μ μνλ κ²°κ³Όμ ν¬κΈ°λ₯Ό ν½μ κ°μΌλ‘ μ§μ μ§μ
- big μ μνλ λ°°μ¨μ μ§μ ν΄μ μ΄λ―Έμ§ μ€μΌμΌλ§
3. μ΄λ―Έμ§ νμ
# λ³ννλ ¬μ μ΄μ©ν μ΄λ―Έμ§ νμ
import cv2
import numpy as np
img = cv2.imread('img/hobbang.jpeg')
rows,cols = img.shape[0:2]
# ---β λΌλμ κ°λ κ³μ°(60μ§λ²μ νΈλλ²μΌλ‘ λ³κ²½)
d45 = 45.0 * np.pi / 180 # 45λ
d90 = 90.0 * np.pi / 180 # 90λ
# ---β‘ νμ μ μν λ³ν νλ ¬ μμ±
m45 = np.float32( [[ np.cos(d45), -1* np.sin(d45), rows//2],
[np.sin(d45), np.cos(d45), -1*cols//4]])
m90 = np.float32( [[ np.cos(d90), -1* np.sin(d90), rows],
[np.sin(d90), np.cos(d90), 0]])
# ---β’ νμ λ³ν νλ ¬ μ μ©
r45 = cv2.warpAffine(img,m45,(cols,rows))
r90 = cv2.warpAffine(img,m90,(rows,cols))
# ---β£ κ²°κ³Ό μΆλ ₯
cv2.imshow("origin", img)
cv2.imshow("45", r45)
cv2.imshow("90", r90)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 1 λΌλμ(radian) = (180/π)λ
- 1λ = (π/180) λΌλμ
- λ³ννλ ¬λ‘ μ§μ ꡬννλ 건 λ³΅μ‘ -> μ΄λμν¬ μ’νμ ν¬κΈ°κΉμ§ κ³ λ €ν΄μΌλ¨
+) cv2.getRotationMatrix2D
: κ°λ¨νκ² λ³ννλ ¬ γ±
mtrx = cv2.getRotationMatrix2D(center, angle, scale)
- center: νμ μΆ μ€μ¬ μ’ν
- (x, y)angle : νμ ν κ°λ, 60μ§λ²
- scale : νλ λ° μΆμ λΉμ¨
# OpenCvλ‘ νμ λ³ννλ ¬ ꡬνκΈ°
import cv2
img = cv2.imread('img/hobbang.jpeg')
rows,cols = img.shape[0:2]
#---β νμ μ μν λ³ν νλ ¬ ꡬνκΈ°
# νμ μΆ:μ€μ, κ°λ:45, λ°°μ¨:0.5
m45 = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.5)
# νμ μΆ:μ€μ, κ°λ:90, λ°°μ¨:1.5
m90 = cv2.getRotationMatrix2D((cols/2,rows/2),90,1.5)
#---β‘ λ³ν νλ ¬ μ μ©
img45 = cv2.warpAffine(img, m45,(cols, rows))
img90 = cv2.warpAffine(img, m90,(cols, rows))
#---β’ κ²°κ³Ό μΆλ ₯
cv2.imshow('origin',img)
cv2.imshow("45", img45)
cv2.imshow("90", img90)
cv2.waitKey(0)
cv2.destroyAllWindows()
- cv2.getRotationMatrix2D μ¬μ©νλκΉ κ°νΈνκ² μΆμλ, νλ + νμ μ΄ κ°λ₯νλ€!
μμ μκ°μ λ°°μ΄ κ²λ€μ΄λ€..
ν 볡μ΅νκ³
μ λλ‘ μμ§νκ²λλ λλ..
μ΄μ μλ©΄ μ΄λ‘ν΄ !!! γ γ
'π©βπ» IoT (Embedded) > Image Processing' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[v0.17]μμμ²λ¦¬_λ μ¦ μ곑νκΈ° (0) | 2022.01.08 |
---|---|
[v0.16]μμμ²λ¦¬_μ΄λ―Έμ§ λ€νκΈ° (0) | 2022.01.07 |
[v0.14]μμμ²λ¦¬_μ΄λ―Έμ§ μ μ¬λ λΉκ΅ μΈ μ€μ΅ (2) | 2022.01.05 |
[v0.13]μμμ²λ¦¬_2μ°¨μ νμ€ν κ·Έλ¨κ³Ό μν¬μ (0) | 2022.01.05 |
[v0.12]μμμ²λ¦¬_νμ€ν κ·Έλ¨(Histogram) (0) | 2022.01.05 |