首页 > 编程语言 >图像分割算法

图像分割算法

时间:2024-08-11 13:57:12浏览次数:13  
标签:分割 plt 阈值 cv2 像素 算法 图像

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

相关文章

  • 499 道 Java 面试题 (附答案):JVM+ 分布式 + 算法 + 锁 +MQ
    Spring如何管理事务的。Spring怎么配置事务(具体说出一些关键的xml元素)。说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。Springmvc中DispatcherServlet初始化过程。netty......
  • 7-2广告算法业务
    1.两种广告广告按其投放目的可以分成两类:效果广告和品牌广告。效果广告是为了直接提升某个产品的用户数量或者销售收入。而品牌广告则是为了通过提升品牌知名度美誉度从而间接带来该品牌产品用户和销售收入的增长。大家所熟悉的互联网广告大部分都是效果广告。如:微信的朋......
  • 电子商务图像生成技术:AI驱动的自动化流程
    摘要:本文介绍了一种基于人工智能技术的电子商务图像生成系统,该系统能够自动化地完成商品图像的生成过程。通过简单的三个步骤,用户可以快速生成高质量的电商主图和头图,从而提高工作效率并降低成本。**关键词:**人工智能,电商图像,自动化生成,图像处理1.引言在电子商务领域,高质......
  • Day25 第七章 回溯算法part04 回溯终章
    目录任务491.递增子序列思路46.全排列思路47.全排列II思路心得体会任务491.递增子序列给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序......
  • 7-1推荐算法业务
    1.推荐算法业务入门搜索和推荐搜索是人找物,而推荐是物找人。搜索一般用来满足用户比较明确的需求,而推荐则可以用来满足用户相对模糊的需求。大家熟悉的推荐系统包括抖音短视频、今日头条新闻推荐、网易云音乐每日推荐、淘宝京东的猜你喜欢推荐、B站的视频推荐等等。大家熟......
  • AI在医学领域:nnSynergyNet3D高精度分割肝硬化肝脏体MRI图像
    关键词:肝硬化肝脏分割、协同深度学习模型、跨模态泛化    肝硬化是慢性肝病(CLD)的最后阶段,是一个重大的全球性健康问题。2019年,它是全球死亡原因的第11位,占全球死亡人数的2.4%。尽管病毒性肝炎仍然是终末期肝病的主要原因,但与代谢功能障碍相关的脂肪肝病(MASLD)预计将由于......
  • 基于模拟退火算法求解旅行商(TSP)问题(附word文档)
    基于模拟退火算法求解旅行商(TSP)问题(附word文档)......
  • 【Java毕设选题推荐】基于SpringBoot的协同过滤算法美食推荐小程序
    前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务......
  • 混合策略改进的蜣螂算法(IDBO)优化BP神经网络
    目录0引言1数学模型2模型对比3matlab代码3.1改进的主代码3.2IDBO-BP4视频讲解0引言针对DBO算法全局探索能力不足、易陷入局部最优以及收敛精度不理想等问题,多为学者提出了混合多策略改进的蜣螂优化算法(IDBO)。主要混合策略改进首先是采用混沌映射结合随机反向......
  • Skeleton Recall Loss 分割领域的新突破:极大的减少了资源消耗,还能提高性能
    精确分割在当今众多领域都是一项关键需求比如说自动驾驶汽车的训练、医学图像识别系统,以及通过卫星图像进行监测。在许多其他领域,当感兴趣的对象微小但至关重要时,例如研究血管流动、手术规划、检测建筑结构中的裂缝或优化路线规划,需要更高的精度。此前已经做了大量工作来解决这种......