传统PCNN算法python实现

传统耦合神经网络(pcnn)算法的实现(python):

参数的设定没有具体参考,这是一篇文献中的解释:
在这里插入图片描述

# coding:utf-8 #
from PIL import Image
from pylab import *
from scipy import signal as sg
from PCNN.noise import sp_noise

import numpy as np

class Pcnn_class():

    def PCNN(self, img_arr, iteration_num,
             Af = 0.60, Al = 1.0, Atop = 0.80,
             Vf = 0.2, Vl = 1, Vtop = 3000.0,
             Beta = 0.1):
    # def PCNN(self, img_arr, iteration_num,
    #          Af = 0.06931, Al = 1.47, Atop = 0.80,
    #          Vf = 20, Vl = 1.9, Vtop = 3000.0,
    #          Beta = 0.16):
        # 获得矩阵的维度
        x_len, y_len = img_arr.shape
        print(" shape: ",x_len,y_len)
        # 定义神经元矩阵,建立n=0时的F、L矩阵(都为0矩阵)
        W = np.array([[0.7070, 1, 0.7070], [1, 0, 1], [0.7070, 1, 0.7070]])
        M = np.array([[0.7070, 1, 0.7070], [1, 0, 1], [0.7070, 1, 0.7070]])
        Y = np.zeros_like(img_arr, dtype="float64")
        F = np.zeros_like(img_arr, dtype="float64")
        L = np.zeros_like(img_arr, dtype="float64")
        top = np.zeros_like(img_arr, dtype="float64")

        # 定义点火过程
        for i in range(0, iteration_num):
            K = sg.convolve2d(Y, M, boundary='symm', mode="same")
            print ("第 %s 次迭代,K矩阵:" % i, K)
            F = exp(-Af) * F + Vf * K + img_arr
            L = exp(-Al) * L + Vl * K
            # print "第 %s 次迭代,L矩阵:" % i, "\n", L
            U = F * (1 + Beta * L)
            top = exp(-Atop) * top + Vtop * Y
            for x_axis in range(0, x_len):
                for y_axis in range(0, y_len):
                    if (U[x_axis, y_axis] > top[x_axis, y_axis]):
                        Y[x_axis, y_axis] = 1.0
                    else:
                        Y[x_axis, y_axis] = 0.0

            print ("第 %s 次迭代完成。\n" % i)


        print(len(Y[Y == 0]))
        print(len(Y[Y == 1]))
        return Y

#####################################################################

# 获得图像矩阵
if __name__ == "__main__":
    img = Image.open(r'C:\Users\dell\Desktop\bs\test-14-MR.jpg').convert('L')
    img = np.array(img)

    noise_img = sp_noise(img, 0.05)
    
    p=Pcnn_class()
    img_out = p.PCNN(img_arr=img, iteration_num=10)
    print ("done!")

    fig,(ax1,ax2,ax3)=plt.subplots(1,3,figsize=(10,6)) #建立1行2列的图fig
    ax1.imshow(noise_img,cmap='gray') #显示原始的图
    ax1.set_axis_off() #不显示坐标轴
    ax1.set_title('PIC1_L')

    ax2.imshow(img_out,cmap='gray') #显示原始的图
    ax2.set_axis_off() #不显示坐标轴
    ax2.set_title('PIC2_L')

    ax3.imshow(img, cmap='gray')  # 显示原始的图
    ax3.set_axis_off()  # 不显示坐标轴
    ax3.set_title('origil')
    plt.show()

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值