close

山脊分析或Ridler-Calvard方法是基於直方圖的一個迭代技術。這種方法的工作原理是:首先選擇一個初始閾值(通常是圖像的整體平均值),然後使用這個閾值將圖像分為兩部分,計算這兩部分的均值。新的閾值是這兩個均值的平均值。這一過程不斷迭代,直到閾值收斂。

以下是如何在Python中使用Ridler-Calvard方法進行圖像閾值分割的範例:

 

def ridler_calvard_threshold(image):
    """
    Compute the Ridler-Calvard threshold for an image.
    """
    # Initialize threshold
    threshold = np.mean(image)
    prev_threshold = 0
    
    # Iterate until the threshold converges
    while abs(threshold - prev_threshold) > 0.5:
        # Split the image into two parts based on the threshold
        below_thresh = image[image <= threshold]
        above_thresh = image[image > threshold]
        
        # Calculate the means of these parts
        mean_below = np.mean(below_thresh)
        mean_above = np.mean(above_thresh)
        
        # Update the threshold
        prev_threshold = threshold
        threshold = (mean_below + mean_above) / 2
        
    return threshold

# Compute the Ridler-Calvard threshold
ridler_calvard_thresh = ridler_calvard_threshold(provided_img)

# Apply the threshold to the image
_, ridler_calvard_img = cv2.threshold(provided_img, ridler_calvard_thresh, 255, cv2.THRESH_BINARY)

# Display the original and Ridler-Calvard thresholded images
fig, ax = plt.subplots(1, 2, figsize=(10, 5))

ax[0].imshow(provided_img, cmap='gray')
ax[0].set_title('Original Image')
ax[0].axis('off')

ax[1].imshow(ridler_calvard_img, cmap='gray')
ax[1].set_title('Ridler-Calvard Thresholded Image')
ax[1].axis('off')

plt.tight_layout()
plt.show()

如上所示,左側是您提供的原始圖像,而右側是使用Ridler-Calvard方法進行分割的結果。

Ridler-Calvard方法是通過迭代計算閾值,直到閾值收斂。這種方法與Isodata算法非常相似,並且結果通常也相似。從結果中,您可以看到此方法是如何區分圖像的前景和背景的。

Ridler-Calvard方法通常在具有清晰前景和背景的圖像上效果很好,且其計算過程相對簡單和快速。

arrow
arrow
    文章標籤
    圖像前處理
    全站熱搜
    創作者介紹
    創作者 Rocky 的頭像
    Rocky

    Rocky的部落格

    Rocky 發表在 痞客邦 留言(0) 人氣()