0
点赞
收藏
分享

微信扫一扫

【C++】类的概念与基本使用介绍

独孤凌雪 2024-08-10 阅读 31

壹、图像分割的数学定义

贰、图像分割的分类方法

1、基于阈值化的分割方法

阈值分割准则

 2、基于边缘的分割方法

步骤:

3、基于区域的分割方法

  1. 区域生长法

  2. 区域分裂与合并法

  3. 水平集方法

  4. 图割方法

4、基于神经网络的分割方法

参考以下几篇文章:

基于神经网络的图像分割_基于图神经网络的医学图像分割-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_55073640/article/details/123039854基于CNN卷积神经网络的图像分割matlab仿真 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/648715632基于深度学习技术的图像分割 (baidu.com)icon-default.png?t=N7T8https://baijiahao.baidu.com/s?id=1783952474192487844&wfr=spider&for=pc

5、基于聚类的分割方法

3个要点:

分类:

叄、OpenCV进行图像分割

1、固定阈值分割

API:

retval, dst = cv2.threshold(src, thresh, maxval, type[, dst])

 前五个enum的数学实现原理:

 示例:

import cv2  
import numpy as np  
  
# 读取图像  
image = cv2.imread('image.jpg')  
# 转换为灰度图  
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  
  
# 应用阈值分割  
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  
  
# 显示结果  
cv2.imshow('Original Image', image)  
cv2.imshow('Threshold Image', thresh)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

 2、自适应阈值分割

import cv2  
  
# 读取图像  
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)  # 以灰度模式读取图像  
  
# 应用自适应阈值分割  
# 参数:  
# src: 源图像,必须是8位单通道图像  
# maxValue: 最大值,用于阈值化后的像素值(通常为255)  
# adaptiveMethod: 自适应阈值算法  
#               - cv2.ADAPTIVE_THRESH_MEAN_C: 阈值设置为邻近区域的平均值减去C  
#               - cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 阈值设置为邻近区域的加权和(高斯加权)减去C  
# thresholdType: 阈值类型  
#               - cv2.THRESH_BINARY  
#               - cv2.THRESH_BINARY_INV  
# blockSize: 块的大小(必须是正奇数)  
# C: 从平均值或加权平均值中减去的常数  
  
thresh = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,   
                               cv2.THRESH_BINARY, 11, 2)  
  
# 显示结果  
cv2.imshow('Original Image', image)  
cv2.imshow('Adaptive Threshold Image', thresh)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

3、基于K-means聚类

import cv2  
import numpy as np  
  
# 读取图像  
image = cv2.imread('image.jpg')  
data = image.reshape((-1, 3))  # 重塑成二维数组  
  
# 应用K-means算法  
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 0.1)  
K = 3  # 假设我们想将图像分割成3个颜色区域  
_, labels, centers = cv2.kmeans(data, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)  
  
# 将聚类标签转换回图像形式  
segmented_image = labels.reshape(image.shape[:2])  
  
# 显示结果  
cv2.imshow('Segmented Image', segmented_image.astype(np.uint8))  
cv2.waitKey(0)  
cv2.destroyAllWindows()  
  
# 注意:这里的结果是一个颜色标签图,你可能需要根据centers数组将标签映射回具体的颜色值。

肆、OpenCV进行彩色图像分割

1. 使用颜色范围进行分割

import cv2  
import numpy as np  
  
# 读取图像  
image = cv2.imread('image.jpg')  
  
# 转换到HSV颜色空间  
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)  
  
# 定义蓝色的范围  
# 注意:HSV值在0-180, 0-255, 0-255之间,但在OpenCV中,Hue被归一化到0-179  
lower_blue = np.array([110, 50, 50])  
upper_blue = np.array([130, 255, 255])  
  
# 根据颜色范围创建掩模  
mask = cv2.inRange(hsv, lower_blue, upper_blue)  
  
# 使用掩模对原图像进行位运算,提取蓝色部分  
result = cv2.bitwise_and(image, image, mask=mask)  
  
