| ลำดับ | ชื่อ | สิ่งที่ต้องใส่ | ชนิดข้อมูล | 
|---|---|---|---|
| 1 | src | อาเรย์รูปภาพ | np.array | 
| 2 | thresh | ค่าจุดเปลี่ยน | int | 
| 3 | maxval | ค่าสูงสุด | int | 
| 4 | type | ชนิดวิธีการ | flag (int) | 
| แฟล็ก | ค่า | ความหมาย | 
|---|---|---|
| cv2.THRESH_BINARY | 0 | ถ้าสูงกว่าค่าจุดเปลี่ยนจะเป็น 255 ที่เหลือเป็น 0  | 
    
| cv2.THRESH_BINARY_INV | 1 | ถ้าสูงกว่าค่าจุดเปลี่ยนจะเป็น 0 ที่เหลือเป็น 255  | 
    
| cv2.THRESH_TRUNC | 2 | ถ้าสูงกว่าค่าจุดเปลี่ยนจะกลายเป็นค่าจุดเปลี่ยน ที่เหลือคงเดิม  | 
    
| cv2.THRESH_TOZERO | 3 | ถ้าต่ำกว่าค่าจุดเปลี่ยนจะเป็น 0 ที่เหลือคงเดิม  | 
    
| cv2.THRESH_TOZERO_INV | 4 | ถ้าสูงกว่าค่าจุดเปลี่ยนจะเป็น 0 ที่เหลือคงเดิม  | 
    
| cv2.THRESH_OTSU | 8 | ทำการคำนวณค่าจุดเปลี่ยนอัตโนมัติ ไม่ใช้ค่า thresh ที่ใส่เข้าไป | 
import cv2
import numpy as np
import matplotlib.pyplot as plt
title_thresh = [('binary',cv2.THRESH_BINARY),
                ('binary inv',cv2.THRESH_BINARY_INV),
                ('trunc',cv2.THRESH_TRUNC),
                ('tozero',cv2.THRESH_TOZERO),
                ('tozero inv',cv2.THRESH_TOZERO_INV)]
rup = np.arange(256).reshape(16,16).astype(np.float32)
plt.figure(figsize=[6,9])
plt.subplot(321,xticks=[],yticks=[])
plt.title('ภาพเดิม',family='Tahoma')
plt.imshow(rup,cmap='gray')
for i,(title,thresh) in enumerate(title_thresh):
    plt.subplot(322+i,title=title,xticks=[],yticks=[])
    ret,rup_thr = cv2.threshold(rup,127,255,thresh)
    plt.imshow(rup_thr,cmap='gray',vmin=0,vmax=255)
    
plt.tight_layout()
plt.show()
  

rin = cv2.imread('rin10c01.jpg',0)
plt.figure(figsize=[6,7.5])
plt.subplot(321,xticks=[],yticks=[])
plt.title('ภาพเดิม',family='Tahoma')
plt.imshow(rin,cmap='gray')
for i in range(5):
    ret,rinth = cv2.threshold(rin,i*50+20,255,cv2.THRESH_BINARY)
    plt.subplot(322+i,title='%d'%ret,xticks=[],yticks=[])
    plt.imshow(rinth,cmap='gray')
plt.tight_layout()
plt.show()
  
rin = cv2.imread('rin10c01.png',0)
ret,rinth = cv2.threshold(rin,0,255,cv2.THRESH_OTSU)
cv2.imwrite('rin10c03.png',rinth)
print(ret) # ได้ 118
  
tt = [('binary inv',cv2.THRESH_BINARY_INV),
      ('trunc',cv2.THRESH_TRUNC),
      ('tezero',cv2.THRESH_TOZERO),
      ('tozero inv',cv2.THRESH_TOZERO_INV)]
rin = cv2.imread('rin10c01.jpg',0)
plt.figure(figsize=[6,5])
for i,(title,thresh) in enumerate(tt):
    plt.subplot(221+i,title=title,xticks=[],yticks=[])
    ret,rinth = cv2.threshold(rin,127,255,thresh+cv2.THRESH_OTSU)
    plt.imshow(rinth,cmap='gray')
    
plt.tight_layout()
plt.show()
  
