how to extract hand drawn figures from photos

當你用手機拍照手畫圖案時,常常會因為採光關係,出現深淺不一色調,如左圖所示。這時若用 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)

沒有留言:

Building a Lightweight Streamlit Client for Local Ollama LLM Interaction

Ollama 提供端點串接服務,可由程式管理及使用本地大語言模型(LLM, Large Language Model)。 以下程式碼展示如何以 Streamlit 套件,建立一個輕量級的網頁介面,供呼叫 本地端安裝的 Ollama 大語言模型。 Ollama 預設的服務...

總網頁瀏覽量