ลำดับ | ชื่อ | สิ่งที่ต้องใส่ | ชนิดข้อมูล |
---|---|---|---|
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)
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