| ลำดับ | ชื่อ | สิ่งที่ต้องใส่ | ชนิดข้อมูล | 
|---|---|---|---|
| 1 | src | อาเรย์รูปภาพ | np.array | 
| 2 | maxValue | ค่าสูงสุด | int | 
| 3 | adaptiveMethod | วิธีการคำนวณปรับตัว | flag (int) | 
| 4 | thresholdType | วิธีพิจารณาค่าจุดเปลี่ยน | flag (int) | 
| 5 | blockSize | ขนาดบล็อก | int | 
| 6 | C | ค่า C | float | 
| แฟล็ก | ค่าตัวเลข | วิธีคำนวณค่าจุดเปลี่ยน | 
|---|---|---|
| cv2.ADAPTIVE_THRESH_MEAN_C | 0 | คำนวณค่าเฉลี่ยรอบข้างขนาด blockSize×blockSize แล้วหักจากค่า C | 
| cv2.ADAPTIVE_THRESH_GAUSSIAN_C | 1 | คำนวณค่าเฉลี่ยรอบข้างขนาด blockSize×blockSize โดยถ่วงน้ำหนักด้วยฟังก์ชันเกาส์ แล้วหักจากค่า C | 
rin = cv2.imread('rin10c01.jpg',0)
plt.figure(figsize=[3.5,7.5])
plt.subplot(311,xticks=[],yticks=[])
plt.title('ภาพเดิม',family='Tahoma')
plt.imshow(rin,cmap='gray')
rinth = cv2.adaptiveThreshold(rin,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,9,1)
plt.subplot(312,title='thresh mean',xticks=[],yticks=[])
plt.imshow(rinth,cmap='gray')
rinth = cv2.adaptiveThreshold(rin,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,9,1)
plt.subplot(313,title='thresh gauss',xticks=[],yticks=[])
plt.imshow(rinth,cmap='gray')
plt.tight_layout()
plt.show()
  

miku = cv2.imread('miku10c01.jpg',0)
plt.figure(figsize=[6,7.5])
plt.subplot(321,xticks=[],yticks=[])
plt.title('ภาพเดิม',family='Tahoma')
plt.imshow(miku,cmap='gray')
for i in range(5):
    bs = 1+2**(i+1)
    mikuth = cv2.adaptiveThreshold(miku,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,bs,1)
    plt.subplot(322+i,title='block size = %d'%bs,xticks=[],yticks=[])
    plt.imshow(mikuth,cmap='gray')
plt.suptitle('c = 1')
plt.tight_layout()
plt.show()
  
miku = cv2.imread('miku10c01.jpg',0)
plt.figure(figsize=[6,7.5])
plt.subplot(321,xticks=[],yticks=[])
plt.title('ภาพเดิม',family='Tahoma')
plt.imshow(miku,cmap='gray')
for i in range(5):
    c = 2*i-3
    mikuth = cv2.adaptiveThreshold(miku,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,9,c)
    plt.subplot(322+i,title='c = %d'%c,xticks=[],yticks=[])
    plt.imshow(mikuth,cmap='gray')
plt.suptitle('block size = 9')
plt.tight_layout()
plt.show()
  

gumi = cv2.imread('gumi10c01.jpg') # อ่านเป็นภาพสีตามปกติ
gumi_gray = cv2.cvtColor(gumi,cv2.COLOR_BGR2GRAY) # แปลงเป็นสีขาวดำ
# เอาภาพที่แปลงเป็นขาวดำแล้วมากรอง
gumi_thr = cv2.adaptiveThreshold(gumi_gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,9,1)
# ภาพนี้ให้แปลงส่วนสว่างให้เป็นสีขาวไป
cv2.imwrite('gumi10c02.jpg',np.where(gumi_thr[:,:,None]==255,gumi,255))
# ภาพนี้ให้แปลงส่วนมืดให้เป็นสีดำไป
cv2.imwrite('gumi10c03.jpg',np.where(gumi_thr[:,:,None]==0,gumi,0))
  


gumi = cv2.imread('teto10c01.jpg')
gumi_gray = cv2.cvtColor(gumi,cv2.COLOR_BGR2GRAY)
_,gumi_thr = cv2.threshold(gumi_gray,5,255,cv2.THRESH_BINARY)
gumi = cv2.cvtColor(gumi,cv2.COLOR_BGR2BGRA)
gumi[:,:,3] = gumi_thr
cv2.imwrite('teto10c02.png',gumi)
  
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