π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[v0.10]μμμ²λ¦¬_OpenCV_λ°μ΄λ리 μ΄λ―Έμ§λ₯Ό λ§λλ μ€λ μνλ© λ³Έλ¬Έ
[v0.10]μμμ²λ¦¬_OpenCV_λ°μ΄λ리 μ΄λ―Έμ§λ₯Ό λ§λλ μ€λ μνλ©
μ§μ§μνμΉ΄ 2021. 12. 30. 17:09211230 μμ±
<λ³Έ λΈλ‘κ·Έλ κ·νμ΄ μμ¬λμ λΈλ‘κ·Έλ₯Ό μ°Έκ³ ν΄μ 곡λΆνλ©° μμ±νμμ΅λλ€>
1. μ€λ μνλ© (Thresholding)
: μ¬λ¬ κ°μ μ΄λ€ μκ³μ μ κΈ°μ€μΌλ‘ λ κ°μ§ λΆλ₯λ‘ λλλ λ°©λ²
: λ°μ΄λ리 μ΄λ―Έμ§( κ²μμκ³Ό ν°μλ§μΌλ‘ ννν μ΄λ―Έμ§) λ₯Ό λ§λλ κ°μ₯ λνμ μΈ λ°©λ²
1) μ μ μ€λ μνλ©
: μ¬λ¬ μκ³κ°μ μ ν λ€ ν½μ κ°μ΄ μκ³κ°μ λμΌλ©΄ 255, μκ³κ°μ λμ§ μμΌλ©΄ 0 μΌλ‘ μ§μ νλ λ°©μ
- numpy
numpy μ°μ°μ ν΅ν΄ ν½μ κ°μ΄ 127λ³΄λ€ ν¬λ©΄ 255, ν½μ κ°μ΄ 127λ³΄λ€ μκ±°λ κ°μΌλ©΄ 0μΌλ‘ λ°κΎΈκΈ°
- ret, out = cv2.threshold(img, threshold, value, type_flag)
ret : μ€λ μνλ©μ μ¬μ©ν μκ³κ°
out : μ€λ μνλ©μ΄ μ μ©λ λ°μ΄λ리 μ΄λ―Έμ§
img : λ³νν μ΄λ―Έμ§
threshold : μ€λ μνλ© μκ³κ°
value : μκ³κ° κΈ°μ€μ λ§μ‘±νλ ν½μ
μ μ μ©ν κ°
type_flag : μ€λ μνλ© μ μ© λ°©λ²
- cv2.THRESH_BINARY: ν½μ κ°μ΄ μκ³κ°μ λμΌλ©΄ valueλ‘ μ§μ νκ³ , λμ§ λͺ»νλ©΄ 0μΌλ‘ μ§μ
- cv2.THRESH_BINARY_INV : cv.THRESH_BINARYμ λ°λ
- cv2.THRESH_TRUNC : ν½μ κ°μ΄ μκ³κ°μ λμΌλ©΄ valueλ‘ μ§μ νκ³ , λμ§ λͺ»νλ©΄ μλ κ° μ μ§
- cv2.THRESH_TOZERO : ν½μ κ°μ΄ μκ³κ°μ λμΌλ©΄ μλ κ° μ μ§, λμ§ λͺ»νλ©΄ 0μΌλ‘ μ§μ
- cv2.THRESH_TOZERO_INV : cv2.THRESH_TOZEROμ λ°λ
# μ μ μ€λ μνλ©
import cv2
import numpy as np
import matplotlib.pylab as plt
#μ΄λ―Έμ§λ₯Ό κ·Έλ μ΄ μ€μΌμΌλ‘ μ½κΈ°
img = cv2.imread('img/gray_gradient.png', cv2.IMREAD_GRAYSCALE)
# --- β NumPy APIλ‘ λ°μ΄λ리 μ΄λ―Έμ§ λ§λ€κΈ°
thresh_np = np.zeros_like(img) # μλ³Έκ³Ό λμΌν ν¬κΈ°μ 0μΌλ‘ μ±μμ§ μ΄λ―Έμ§
thresh_np[ img > 127] = 255 # 127 λ³΄λ€ ν° κ°λ§ 255λ‘ λ³κ²½
# ---β‘ OpenCV APIλ‘ λ°μ΄λ리 μ΄λ―Έμ§ λ§λ€κΈ°
ret, thresh_cv = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
print(ret) # 127.0, λ°μ΄λ리 μ΄λ―Έμ§μ μ¬μ©λ λ¬Έν± κ° λ°ν
# ---β’ μλ³Έκ³Ό κ²°κ³Όλ¬Όμ matplotlibμΌλ‘ μΆλ ₯
imgs = {'Original': img, 'NumPy API':thresh_np, 'cv2.threshold': thresh_cv}
for i , (key, value) in enumerate(imgs.items()):
plt.subplot(1, 3, i+1)
plt.title(key)
plt.imshow(value, cmap='gray')
plt.xticks([]); plt.yticks([])
plt.show()
+) type_flag νμ©
# μ€λ μνλ© νλκ·Έ
import cv2
import numpy as np
import matplotlib.pylab as plt
img = cv2.imread('img/gray_gradient.png', cv2.IMREAD_GRAYSCALE)
_, t_bin = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
_, t_bininv = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
_, t_truc = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
_, t_2zr = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
_, t_2zrinv = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
imgs = {'origin':img, 'BINARY':t_bin, 'BINARY_INV':t_bininv, \
'TRUNC':t_truc, 'TOZERO':t_2zr, 'TOZERO_INV':t_2zrinv}
for i, (key, value) in enumerate(imgs.items()):
plt.subplot(2,3, i+1)
plt.title(key)
plt.imshow(value, cmap='gray')
plt.xticks([]); plt.yticks([])
plt.show()
binary : 127 λμΌλ©΄ 1, λμ§ λͺ»νλ©΄ 0
binary_inv : μμ λ°λ
trunc : 127 λμΌλ©΄ 1, λμ§ λͺ»νλ©΄ μλ³Έ
tozero : 127 λμΌλ©΄ μλκ°, λμ§ λͺ»νλ©΄ 0
tozero_inv : μμ λ°λ
+) μ€μΈ μ μ΄μ§ν μκ³ λ¦¬μ¦
: μ€μΈ μ μκ³ λ¦¬μ¦μ μκ³κ°μ μμλ‘ μ ν΄ ν½μ μ λ λΆλ₯λ‘ λλκ³ λ λΆλ₯μ λͺ μ λΆν¬λ₯Ό ꡬνλ μμ μ λ°λ³΅
: λͺ¨λ κ²½μ°μ μ μ€μμ λ λΆλ₯μ λͺ μ λΆν¬κ° κ°μ₯ κ· μΌν λμ μκ³κ°μ μ ν
: λ°λ³΅μ μΈ μλ μμ΄ ν λ²μ μκ³κ°μ μ°Ύμ μ μλ λ°©λ²
cv2.threshold() ν¨μμ λ§μ§λ§ νλΌλ―Έν° cv2.THRESH_OTSU
# μ€μΈ μ μκ³ λ¦¬μ¦μ μ μ©ν μ€λ μνλ©
import cv2
import numpy as np
import matplotlib.pylab as plt
# μ΄λ―Έμ§λ₯Ό κ·Έλ μ΄ μ€μΌμΌλ‘ μ½κΈ°
img = cv2.imread('img/newspaper.jpg', cv2.IMREAD_GRAYSCALE)
# κ²½κ³ κ°μ 130μΌλ‘ μ§μ ---β
_, t_130 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY)
# κ²½κ³ κ°μ μ§μ νμ§ μκ³ OTSU μκ³ λ¦¬μ¦ μ ν ---β‘
t, t_otsu = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
print('otsu threshold:', t) # Otsu μκ³ λ¦¬μ¦μΌλ‘ μ νλ κ²½κ³ κ° μΆλ ₯
imgs = {'Original': img, 't:130':t_130, 'otsu:%d'%t: t_otsu}
for i , (key, value) in enumerate(imgs.items()):
plt.subplot(1, 3, i+1)
plt.title(key)
plt.imshow(value, cmap='gray')
plt.xticks([]); plt.yticks([])
plt.show()
=> λ°μ΄λ리 μ΄λ―Έμ§ λ³ν ν κΈμ¨ μ λͺ
=> λ°μ΄λ리 μ΅μ μ μκ³κ°μ 130 μ€μ
=> μ€μΈ μ μκ³ λ¦¬μ¦ μ΅μ μ μκ³κ°μ 114
=> μ€μΈ μ μκ³ λ¦¬μ¦μ΄ μ΅μ μ μκ³κ°μ μλμΌλ‘ μ°Ύμμ€λ€
=> λͺ¨λ κ²½μ°μ μμ λν΄ μ‘°μ¬ν΄μΌ νλ―λ‘ μλκ° λΉ λ₯΄μ§ μλ€
2) μ μν μ€λ μνλ© (Adaptive Thresholding)
: μ΄λ―Έμ§λ₯Ό μ¬λ¬ μμμΌλ‘ λλ λ€, κ·Έ μ£Όλ³ ν½μ κ°λ§ νμ©νμ¬ μκ³κ°μ ꡬν¨
cv2.adaptiveThreshold(img, value, method, type_flag, block_size, C)
img : μ
λ ₯μμ
value : μκ³κ°μ λ§μ‘±νλ ν½μ
μ μ μ©ν κ°
method : μκ³κ° κ²°μ λ°©λ²
- cv2.ADAPTIVE_THRESH_MEAN_C : μ΄μ ν½μ
μ νκ· μΌλ‘ κ²°μ
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C : κ°μ°μμ λΆν¬μ λ°λ₯Έ κ°μ€μΉμ ν©μΌλ‘ κ²°μ
type_flag : μ€λ μνλ© μ μ© λ°©λ² (cv2.threshod()μ λμΌ)
block_size : μμμΌλ‘ λλ μ΄μμ ν¬κΈ°(n x n), νμ
C : κ³μ°λ μκ³κ° κ²°κ³Όμμ κ°κ°ν μμ(μμ κ°λ₯)
# μ μν μ€λ μνλ© μ μ©
import cv2
import numpy as np
import matplotlib.pyplot as plt
blk_size = 9 # λΈλ μ¬μ΄μ¦
C = 5 # μ°¨κ° μμ
img = cv2.imread('img/sudoku.jpg', cv2.IMREAD_GRAYSCALE) # κ·Έλ μ΄ μ€μΌμΌλ‘ μ½κΈ°
# ---β μ€μΈ μ μκ³ λ¦¬μ¦μΌλ‘ λ¨μΌ κ²½κ³ κ°μ μ 체 μ΄λ―Έμ§μ μ μ©
ret, th1 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# ---β‘ μ΄λν°λ μ°λ μνλλ₯Ό νκ· μ μ©
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY, blk_size, C)
# κ°μ°μμ λΆν¬ μ μ©
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, \
cv2.THRESH_BINARY, blk_size, C)
# ---β’ κ²°κ³Όλ₯Ό MatplotμΌλ‘ μΆλ ₯
imgs = {'Original': img, 'Global-Otsu:%d'%ret:th1, \
'Adapted-Mean':th2, 'Adapted-Gaussian': th3}
for i, (k, v) in enumerate(imgs.items()):
plt.subplot(2,2,i+1)
plt.title(k)
plt.imshow(v,'gray')
plt.xticks([]),plt.yticks([])
plt.show()
=> μ μμ μ€μΈ λ λ κ·Έλμ§κ³ μ΄λμμ§λ νμ λ°κ²¬
=> μ μμ νκ· μ κ°μ°μμλ³΄λ€ λ μ λͺ , μ‘ν° λ λ°κ²¬
=> μ μμ κ°μ°μμμ μ λͺ λ λ¨μ΄μ§, μ‘ν° λ λ°κ²¬
==> μ μν μ€λ μνλ© μκ³ λ¦¬μ¦
- μ 체 μ΄λ―Έμ§μ μ΄ 9κ°μ λΈλ‘μ μ€μ (μ΄λ―Έμ§ 9λ±λΆ)
- κ° λΈλ‘λ³λ‘ μκ³κ°μ μ ν©λλ€.
- cv2.ADAPTIVE_THRESH_MEAN_Cλ₯Ό νλΌλ―Έν°λ‘ μ λ¬νλ©΄ κ° λΈλ‘μ μ΄μ ν½μ μ νκ· μΌλ‘ μκ³κ°
- cv2.ADAPTIVE_THRESH_GAUSSIAN_Cλ₯Ό νλΌλ―Έν°λ‘ μ λ¬νλ©΄ κ°μ°μμ λΆν¬μ λ°λ₯Έ κ°μ€μΉμ ν©μΌλ‘ μκ³κ°
- μ ν΄μ§ μκ³κ°μ λ°νμΌλ‘ κ° λΈλ‘λ³λ‘ μ€λ μνλ©
- μ μ μ€λ μνλ©μ μ μ©ν κ²λ³΄λ€ λ μ λͺ νκ³ λΆλλ¬μ΄ κ²°κ³Ό
==> λλΆλΆμ μ΄λ―Έμ§λ κ·Έλ¦Όμκ° μκ±°λ μ‘°λͺ μ°¨μ΄κ° μκΈ°μ
μ μ μ€λ μνλ©λ³΄λ€ μ μν μ€λ μνλ©μ λ λ§μ΄ μ¬μ©
ν... λ
'π©βπ» IoT (Embedded) > Image Processing' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[v0.12]μμμ²λ¦¬_νμ€ν κ·Έλ¨(Histogram) (0) | 2022.01.05 |
---|---|
[v0.11]μμμ²λ¦¬_μ΄λ―Έμ§ μ°μ° (ν©μ±, μν λΈλ λ©, λ§μ€νΉ) (0) | 2022.01.02 |
[v0.9]μμμ²λ¦¬_OpenCV_μ΄λ―Έμ§ μμννλ°©μ(BGR, HSV, YUV) (0) | 2021.12.30 |
[v0.8]μμμ²λ¦¬_OpenCV_μ΄λ―Έμ§ λ΄ κ΄μ¬μμ (ROI) (0) | 2021.12.30 |
[v0.7]μμμ²λ¦¬_OpenCV_μ°½ κ΄λ¦¬ λ° μ΄λ²€νΈ μ²λ¦¬ (0) | 2021.12.30 |