阈值分割-直方图阈值分割法

方法简介

    直方图阈值分割法适用于直方图为双峰的图像,通过找到直方图中的两个峰值,即前景和背景的灰度分布峰值,然后选取两个峰值之间的波谷对应的灰度值作为阈值,以此来分离前景和背景。

实现步骤

1、计算图像的灰度直方图。
2、 对直方图进行平滑处理,以便于识别波峰和波谷。
3、识别直方图中的第一个峰值(前景)和第二个峰值(背景)。
4、找到两个峰值之间的波谷,对应的灰度值即为阈值。
5、使用该阈值对图像进行二值化处理。

示例说明

    假设有一幅图像,其直方图呈现出明显的双峰特性,一个峰值对应于前景,另一个峰值对应于背景。通过直方图阈值分割法,我们可以找到一个阈值,使得前景和背景能够有效分离。

    示例图1

    如图所示,为一幅道路裂缝图像:

 如下图所示,为该道路裂缝图像的灰度直方图,记为原始灰度直方图,通过步骤1得到。

如下图所示,为该原始灰度直方图通过平滑后的直方图,通过步骤2得到。

如下图所示,为算法识别得到的波峰,红色的倒三角表示函数找到的局部最大值,通过步骤2得到。

如下图所示,为算法得到的分割阈值。 在得到多个局部最大值的基础上,本文通过在两个最大的波峰之间寻找直方图的最小值,进而得到了分割阈值,通过步骤4得到

 如下图所示,为通过该分割阈值得到的二值图像,即提取得到了裂缝区域。

对应代码

    以下是使用Python和OpenCV实现直方图阈值分割的示例代码:
```python
import numpy as np
import cv2

def calc_gray_hist(image):
    rows, cols = image.shape[:2]
    gray_hist = np.zeros([256], np.uint64)
    for i in range(rows):
        for j in range(cols):
            gray_hist[image[i][j]] += 1
    return gray_hist

def threshold_two_peak(image):
    histogram = calc_gray_hist(image)
    maxLoc = np.where(histogram==np.max(histogram))[0][0]
    firstPeak = maxLoc[0]
    measureDists = np.zeros([256], np.float32)
    for k in range(256):
        measureDists[k] = (k-firstPeak)**2 * histogram[k]
    maxLoc2 = np.where(measureDists==np.max(measureDists))[0][0]
    secondPeak = maxLoc2[0]
    thresh = 0
    if firstPeak > secondPeak:
        temp = histogram[int(secondPeak):int(firstPeak)]
        minLoc = np.where(temp==np.min(temp))[0][0]
        thresh = secondPeak + minLoc + 1
    else:
        temp = histogram[int(firstPeak):int(secondPeak)]
        minLoc = np.where(temp==np.min(temp))[0][0]
        thresh = firstPeak + minLoc + 1
    threshImage = image.copy()
    threshImage[threshImage>thresh] = 255
    threshImage[threshImage<=thresh] = 0
    return thresh, threshImage

# 读取图像
img = cv2.imread("path_to_image", 0)
thresh, threshImg = threshold_two_peak(img)
cv2.imwrite('thresholded_image.jpg', threshImg)
cv2.imshow('Thresholded Image', threshImg)
cv2.waitKey(0)
```

改进方法

1、**高斯平滑**:在计算直方图之前,对图像进行高斯平滑处理,以减少噪声对阈值选取的影响。
2、**自适应阈值**:在不同的图像区域使用不同的阈值,这种方法对于光照不均匀的图像特别有效。
3、 **Otsu方法**:Otsu方法是一种自动确定阈值的方法,它通过最大化类间方差来确定最优阈值。
4、 **熵方法**:基于图像熵的方法,通过最大化图像的信息熵来确定阈值,这种方法适用于具有不均匀直方图的图像。

通过这些改进方法,可以提高直方图阈值分割法在不同图像条件下的鲁棒性和准确性。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚂蚁没问题s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值