李纯明水平集源码C++复现笔记

一、复现环境

vs工程,windows系统,语言使用C++,算法库使用opencv3.1.0,opencv有一些很好用的矩阵操作函数,防止重复造轮子。
本篇文章不介绍原理推敲,只介绍C++复现中的几个易错点,主要是纽曼边界条件和拉普拉斯算子的重写,并在文章中附上这两个函数的代码。
大佬的源码(Matlab)和原文章很好找,不再做冗余的复制粘贴。

二、复现要点

对于里面的函数,基本的矩阵点乘点除等,直接使用opencv库没有任何问题,需要重写的有:
(1)矩阵正余弦函数;
(2)像素点比较,不要用opencv自带的比较算子,自己写一个很简单,opencv的函数比不出正确结果;
(3)纽曼边界条件需要重写;
(4)梯度和二阶梯度函数需要重写,sobel算子只是个卷积操作,系数不对;
(5)拉普拉斯算子需要重写,Laplacian算子也只是个卷积,系数不对,如果直接使用opencv的算子,最终结果不会收敛,像素数值基本到第十几轮迭代就会达到几十万,再往后就会超过double的精度。
对于纽曼边界条件和拉普拉斯算子复现对程序正确运行影响较大,边界点处理有一定难度,本文主要讲述这两个函数的工程复现。

1、纽曼边界条件(NeumannBoundCond)复现

这个函数保证边界的微分方程有解。
根据Matlab的源码理解,首先求四个顶点,再求四条边。

(1)求取顶点

在这里插入图片描述
在图中,用红色的点替代绿色点。

// 修改矩阵四个角的坐标
	f.at<double>(0, 0) = g.at<double>(2, 2);
	f.at<double>(0, ncol - 1) = g.at<double>(2, ncol - 3);
	f.at<double>(nrow - 1, 0) = g.at<double>(nrow - 3, 2);
	f.at<double>(nrow - 1, ncol - 1) = g.at<double>(nrow - 3, ncol - 3);

(2)求取上下边界

在这里插入图片描述
在图中,用红色的区域代替上边界,下边界同理类推。

// 修改上下边缘的像素值
	for (int j = 1; j < ncol - 1; j++) {
   
		f.at<double>(0, j) = g.at<double>(2, j);
		f.at<double>(nrow - 1, j) = g.at<double>(nrow - 3, j);
	}

(3)左右边界

在这里插入图片描述
在图中,用红色的区域代替左边界,右边界同理类推。

// 修改左右边缘的像素值
	for (int i = 1; i < nrow - 1; i++) {
   
		f.at<double>(i, 0) = g.at<
  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
李纯明水平集CV代码是一种用于图像分割的算法,它基于水平集方程的演化和优化过程。水平集CV在Matlab中的实现主要包括以下几个步骤: 1. 初始化水平集函数:根据需要分割的目标,我们需要初始化一个初始水平集函数。可以将目标所在的区域设为正数,其他区域设为负数。初始时可以随机设定一个水平集函数。 2. 计算梯度:通过计算图像的梯度信息,可以将水平集函数的演化方向引导向目标轮廓。通过Matlab的图像处理函数,可以计算出图像的梯度信息。 3. 水平集函数演化:根据水平集方程,可以通过迭代的方式演化水平集函数。在每一次迭代中,根据梯度信息来更新水平集函数的数值。这样,水平集函数会不断收缩或扩展,最终以目标轮廓为边界。 4. 目标分割:通过水平集函数的演化过程,可以将目标的轮廓边界提取出来。通过设定一个阈值,将水平集函数中大于该阈值的部分判定为目标区域。 5. 优化:为了提高分割结果的准确性,还可以通过优化算法对水平集函数进行进一步调整。比如,可以使用能量函数来优化水平集函数,使得其更好地适应目标轮廓。 总结起来,李纯明水平集CV Matlab代码实现了对图像的分割,通过不断演化水平集函数来提取目标轮廓。通过梯度信息的引导和优化算法的应用,可以得到更准确的分割结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这是一个图像

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值