當你用手機拍照手畫圖案時,常常會因為採光關係,出現深淺不一色調,如左圖所示。這時若用 Adobe Photoshop Express 之類的影像處理軟體,其提供的對比調整 或 門檻值調整 (threshold adjustment) 工具,很難單獨萃取手畫圖案出來。
若會 Python 程式,建議改用 OpenCV 套件提供的 adaptiveThreshold 方法,可自動調整臨界值,萃取手畫圖案。經適當調整參數,發現效果不錯,如上圖所示。其程式寫法如下:
#
# 去處影像 destin = adaptiveThreshold(src 來源影像,
# maxValue 像素最大值,
# adaptiveMethod 門檻值調適計算法,
# ADAPTIVE_THRESH_MEAN_C | ADAPTIVE_THRESH_GAUSSIAN_C
# thresholdType 門檻值套用法,
# THRESH_BINARY | THRESH_BINARY_INV | THRESH_TRUNC |
# THRESH_TOZERO | THRESH_TOZERO_INV
# blockSize 鄰居方塊邊長,像素為單位,
# C 常數值,供鄰居方塊內的像素加權和 減掉 常數值 當成門檻值)
#
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
input = 'c:/path/source.jpg'
output = 'c:/path/destin.jpg'
# 以灰階模式(0),讀入影像
img = cv2.imread(input,0)
# 進行中位數模糊化影像處理,將每一像素由其5x5鄰居值的中位數取代
# 可降低噪訊,保留形狀邊界
img = cv2.medianBlur(img,5)
# 依據調適性門檻,進行二值化影像處理
newimg = cv2.adaptiveThreshold(
img, # 來源影像(灰階圖)
255, # 像素最大值
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, # 計算鄰居高斯加權和,減常數C,當門檻值
cv2.THRESH_BINARY, # 2值化門檻套用法,高於門檻值為255(白),否則為0(黑)
11, # 鄰居方塊邊長有多少像素個數
10) # 常數值,試誤找出合適值
# 寫出二值化處理結果
cv2.imwrite(output, newimg)
沒有留言:
張貼留言