# 显示结果  
cv2.imshow('Original Image', image)  
cv2.imshow('Mask', mask)  
cv2.imshow('Result', result)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

2. 使用K-means聚类进行分割

import cv2  
import numpy as np  
  
# 读取图像并重塑为二维数组  
image = cv2.imread('image.jpg')  
data = image.reshape((-1, 3))  
  
# 应用K-means算法  
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 0.1)  
K = 3  # 假设我们想将图像分割成3个颜色区域  
_, labels, centers = cv2.kmeans(data, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)  
  
# 将聚类标签转换回图像形式  
segmented_image = labels.reshape(image.shape[:2])  
  
# 为了可视化,我们可以将标签映射回具体的颜色值(这里为了简单起见,我们直接显示标签)  
segmented_image = segmented_image.astype(np.uint8) * 255 / K  
  
# 显示结果  
cv2.imshow('Segmented Image', segmented_image)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  
  
# 注意:这里的结果是一个颜色标签图,你可能需要根据centers数组将标签映射回具体的颜色值。

伍、grabCut算法分割图像

陆、floodFill漫水填充分割

柒、分水岭分割法

末、基于kohonen网络的snake图像分割法

基于Kohonen网络的Snake图像分割法是一种结合了自组织映射(Self-Organizing Map, SOM)网络和Snake模型(也称为主动轮廓模型或动态轮廓模型)的图像分割技术。这种方法通过整合SOM网络的学习能力和Snake模型的轮廓变形能力,实现了对图像中目标区域的有效分割。

1. Kohonen网络(SOM网络)

基本原理
Kohonen网络,也称为自组织映射网络,是一种无监督学习算法,用于将高维输入数据映射到低维空间(通常是二维网格),同时保持数据的拓扑关系。在SOM网络中,每个神经元(或称为节点)代表一个权重向量,这些权重向量通过竞争学习过程逐渐调整到与输入数据的特定部分相匹配。

在图像分割中的应用
在图像分割中,SOM网络可以用于将图像像素或特征映射到不同的类别或区域,从而实现对图像内容的初步划分。通过训练SOM网络,可以将具有相似特征的像素或区域聚类到一起,为后续的Snake模型提供初始轮廓或分割区域的指导。

2. Snake模型

基本原理
Snake模型是一种基于能量最小化的主动轮廓模型,它通过定义一个能量函数来控制轮廓线的变形,使得轮廓线能够收敛到图像中的目标边缘。Snake模型的能量函数通常由内部能量和外部能量两部分组成,内部能量控制轮廓线的平滑性和连续性,而外部能量则使轮廓线向图像中的特征边缘靠拢。

在图像分割中的应用
Snake模型在图像分割中表现出色,特别是在处理复杂背景和不规则形状的目标时。通过初始化一个大致的轮廓线,Snake模型能够自动调整轮廓线的形状和位置,以准确分割出目标区域。然而,Snake模型对初始轮廓的位置较为敏感,且容易陷入局部最优解。

3. 基于Kohonen网络的Snake图像分割法

结合方式
基于Kohonen网络的Snake图像分割法通过以下方式结合SOM网络和Snake模型:

  • 初始轮廓提取:首先,利用SOM网络对图像进行预处理和聚类分析,提取出与目标区域相关的初步轮廓或分割区域。这些轮廓或区域可以作为Snake模型的初始轮廓。
  • 轮廓优化:然后,利用Snake模型的能量最小化原理,对初始轮廓进行进一步的优化和调整。通过不断迭代计算能量函数并更新轮廓线的位置,使得轮廓线能够逐渐收敛到图像中的目标边缘。

优势

  • 提高分割准确性:通过SOM网络的初步聚类分析,可以为Snake模型提供更为准确的初始轮廓,从而提高分割的准确性。
  • 增强鲁棒性:SOM网络的自学习能力使得该方法能够适应不同的图像特征和分割需求,增强了算法的鲁棒性。
  • 自动化程度高:整个分割过程可以自动完成,无需人工干预,提高了图像处理的效率。

具体参考这篇文章:

图像分割—Snake模型 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/621254952 

举报

相关推荐

0 条评论