水平集算法

import cv2
from pylab import *

Image = cv2.imread('1.jpg', 1)  # 读入原图
image = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)
img = np.array(image, dtype=np.float64)  # 读入到np的array中,并转化浮点类型

# 初始水平集函数
IniLSF = np.ones((img.shape[0], img.shape[1]), img.dtype)
IniLSF[300:320, 300:320] = -1
IniLSF = -IniLSF

# 画初始轮廓
Image = cv2.cvtColor(Image, cv2.COLOR_BGR2RGB)
plt.figure(1), plt.imshow(Image), plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.contour(IniLSF, [0], color='b', linewidth=2)  # 画LSF=0处的等高线
plt.draw(), plt.show(block=False)


def mat_math(intput, str):
    output = intput
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if str == "atan":
                output[i, j] = math.atan(intput[i, j])
            if str == "sqrt":
                output[i, j] = math.sqrt(intput[i, j])
    return output


# CV函数
def CV(LSF, img, mu, nu, epison, step):
    Drc = (epison / math.pi) / (epison * epison + LSF * LSF)
    Hea = 0.5 * (1 + (2 / math.pi) * mat_math(LSF / epison, "atan"))
    Iy, Ix = np.gradient(LSF)
    s = mat_math(Ix * Ix + Iy * Iy, "sqrt")
    Nx = Ix / (s + 0.000001)
    Ny = Iy / (s + 0.000001)
    Mxx, Nxx = np.gradient(Nx)
    Nyy, Myy = np.gradient(Ny)
    cur = Nxx + Nyy
    Length = nu * Drc * cur

    Lap = cv2.Laplacian(LSF, -1)
    Penalty = mu * (Lap - cur)

    s1 = Hea * img
    s2 = (1 - Hea) * img
    s3 = 1 - Hea
    C1 = s1.sum() / Hea.sum()
    C2 = s2.sum() / s3.sum()
    CVterm = Drc * (-1 * (img - C1) * (img - C1) + 1 * (img - C2) * (img - C2))

    LSF = LSF + step * (Length + Penalty + CVterm)
    # plt.imshow(s, cmap ='gray'),plt.show()
    return LSF


# 模型参数
mu = 1
nu = 0.003 * 255 * 255
num = 20
epison = 1
step = 0.1
LSF = IniLSF
for i in range(1, num):
    LSF = CV(LSF, img, mu, nu, epison, step)  # 迭代
    if i % 1 == 0:  # 显示分割轮廓
        plt.imshow(Image), plt.xticks([]), plt.yticks([])
        plt.contour(LSF, [0], colors='r', linewidth=2)
        plt.draw(), plt.show(block=False), plt.pause(0.01)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我没有找到与水平集算法相关的引用内容。但是,我可以为您提供一些关于水平集算法的基本知识和C++代码实现。 水平集算法是一种用于图像处理和计算机视觉的数学方法,它可以用于分割图像中的对象和背景。该算法基于水平集函数,该函数是一个定义在二维或三维空间中的标量函数,它的零水平集表示对象的边界。水平集算法通过迭代地更新水平集函数来实现图像分割。 以下是一个简单的C++代码实现水平集算法的示例: ```c++ #include <iostream> #include <cmath> using namespace std; const int N = 100; double phi[N][N]; // 水平集函数 double delta_t = 0.1; // 时间步长 double epsilon = 1.0; // 正则化参数 double lambda = 1.0; // 惩罚参数 double mu = 1.0; // 平滑参数 // 计算水平集函数的梯度 void gradient(int i, int j, double &dx, double &dy) { if (i == 0) dx = phi[i+1][j] - phi[i][j]; else if (i == N-1) dx = phi[i][j] - phi[i-1][j]; else dx = (phi[i+1][j] - phi[i-1][j]) / 2.0; if (j == 0) dy = phi[i][j+1] - phi[i][j]; else if (j == N-1) dy = phi[i][j] - phi[i][j-1]; else dy = (phi[i][j+1] - phi[i][j-1]) / 2.0; } // 计算水平集函数的曲率 double curvature(int i, int j) { double dx, dy; gradient(i, j, dx, dy); double dxx, dyy, dxy; gradient(i+1, j, dxx, dxy); gradient(i, j+1, dyy, dxy); return (dxx + dyy - 2.0*dx*dy*dxy) / pow(dx*dx + dy*dy + epsilon, 1.5); } // 更新水平集函数 void update() { double phi_new[N][N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { double k = curvature(i, j); double d = lambda * (mu - k); phi_new[i][j] = phi[i][j] + delta_t * d; } } memcpy(phi, phi_new, sizeof(phi)); } int main() { // 初始化水平集函数 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { double x = i - N/2.0; double y = j - N/2.0; phi[i][j] = sqrt(x*x + y*y) - N/4.0; } } // 迭代更新水平集函数 for (int t = 0; t < 100; t++) { update(); } // 输出水平集函数 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (phi[i][j] > 0) cout << "1 "; else cout << "0 "; } cout << endl; } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值