引言
圖像二值化是指將一張輸入圖像的所有像素點的灰度值轉換成黑色或白色的過程。這是圖像處理中最常用的操作之一。在一張輸入圖像中通過二值化,我們可以將目標圖像中的多餘信息進行過濾,保留出我們需要的信息,如字元識別、邊緣檢測等。
在這篇文章中,我們將介紹Python圖像二值化。我們將探討一些基本的二值化方法,並介紹如何使用不同的Python庫(如PIL、OpenCV等)來實現圖像二值化操作。
方法介紹
在這一部分,我們將介紹一些基本的圖像二值化方法。
全局閾值二值化
全局閾值二值化是指,在一張輸入圖像中,確定一個全局閾值,然後將所有像素點的灰度值進行比較,當灰度值大於全局閾值的時候將像素點設為白色,反之則為黑色。
這種方法的實現比較簡單,在Python中可以使用OpenCV庫實現:
import cv2
img = cv2.imread('image.png', 0)
ret, thresh_binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
以上代碼中,我們首先使用cv2.imread()函數讀取輸入圖像。然後,我們使用cv2.threshold()函數對圖像進行閾值處理,其中參數127是我們的閾值,同時使用了cv2.THRESH_BINARY表示我們對閾值處理後的結果進行二值化。
局部閾值二值化
與全局閾值二值化不同,局部閾值二值化方法的閾值並不是在整個圖像中一次性確定的。相反,我們使用移動窗口方法,在圖像中選取小的區域,對區域內的像素進行閾值處理並且二值化。
OpenCV同樣提供了局部閾值二值化的函數adaptiveThreshold():
import cv2
img = cv2.imread('image.png', 0)
thresh_binary = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
以上代碼中,我們使用cv2.adaptiveThreshold()函數將輸入圖像二值化。其中參數cv2.ADAPTIVE_THRESH_MEAN_C是指使用均值計算閾值,而參數11和2則表示所選取的小窗口是一個11*11的矩形,並且閾值的計算方法為平均值加上2倍的標準差。
OTSU二值化
Otsu二值化方法使用了一種自適應的閾值選擇方法,該方法通過分析整個輸入圖像的灰度值直方圖並計算它的方差,來確定最適合的全局閾值。
使用OpenCV庫實現Otsu二值化同樣非常簡單:
import cv2
img = cv2.imread('image.png', 0)
ret, thresh_binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
以上代碼中,我們調用cv2.threshold()函數並使用了cv2.THRESH_OTSU表示我們使用了Otsu方法去計算全局閾值。
Python庫的選擇
除了OpenCV之外,Python中還有一些很常用的圖像庫,如Pillow和Scipy。
Pillow是Python中一個非常流行的圖像庫,它提供了許多簡單易用的圖像處理工具,如圖像打開、剪切、旋轉、縮放等功能。
Scipy是一個專註於科學計算的Python庫,它提供了很多工具來處理圖像數據,例如圖像濾波、分割以及二值化等。
Pillow庫
Pillow庫提供了一些簡單易用的圖像處理操作,包括圖像打開、通道分離、旋轉和縮放等。但是Pillow庫的圖像二值化支持不如OpenCV庫那麼全面。
from PIL import Image
img = Image.open('image.png').convert('L')
img = img.point(lambda x: 0 if x < 128 else 255, '1')
以上代碼中,我們首先使用PIL庫中的Image.open()函數打開圖片,然後使用img.convert()函數將圖片轉換為灰度圖像。接下來我們使用lambda函數將像素值小於128的設為0,大於等於128的設為255。最後我們使用img.point()函數使修改的點生效。
Scipy庫
Scipy庫提供了幾種不同的圖像二值化方法,包括Global thresholding、Local thresholding以及Otsu thresholding。
import numpy as np
import scipy.misc
from scipy.ndimage import gaussian_filter
from scipy import ndimage
import matplotlib.pyplot as plt
from skimage.filters import threshold_otsu, threshold_local
img = scipy.misc.face(gray=True)
blurred = gaussian_filter(img, 4)
local_thresh = threshold_local(blurred, block_size=81, offset=20)
binary_local = img > local_thresh
otsu_thresh = threshold_otsu(blurred)
binary_otsu = img > otsu_thresh
fig, ax = plt.subplots(1, 3, figsize=(14, 8))
ax[0].imshow(img, cmap=plt.cm.gray)
ax[0].set_title('Original')
ax[1].imshow(binary_local, cmap=plt.cm.gray)
ax[1].set_title('Local thresholding')
ax[2].imshow(binary_otsu, cmap=plt.cm.gray)
ax[2].set_title('Global thresholding')
for a in ax:
a.axis('off')
plt.show()
以上代碼中,我們首先使用Scipy中的scipy.misc.face()函數來讀取圖片,然後使用了幾個不同的閾值處理方法對其進行了二值化。最後生成了一副展示三種不同閾值處理方法效果的圖片。
總結
在這篇文章中,我們介紹了圖像二值化方法的基礎知識和一些常見的實現方式。此外,我們探討了Python中不同的圖像處理庫(如OpenCV、Pillow、Scipy),並使用這些庫的實現方式演示了如何應用不同的方法進行圖像二值化處理。
通過這裡的學習,你應該對不同的二值化方法有了更深刻的了解,並且也了解了Python中使用這些方法進行圖像二值化的常用手段。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/196100.html