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图像中,医生可以选择一个肿瘤的种子点,区域生长算法会自动将整个肿瘤区域扩展出来。这种方法非常适合分割边界明确、灰度值均匀的目标区域。在遥感图像分析中,区域生长可以用来分割河流、森林等具有一致性特征的区域。
总结
区域生长通过基于相似性条件的区域扩展,有效实现图像分割,适用于种子点明确的图像。
标签:分割,plt,阈值,cv2,像素,算法,图像 From: https://blog.csdn.net/LS_Ai/article/details/141104610