图像分割算法

5.1 阈值分割 (Thresholding)

介绍

阈值分割是一种简单而有效的图像分割方法,通过设置一个或多个阈值,将图像分割为前景和背景区域。常见的阈值分割方法包括全局阈值、自适应阈值和Otsu阈值。

原理

阈值分割通过比较像素值与设定的阈值,将像素分类为前景或背景。

公式

在阈值分割中,公式描述了将图像像素值与一个固定阈值 TTT 进行比较的过程。

其中,I(x,y) 表示图像在坐标 (x,y) 处的像素值。该公式表示,如果像素值大于阈值 T,则将该像素归类为前景(值为255,通常表示白色);否则,将其归类为背景(值为0,通常表示黑色)。

案例

使用Python和OpenCV进行阈值分割。

代码解析
import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('image.jpg', 0)

# 全局阈值分割
_, global_thresh = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

# 自适应阈值分割
adaptive_thresh = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                        cv2.THRESH_BINARY, 11, 2)

# Otsu阈值分割
_, otsu_thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 显示原始图像和阈值分割结果
plt.subplot(141), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(142), plt.imshow(global_thresh, cmap='gray')
plt.title('Global Threshold'), plt.xticks([]), plt.yticks([])

plt.subplot(143), plt.imshow(adaptive_thresh, cmap='gray')
plt.title('Adaptive Threshold'), plt.xticks([]), plt.yticks([])

plt.subplot(144), plt.imshow(otsu_thresh, cmap='gray')
plt.title('Otsu Threshold'), plt.xticks([]), plt.yticks([])

plt.show()

生活场景案例

阈值分割在文本图像处理、条码识别、车牌识别和医学图像处理中有广泛应用。

在文本图像处理中,阈值分割常用于将手写文本从背景中提取出来。例如,扫描的文档图像通常包含背景噪声和变暗的纸张边缘。通过全局阈值分割,可以将文字部分(前景)从背景中分离出来,使得后续的字符识别更加准确。在医学图像处理中,阈值分割可以用于分离目标区域,如在脑部MRI图像中分割出肿瘤区域。

总结

阈值分割通过设定阈值,将图像分割为前景和背景,是一种简单而有效的图像分割方法,适用于对比度高的图像。

5.2 K-means聚类 (K-means Clustering)

介绍

K-means聚类是一种无监督学习算法,用于将图像像素分为K个簇。通过迭代优化,每个像素被分配到最接近的簇。

原理

K-means聚类通过最小化像素到其所属簇的中心的距离,将图像像素分配到不同的簇中。

公式

K-means聚类的目标是将图像像素划分为 KKK 个簇。

目标函数:

其中,Ck 是第 k 个簇,μk 是第k 个簇的中心,xi 表示图像中的像素。该公式表示每个像素 xi 到其所属簇的中心 μk 的距离平方和最小化的过程,即每个像素被分配到距离最近的簇中。

案例

使用Python和OpenCV进行K-means聚类分割。

代码解析
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('image.jpg')
Z = image.reshape((-1, 3))

# 转换为float32类型
Z = np.float32(Z)

# 定义K-means参数
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 3
ret, label, center = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

# 转换为uint8类型
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((image.shape))

# 显示原始图像和K-means聚类结果
plt.subplot(121), plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(122), plt.imshow(cv2.cvtColor(res2, cv2.COLOR_BGR2RGB))
plt.title('K-means Segmented Image'), plt.xticks([]), plt.yticks([])

plt.show()

生活场景案例

K-means聚类在图像压缩、颜色量化和医学图像分割中有广泛应用。

在颜色量化中,K-means聚类用于减少图像中的颜色数量,从而降低图像的存储空间。例如,在图像压缩中,可以使用K-means将原始图像中的成千上万种颜色减少到仅仅几十种,从而大幅度减小图像文件的大小,而图像质量损失较小。在医学图像处理中,K-means聚类可以帮助分割不同的组织类型,如区分MRI图像中的不同脑组织。

总结

K-means聚类通过迭代优化,将图像像素分为K个簇,有效实现图像分割,适用于颜色和纹理明显的图像。

5.3 区域生长 (Region Growing)

介绍

区域生长是一种基于种子的图像分割方法,通过从初始种子像素开始,逐步将满足相似性条件的相邻像素合并到区域中。

原理

区域生长通过设置相似性条件,将初始种子像素及其相邻像素进行区域扩展,直到不再有像素满足条件。

公式

区域生长通过从初始种子点开始,逐步扩展区域,直到没有相邻像素满足条件为止。

其中,(xs,ys) 是种子像素,T 是相似性阈值。该公式表示只要像素 (x,y) 与种子像素 (xs,ys) 的差值小于阈值 T,该像素就会被包含在区域内。

案例

使用Python和OpenCV进行区域生长分割。

代码解析
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('image.jpg', 0)
h, w = image.shape[:2]

# 初始化种子点
seed = (int(w/2), int(h/2))

# 区域生长函数
def region_growing(img, seed, thresh):
    segmented = np.zeros_like(img)
    to_check = [seed]
    while to_check:
        x, y = to_check.pop(0)
        if segmented[y, x] == 0 and abs(int(img[y, x]) - int(img[seed[1], seed[0]])) < thresh:
            segmented[y, x] = 255
            for nx, ny in [(x-1, y), (x+1, y), (x, y-1), (x, y+1)]:
                if 0 <= nx < w and 0 <= ny < h and segmented[ny, nx] == 0:
                    to_check.append((nx, ny))
    return segmented

# 进行区域生长
segmented_image = region_growing(image, seed, 20)

# 显示原始图像和区域生长分割结果
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(122), plt.imshow(segmented_image, cmap='gray')
plt.title('Region Growing'), plt.xticks([]), plt.yticks([])

plt.show()

生活场景案例

区域生长在医学图像分割、遥感图像分析和物体识别中有广泛应用。

在医学图像分割中,区域生长方法常用于提取特定的器官或病变区域。例如,在CT图像中,医生可以选择一个肿瘤的种子点,区域生长算法会自动将整个肿瘤区域扩展出来。这种方法非常适合分割边界明确、灰度值均匀的目标区域。在遥感图像分析中,区域生长可以用来分割河流、森林等具有一致性特征的区域。

总结

区域生长通过基于相似性条件的区域扩展,有效实现图像分割,适用于种子点明确的图像。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值