高级图像分割技术:从传统算法到深度学习
立即解锁
发布时间: 2025-09-09 00:26:32 阅读量: 11 订阅数: 16 AIGC 


深度学习实战:TensorFlow数学解析
### 高级图像分割技术:从传统算法到深度学习
在图像处理领域,图像分割是一项关键任务,它旨在将图像划分为不同的区域或对象,以便更好地理解和分析图像内容。本文将介绍几种常见的图像分割方法,包括基于像素强度直方图的二值阈值分割、大津法(Otsu's Method)、分水岭算法(Watershed Algorithm)、K-means聚类和语义分割中的滑动窗口方法。
#### 基于像素强度直方图的二值阈值分割
二值阈值分割是一种简单而有效的图像分割方法,它基于像素的强度值将图像分为两个类别:前景和背景。假设图像表示为 $I(x, y)$,通过选择一个阈值 $t$,可以得到新的分割图像 $I'(x, y)$:
\[
I'(x, y) =
\begin{cases}
0, & \text{当 } I(x, y) > t \\
255, & \text{当 } I(x, y) \leq t
\end{cases}
\]
当双峰直方图没有被零密度区域明显分隔时,可以选择双峰区域峰值处像素强度的平均值作为阈值 $t$:
\[
t = \frac{p_1 + p_2}{2}
\]
其中 $p_1$ 和 $p_2$ 分别是双峰区域的峰值强度。另外,也可以选择 $p_1$ 和 $p_2$ 之间直方图密度最小的像素强度作为阈值:
\[
t = \text{Arg Min} H(p), \quad p \in [p_1, p_2]
\]
这里 $H(p)$ 是直方图密度函数,$p$ 表示像素强度。
以下是基于像素强度直方图的二值阈值分割的Python实现:
```python
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread("coins.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray, cmap='gray')
row, col = np.shape(gray)
gray_flat = np.reshape(gray, (row * col, 1))[:, 0]
ax = plt.subplot(222)
ax.hist(gray_flat, color='gray')
gray_const = []
# 150像素强度似乎是一个不错的阈值选择,因为密度最小
for i in range(len(gray_flat)):
if gray_flat[i] < 150:
gray_const.append(255)
else:
gray_const.append(0)
gray_const = np.reshape(np.array(gray_const), (row, col))
bx = plt.subplot(333)
bx.imshow(gray_const, cmap='gray')
```
#### 大津法(Otsu's Method)
大津法通过最大化图像不同区域之间的方差来确定阈值。如果使用大津法进行二值阈值分割,步骤如下:
1. **计算图像中每个像素强度的概率**:给定 $N$ 种可能的像素强度,归一化的直方图将给出图像的概率分布。
\[
P(i) = \frac{\text{count}(i)}{M}, \quad i \in \{0, 1, 2, \cdots, N - 1\}
\]
其中 $\text{count}(i)$ 是像素强度为 $i$ 的像素数量,$M$ 是图像中像素的总数。
2. **根据阈值 $t$ 将图像分为两个区域 $C_1$ 和 $C_2$**:像素集合 $\{0, 2, \cdots, t\}$ 属于 $C_1$,而像素集合 $\{t + 1, t + 2, \cdots, L - 1\}$ 属于 $C_2$。两个区域之间的方差由以下公式计算:
\[
\text{var}(C_1, C_2) = P(C_1)(\mu_1 - \mu)^2 + P(C_2)(\mu_2 - \mu)^2
\]
其中 $\mu_1$ 和 $\mu_2$ 分别是区域 $C_1$ 和 $C_2$ 的均值,$\mu$ 是整个图像的全局均值:
\[
\mu_1 = \sum_{i = 0}^{t} P(i)i, \quad \mu_2 = \sum_{i = t + 1}^{L - 1} P(i)i, \quad \mu = \sum_{i = 0}^{L - 1} P(i)i
\]
区域 $C_1$ 和 $C_2$ 的概率分别为:
\[
P(C_1) = \sum_{i = 0}^{t} P(i), \quad P(C_2) = \sum_{i = t + 1}^{L - 1} P(i)
\]
3. **选择最大化方差的阈值 $\hat{t}$**:
\[
\hat{t} = \text{Arg Max} \text{var}(C_1, C_2)
\]
可以通过计算所有可能的 $t$ 值对应的 $\text{var}(C_1, C_2)$,然后选择使方差最大的 $t$ 值作为最优阈值。
以下是大津法的Python实现:
```python
img = cv2.imread("otsu.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray, cmap='gray')
row, col = np.shape(gray)
hist_dist = 256 * [0]
# 计算图像中每个像素的频率计数
for i in range(row):
for j in range(col):
hist_dist[gray[i, j]] += 1
# 归一化频率以产生概率
hist_dist = [c / float(row * col) for c in hist_dist]
plt.plot(hist_dist)
# 计算区域间方差
def var_c1_c2_func(hist_dist, t):
u1, u2, p1, p2, u = 0, 0, 0, 0, 0
for i in range(t + 1):
u1 += hist_dist[i] * i
p1 += hist_dist[i]
for i in range(t + 1, 256):
u2 += hist_dist[i] * i
p2 += hist_dist[i]
for i in range(256):
u += hist_dist[i] * i
var_c1_c2 = p1 * (u1 - u) ** 2 + p2 * (u2 - u) ** 2
return var_c1_c2
# 迭代遍历所有像素强度,选择最大化方差的阈值
variance_list = []
for i in range(256):
var_c1_c2 = var_c1_c2_func(hist_dist, i)
variance_list.append(var_c1_c2)
# 获取最大化方差的阈值
t_hat = np.argmax(variance_list)
# 根据阈值计算分割图像
gray_recon
```
0
0
复制全文
相关推荐







