8.2 Python图像处理之图像典型分割-主动轮廓

文章目录

  • 8.2 Python图像处理之图像典型分割-主动轮廓
    • 1 算法原理
    • 2 代码
    • 3 效果

1 算法原理

主动轮廓模型,将图像分割问题转换为求解能量泛函最小值问题,主要原理通过构造能量泛函,在能量函数最小值驱动下,轮廓曲线逐渐向待检测物体的边缘逼近,最终分割出目标。

由于主动轮廓模型利用曲线演化定位目标的边缘,因此也称为Snake模型。

主动轮廓模型是当前应用最多的利用变分思想求解的图像分割方法。其最大优点是在高噪声的情况下,也能得到连续、光滑的闭合分割边界。按照能量函数构造方式的不同,可以将主动轮廓模型主要分为基于边缘和基于区域两类,同时也有一些研究人员提出了基于边缘和区域相结合的主动轮廓模型。

2 代码

运行代码说明

1.要改变代码中的图片地址(地址不能有中文)

更改main(path)函数中的路径put(r'../image/image1.jpg')

2.注意最后的plt.savefig('1.new.jpg')是保存plt图像,如果不使用可以注释掉

代码依赖包:

matplotlib  3.4.2
numpy  1.20.3
opencv-python  4.1.2.30
# pip安装
pip install matplotlib numpy opencv-python
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef getGaussianPE(src):"""描述:计算负高斯势能(Negative Gaussian Potential Energy, NGPE)输入:单通道灰度图src输出:无符号的浮点型单通道,取值0.0 ~ 255.0"""imblur = cv.GaussianBlur(src, ksize=(5, 5), sigmaX=3)dx = cv.Sobel(imblur, cv.CV_16S, 1, 0)  # X方向上取一阶导数,16位有符号数,卷积核3x3dy = cv.Sobel(imblur, cv.CV_16S, 0, 1)E = dx**2 + dy**2return Edef getDiagCycleMat(alpha, beta, n):"""计算5对角循环矩阵"""a = 2 * alpha + 6 * betab = -(alpha + 4 * beta)c = betadiag_mat_a = a * np.eye(n)diag_mat_b = b * np.roll(np.eye(n), 1, 0) + b * np.roll(np.eye(n), -1, 0)diag_mat_c = c * np.roll(np.eye(n), 2, 0) + c * np.roll(np.eye(n), -2, 0)return diag_mat_a + diag_mat_b + diag_mat_cdef getCircleContour(centre=(0, 0), radius=(1, 1), N=200):"""以参数方程的形式,获取n个离散点围成的圆形/椭圆形轮廓输入:中心centre=(x0, y0), 半轴长radius=(a, b), 离散点数N输出:由离散点坐标(x, y)组成的2xN矩阵"""t = np.linspace(0, 2 * np.pi, N)x = centre[0] + radius[0] * np.cos(t)y = centre[1] + radius[1] * np.sin(t)return np.array([x, y])def getRectContour(pt1=(0, 0), pt2=(50, 50)):"""根据左上、右下两个顶点来计算矩形初始轮廓坐标由于Snake模型适用于光滑曲线,故这里用不到该函数"""pt1, pt2 = np.array(pt1), np.array(pt2)r1, c1, r2, c2 = pt1[0], pt1[1], pt2[0], pt2[1]a, b = r2 - r1, c2 - c1length = (a + b) * 2 + 1x = np.ones((length), np.float)x[:b] = r1x[b:a + b] = np.arange(r1, r2)x[a + b:a + b + b] = r2x[a + b + b:] = np.arange(r2, r1 - 1, -1)y = np.ones((length), np.float)y[:b] = np.arange(c1, c2)y[b:a + b] = c2y[a + b:a + b + b] = np.arange(c2, c1, -1)y[a + b + b:] = c1return np.array([x, y])def snake(img, snake, alpha=0.5, beta=0.1, gamma=0.1, max_iter=2500, convergence=0.01):"""根据Snake模型的隐式格式进行迭代输入:弹力系数alpha,刚性系数beta,迭代步长gamma,最大迭代次数max_iter,收敛阈值convergence输出:由收敛轮廓坐标(x, y)组成的2xN矩阵, 历次迭代误差list"""global xn, ynx, y, errs = snake[0].copy(), snake[1].copy(), []n = len(x)# 计算5对角循环矩阵A,及其相关逆阵A = getDiagCycleMat(alpha, beta, n)inv = np.linalg.inv(A + gamma * np.eye(n))# 计算负高斯势能矩阵,及其梯度E_ext = -getGaussianPE(img)fx = cv.Sobel(E_ext, cv.CV_16S, 1, 0)fy = cv.Sobel(E_ext, cv.CV_16S, 0, 1)T = np.max([abs(fx), abs(fy)])fx, fy = fx / T, fy / Tfor g in range(max_iter):x_pre, y_pre = x.copy(), y.copy()i, j = np.uint8(y), np.uint8(x)try:xn = inv @ (gamma * x + fx[i, j])yn = inv @ (gamma * y + fy[i, j])except Exception as e:print("索引超出范围")# 判断收敛x, y = xn, ynerr = np.mean(0.5 * np.abs(x_pre - x) + 0.5 * np.abs(y_pre - y))errs.append(err)if err < convergence:print(f"Snake迭代{g}次后,趋于收敛。\t err = {err:.3f}")breakreturn x, y, errsdef main(path):src = cv.imread(path, 0)# ret1, src = cv.threshold(src, 100, 255, cv.THRESH_BINARY)img = cv.GaussianBlur(src, (3, 3), 5)  # 高斯滤波rows, cols = img.shape[:2]# 构造初始轮廓线init = getCircleContour((rows/2, cols/2), (rows/2, cols/2), N=200)# Snake Modelx, y, errs = snake(img, snake=init, alpha=0.1, beta=1, gamma=0.15)plt.figure() # 绘制轮廓图plt.subplot(211)plt.imshow(img, cmap="gray")plt.plot(init[0], init[1], '--r', lw=1)plt.plot(x, y, 'g', lw=1)plt.title("灰度图"),plt.axis('off')# 绘制收敛趋势图plt.subplot(212)plt.plot(range(len(errs)), errs)plt.title("收敛趋势图")# plt.savefig('2.new-' + path)plt.show()# 图像处理函数,要传入路径
main(r'../image/image1.jpg')

