Python圖像二值化

引言

圖像二值化是指將一張輸入圖像的所有像素點的灰度值轉換成黑色或白色的過程。這是圖像處理中最常用的操作之一。在一張輸入圖像中通過二值化,我們可以將目標圖像中的多餘信息進行過濾,保留出我們需要的信息,如字符識別、邊緣檢測等。

在這篇文章中,我們將介紹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-hant/n/196100.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 09:53
下一篇 2024-12-03 09:53

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python編程二級證書考試相關現已可以上網購買

    計算機二級Python考試是一項重要的國家級認證考試,也是Python編程的入門考試。與其他考試一樣,Python編程二級證書的考生需要進入正式考試,而為了備考,這篇文章將詳細介紹…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29

發表回復

登錄後才能評論