分水嶺變換是一種用於圖像分割的方法,特別適用於分開相互接觸的對象。這種方法將灰度圖像視為地形地形,其中低強度區域表示谷底,而高強度區域表示山峰。分水嶺線表示分離這些山峰的地方。
以下是使用分水嶺變換進行圖像分割的 Python 範例:
from skimage.segmentation import watershed
from skimage.feature import peak_local_max
from scipy import ndimage
分水嶺變換是一種用於圖像分割的方法,特別適用於分開相互接觸的對象。這種方法將灰度圖像視為地形地形,其中低強度區域表示谷底,而高強度區域表示山峰。分水嶺線表示分離這些山峰的地方。
以下是使用分水嶺變換進行圖像分割的 Python 範例:
from skimage.segmentation import watershed
from skimage.feature import peak_local_max
from scipy import ndimage
區域生長(Region Growing)是一種基於點的區域分割方法。該方法的基本思想是從一個或多個種子點開始,並根據一定的相似性標準將鄰近的像素添加到該區域中。這個過程會繼續,直到沒有更多的像素可以被添加到該區域中。
以下是使用區域生長方法進行圖像分割的 Python 範例:
from queue import Queue
def region_growing(image, seed):
"""
能量最小化是一種基於能量函數的閾值分割方法,通常在圖像處理中用於最優化目標函數。這種方法的主要思想是找到一個閾值,使得分割後的圖像的能量(或成本)最小。
最常見的能量最小化方法之一是基於Chan-Vese模型的閾值分割,該模型使用等級集方法進行圖像分割,並嘗試最小化前景和背景的差異。
以下是使用能量最小化(基於Chan-Vese模型)進行圖像閾值分割的Python範例:
from skimage.segmentation import chan_vese
def energy_minimization_thresholding(image, mu=0.25, lambda1=1, lambda2=1, tol=1e-3, max_iter=500):
Hysteresis 閾值分割是一種兩階段的方法,主要用於邊緣檢測。它使用兩個閾值:一個高閾值和一個低閾值。當圖像的某一部分的亮度超過高閾值時,它被視為前景;而當亮度在兩個閾值之間時,只有當這部分與已確定的前景相鄰時,它才被視為前景。這有助於確保邊緣的連續性並消除噪音。
以下是使用 Hysteresis 進行圖像閾值分割的 Python 範例:
from skimage import filters, feature
def hysteresis_thresholding(image, low=0.1, high=0.2):
"""
基於局部統計信息的閾值分割通常考慮像素的鄰域的統計特性,例如平均值和標準差,來決定閾值。一個常見的策略是使用鄰域的平均值或者平均值與標準差的組合作為閾值。
以下是使用局部統計信息進行圖像閾值分割的一個範例:
def local_statistical_thresholding(image, block_size=15, C=-5):
"""
Segment an image using local statistical information.
高斯混合模型 (GMM) 是一種機器學習方法,用於估計數據的概率分佈。在圖像閾值分割的上下文中,GMM 可用於將像素值的直方圖建模為多個高斯分佈的混合。當您認為圖像有多於兩個的亮度級別(例如,前景、背景和陰影等),GMM 是一個好選擇。
GaussianMixture 來擬合 GMM。您可以選擇要擬合的高斯分佈數量(例如,2 表示前景和背景)。Multi-Otsu方法是Otsu方法的擴展,用於多級分割。而不是找到一個最佳的二元閾值,它會找到多個閾值以分割圖像成多個區域。這種方法特別適合於具有多個明顯亮度級別的圖像。
以下是如何在Python中使用Multi-Otsu方法進行圖像閾值分割的範例:
from skimage.filters import threshold_multiotsu
# Compute the Multi-Otsu thresholds (for this example, we will compute 3 thresholds for 4 classes)
thresholds = threshold_multiotsu(provided_img, classes=4)
最小交叉熵閾值法基於將圖像的直方圖模型化為兩個混合的高斯分佈:一個代表前景,另一個代表背景。該方法試圖找到一個閾值,使得分割後的前景和背景的熵之差最小。
以下是如何在Python中使用最小交叉熵閾值進行圖像分割的範例:
def minimum_cross_entropy_threshold(image):
"""
Compute the minimum cross-entropy threshold for an image.
山脊分析或Ridler-Calvard方法是基於直方圖的一個迭代技術。這種方法的工作原理是:首先選擇一個初始閾值(通常是圖像的整體平均值),然後使用這個閾值將圖像分為兩部分,計算這兩部分的均值。新的閾值是這兩個均值的平均值。這一過程不斷迭代,直到閾值收斂。
以下是如何在Python中使用Ridler-Calvard方法進行圖像閾值分割的範例:
def ridler_calvard_threshold(image):
"""
Compute the Ridler-Calvard threshold for an image.
Isodata算法(也稱為Iterative Self-Organizing Data Analysis Technique)是一種迭代方法,用於計算圖像的最佳閾值。其基本思想是從一個初始閾值開始,然後迭代地計算分割後的前景和背景的均值,直到閾值收斂。
以下是如何在Python中使用Isodata算法進行圖像閾值分割的範例:
def isodata_threshold(image):
"""
Compute the Isodata threshold for an image.
二維閾值分割通常用於彩色圖像,它考慮像素的顏色信息進行分割。在二維閾值中,我們不僅僅基於像素的亮度,還基於其在色彩空間中的位置(例如RGB或HSV)來設定閾值。
以下是一個簡單的二維閾值分割的例子,我們會使用RGB空間的兩個通道(例如R和G)進行二維閾值。這只是一個簡單的示例,實際的二維閾值可能需要更複雜的計算和策略。
在此例中,我們將選擇R和G通道的一個閾值範圍來進行分割。
# Load the image in color
color_img = cv2.imread('/mnt/data/Camera MV-GEC2000C#C0A800C9-Snapshot-20230316161733-1979637792559_5.jpg')
自適應閾值分割會根據圖像的局部區域計算閾值。這在圖像的亮度或對比度不均勻時特別有用。OpenCV提供了adaptiveThreshold方法來實現自適應閾值分割。
以下是使用自適應閾值進行圖像分割的範例代碼及結果:
# Apply adaptive thresholding
adaptive_thresh_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)