3 效果

效果一般比较差

8.2 Python图像处理之图像典型分割-主动轮廓相关推荐

  1. 8.1 Python图像处理之图像典型分割-SUSAN边缘检测

    8.1 Python图像处理之图像典型分割-SUSAN边缘检测 文章目录 8.1 Python图像处理之图像典型分割-SUSAN边缘检测 1 算法原理 2 代码 3 效果 1 算法原理 SUSAN 的 ...

  2. 8.3 Python图像处理之图像典型分割-分水岭分割

    8.3 Python图像处理之图像典型分割-分水岭分割 文章目录 8.3 Python图像处理之图像典型分割-分水岭分割 1 算法原理 2 代码 3 效果 1 算法原理 分水岭概念是以对图像进行三维可 ...

  3. 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除

    9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 文章目录 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 1 算法原理 2 代码 3 效果 1 ...

  4. 4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波)、有约束滤波器(维纳滤波器)

    4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波).有约束滤波器(维纳滤波器) 文章目录 4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波).有约束滤波器(维纳滤波器) 1 算 ...

  5. Python代码实现图像语义分割

    Python代码实现图像语义分割的步骤详解 原文链接:https://www.jb51.net/article/187249.htm 在网上看到了这篇,代码简洁,身为还没完全入门的小白,每跑通一个程序 ...

  6. 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度、形态平滑、高帽变换、低帽变换)

    9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形态平滑.高帽变换.低帽变换) 文章目录 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形 ...

  7. 9.3 Python图像处理之图像数学形态学-灰度形态学

    9.3 Python图像处理之图像数学形态学-灰度形态学 文章目录 9.3 Python图像处理之图像数学形态学-灰度形态学 1 算法原理 2 代码 3 效果 1 算法原理 灰度图像与二值图像的区别在 ...

  8. 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充

    9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 文章目录 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 1 算法原理 2 代码 3 效果 1 ...

  9. 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测

    9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 文章目录 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 1 算 ...

最新文章

  1. 公共互联网网络安全突发事件应急预案_安徽新规:发生重大突发事件,官方5小时内必须发声...
  2. 小短文 | 高并发系统,如何计算并发量和峰值数据?
  3. mysql+表复制+效率_MySQL数据库复制表的几种方式讲解
  4. 5分钟了解VMware vSAN的分布式RAID
  5. 释放Ubuntu/Linux系统cache,增加可用内存空间
  6. [zabbix][问题解决]监控项 Received value [] is not suitable for value type [Numeric(float)]
  7. java设计模型 解析工厂模式、proxy-agent模式、templete模式
  8. Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法Windows版(手贱强制重启电脑的后果)...
  9. 远卓:数字化转型的精益化思考
  10. JAVA 工厂模式计算器
  11. IP变更导致redis集群不可用解决办法
  12. 谷歌官方Android模拟器强化x86处理器性能 Android 11 可以运行arm 应用了
  13. ARM开发软件ADS教程
  14. 教师办公用计算机使用管理制度,教师办公室计算机使用规章制度
  15. 那些年,我们一起喜欢的诺基亚
  16. Smartbi报表工具二次开发和集成能力怎么样?
  17. 免费注册个体户营业执照出证教程
  18. ByteDance字节跳动张一鸣:如何阅读、如何了解自己、如何与人沟通沟通、如何安排时间、如何正确的看待别人意见、如何激励自己、如何写作、如何坚持锻炼身体、如何耐心?...
  19. 【机器学习】阿里云天池竞赛——工业蒸汽量预测(6)
  20. 大数据就业前景真的那么好吗

热门文章

  1. Java多线程:线程间通信方式
  2. 51单片机与6264通信探讨
  3. 管理者如何树立威信?谨记这6字诀
  4. 视频教程-Excel 2016培训教程-Office/WPS
  5. 机器学习数学基础——概率论篇
  6. CPU Cache下的伪共享和缓存行
  7. 什么是ThoughtWorks技术雷达?
  8. 使用阿里云工具迁移本地仓库至私服
  9. 什么样的音乐平台能够激发用户付费,Spotify告诉你答案
  10. 树莓派蜂鸣器python代码_树莓派接入无源蜂鸣器