基于Tensorflow实现《Cellular Neural Networks: Applications》论文图片

本文介绍了如何使用Tensorflow实现细胞神经网络,展示了其在高斯噪音和非高斯噪音去噪上的应用,以及对边缘、角点和汉字识别的特征提取过程。通过实例展示了不同模板和参数对去噪效果的影响。

1. 导入相关模块

import numpy as np
import random
import cv2
import matplotlib.pyplot as plt
import tensorflow as tf
import matplotlib as mpl
import matplotlib.ticker as ticker
from scipy.interpolate import make_interp_spline
!gdown --id 1fsKERl26TNTFIY25PhReoCujxwJvfyHn
zhfont = mpl.font_manager.FontProperties(fname='SimHei .ttf')
zhfont2 = mpl.font_manager.FontProperties(fname='New Times Roman .ttf')

2.创建图片

# 创建图片:汉字“王”
img01 = np.zeros([16,16])
for i in range(16):
  # print(i)
  for j in range(16):
    if ((i>=0 and i<=2) or (i>=6 and i<=8) or (i>=13 and i<=15)):
      img01[i][j] = -1
    else:
      if (j>=6 and j<=9):
        img01[i][j] = -1
      else:
        img01[i][j] = 1
        
plt.figure(figsize=(3,3))
plt.subplot(111)
plt.imshow(img01,cmap ='gray')

在这里插入图片描述

# 创建图片:菱形
def get_diamond(I):
  img = np.ones([16,16])
  for i in range(8):
    for j in range(8):
      if ((i+j)>=7):
        img[i][j] = I
  for i in range(8):
    for j in range(8,16,1):
      img[i][j] = img[i][15-j]
  for i in range(8,16,1):
    for j in range(16):
      img[i][j] = img[15-i][j]
  return img

plt.figure(figsize=(3,3))
plt.subplot(111)
plt.imshow(get_diamond(-0.5),cmap ='gray')

在这里插入图片描述

# 创建图片:正方形
def get_square(I):
  img = np.ones([16,16])
  for i in range(16):
    for j in range(16):
      if (i >= 3 and i <= 12) and (j >= 3 and j <= 12):
        img[i][j] = I
  return img

plt.figure(figsize=(3,3))
plt.subplot(111)
plt.imshow(get_square(-0.5),cmap ='gray')

在这里插入图片描述

# 创建图片:汉字“中”
def get_zhong(I):
  A = np.ones([16,16])
  for i in range(16):
    for j in range(16):
      if i != 0 and i != 15 and (j==7 or j==8):
        A[i][j] = I

  for i in range(16):
    for j in range(16):
      if i<=10 and i >=4 and (j==2 or j==3 or j==12 or j==13):
        A[i][j] = I

  for i in range(16):
    for j in range(16):
      if (i==4 or i==5  or i==8  or i==9 )and (j>=2 and j<=13):
        A[i][j] = I

  return A
plt.figure(figsize=(3,3))
plt.subplot(111)
plt.imshow(get_zhong(-0.5),cmap ='gray')

在这里插入图片描述

# 创建图片:汉字“不”
def get_bu(I):
  A = np.ones([16,16])
  for i in range(16):
    for j in range(16):
      if (i == 1 or i == 2) and (j > 0 and j < 15):
        A[i][j] = I

  for i in range(16):
    for j in range(16):
      if (i >= 3 and i <= 14) and (j == 7 or j == 8):
        A[i][j] = I

  for i in range(16):
    for j in range(16):
      if (i >= 4 and i <= 9):
        A[i][10-i] = I
        A[i][11-i] = I

  for i in range(16):
    for j in range(8,16,1):
      A[i][j] = A[i][15-j]
  return A
plt.figure(figsize=(3,3))
plt.subplot(111)
plt.imshow(get_bu(-0.5),cmap ='gray')

在这里插入图片描述

3.加入噪音

# 高斯噪音
def gasuss_noise02(image, mean=0, var=0.1):
    noise = np.random.normal(mean, var, image.shape)
    return noise+image
# 加入高斯噪音
img01_noise1 = gasuss_noise02(image=img01,mean=0,var=0.2)
img01_noise2 = gasuss_noise02(image=img01,mean=0,var=0.4)
img01_noise3 = gasuss_noise02(image=img01,mean=0,var=0.6)
img01_noise4 = gasuss_noise02(image=img01,mean=0,var=1.0)
plt.figure(figsize=(5,5))
plt.figure(1)
# plt.xlabel(u"4类不同方差高斯噪音效果图",fontproperties=zhfont,fontsize=14)
plt.subplot(221)
plt.imshow(img01_noise1,cmap ='gray')

plt.subplot(222)
plt.imshow(img01_noise2,cmap ='gray')

plt.subplot(223)
# plt.tight_layout(0.001)
plt.imshow(img01_noise3,cmap ='gray')

plt.subplot(224)
plt.imshow(img01_noise4,cmap ='gray')

plt.suptitle(u"4种不同方差高斯噪音效果图",fontproperties=zhfont,fontsize=14,y=0.05)

在这里插入图片描述

# 非高斯噪音
def sp_noise(image,prob):
    '''
    添加椒盐噪声
    prob:噪声比例 
    '''
    output = np.zeros(image.shape)
    thres = 1 - prob 
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdn = random.random()
            if rdn < prob:
                output[i][j] = -0.5
            elif rdn > thres:
                output[i][j] = 0.5
            else:
                output[i][j] = image[i][j]
    return output
# 加入非高斯噪音
img01_noise5 = sp_noise(image=img01, prob=0.08)
plt.figure(figsize=(3,3))
plt.imshow(img01_noise5,cmap ='gray')
plt.suptitle(u"非高斯噪音",fontproperties=zhfont,fontsize=14,y=0.02)

在这里插入图片描述

4.Cloning Template

# Cloning Template in Fig.4
filters_4a = tf.constant([	
  [[0.0],[1.0],[0.0]],
  [[1.0],[2.0],[1.0]],
  [[0.0],[1.0],[0.0]],	
],dtype=tf.float32)

filters_4b = tf.constant([	
  [[0.0],[1.0],[0.0]],
  [[1.0],[4.0],[1.0]],
  [[0.0],[1.0],[0.0]],	
],dtype=tf.float32)

filters_4c = tf.constant([	
  [[0.5],[1.0],[0.5]],
  [[1.0],[4.0],[1.0]],
  [[0.5],[1.0],[0.5]],	
],dtype=tf.float32)

filters_4d = tf.constant([	
  [[0.0],[0.0],[0.0]],
  [[0.0],[4.0],[0.0]],
  [[0.0],[0.0],[0.0]],	
],dtype=tf.float32)

filters_15 = tf.constant([	
  [[0.0],[-0.5],[0.0]],
  [[-0.5],[2.0],[-0.5]],
  [[0.0],[-0.5],[0.0]],	
],dtype=tf.float32)

filters_17 = tf.constant([	
  [[0.0],[-1],[0.0]],
  [[-1.0],[4.0],[-1.0]],
  [[0.0],[-1],[0.0]],	
],dtype=tf.float32)

filters_18a = tf.constant([	
  [[0.0],[0.0],[0.0]],
  [[0.0],[2.0],[0.0]],
  [[0.0],[0.0],[0.0]],	
],dtype=tf.float32)

filters_18b = tf.constant([	
  [[-0.25],[-0.25],[-0.25]],
  [[-0.25],[2.0],[-0.25]],
  [[-0.25],[-0.25],[-0.25]],	
],dtype=tf.float32)

filters_19 = tf.constant([	
  [[1.0],[1.0],[1.0]],
  [[1.0],[-8.0],[1.0]],
  [[1.0],[1.0],[1.0]],	
],dtype=tf.float32)

print('Cloning templates: Fig.4(a)')
print(tf.reshape(tf.convert_to_tensor(filters_4a,dtype=tf.float32), [3,3]).numpy())
print('Cloning templates: Fig.4(b)')
print(tf.reshape(tf.convert_to_tensor(filters_4b,dtype=tf.float32), [3,3]).numpy())
print('Cloning templates: Fig.4(c)')
print(tf.reshape(tf.convert_to_tensor(filters_4c,dtype=tf.float32), [3,3]).numpy())
print('Cloning templates: Fig.4(d)')
print(tf.reshape(tf.convert_to_tensor(filters_4d,dtype=tf.float32), [3,3]).numpy())
filters_4a = tf.reshape(filters_4a, [3, 3, 1, 1])
filters_4b = tf.reshape(filters_4b, [3, 3, 1, 1])
filters_4c = tf.reshape(filters_4c, [3, 3, 1, 1])
filters_4d = tf.reshape(filters_4d, [3, 3, 1, 1])
filters_15 = tf.reshape(filters_15, [3, 3, 1, 1])
filters_17 = tf.reshape(filters_17, [3, 3, 1, 1])
filters_18a = tf.reshape(filters_18a, [3, 3, 1, 1])
filters_18b = tf.reshape(filters_18b, [3, 3, 1, 1])
filters_19 = tf.reshape(filters_19, [3, 3, 1, 1])

在这里插入图片描述

5.细胞神经网络

# 输出值过滤函数
def sgn(x):
  if x > 1:
    return 1
  elif x < -1:
    return -1
  else:
    return x

rng = [i for i in range(-10,10,2)]
y = [sgn(x) for x in rng]
plt.plot(rng, y)
# 细胞神经网络运算并绘图
def convolution_fig(input_x, filterinput, epochs, fig_size, fig_num, title):

  A1 = np.zeros([16,16],dtype=float)
  A2 = np.zeros([16,16],dtype=float)
  A3 = np.zeros([16,16],dtype=float)

  for i in range(16):
    for j in range(16):
      A1[i][j] = float(input_x[i][j])

  for i in range(16):
    for j in range(16):
      A3[i][j] = sgn(float(input_x[i][j]))

  # A3:Vyij,[16,16]
  # A1:Vxij,[16,16]
  for k in range(epochs):
    if fig_num == 4:
      if k == 0:
        plt.figure(figsize=(fig_size,fig_size))
        plt.suptitle(title,y=0.01)
        plt.subplot(221)
        plt.imshow(A3,cmap ='gray')
      elif k == int(epochs/4):
        plt.subplot(222)
        plt.imshow(A3,cmap ='gray')
      elif k == int(epochs/2):
        plt.subplot(223)
        plt.imshow(A3,cmap ='gray')
      elif k == int(epochs-1):
        plt.subplot(224)
        plt.imshow(A3,cmap ='gray')
        plt.tight_layout()
    elif fig_num == 6:
      if k == 0:
        plt.figure(figsize=(fig_size,fig_size/1.6))
        plt.suptitle(title,y=0.01)
        plt.subplot(231)
        plt.imshow(A3,cmap ='gray')
      elif k == 1:
        plt.subplot(232)
        plt.imshow(A3,cmap ='gray')
      elif k == 2:
        plt.subplot(233)
        plt.imshow(A3,cmap ='gray')
      elif k == 3:
        plt.subplot(234)
        plt.imshow(A3,cmap ='gray')
      elif k == 4:
        plt.subplot(235)
        plt.imshow(A3,cmap ='gray')
      elif k == 5:
        plt.subplot(236)
        plt.imshow(A3,cmap ='gray')
        plt.tight_layout()
    elif fig_num == 8:
      if k == 0:
        plt.figure(figsize=(fig_size,fig_size/2.2))
        plt.suptitle(title,y=0.05)
        plt.subplot(241)
        plt.imshow(A3,cmap ='gray')
      elif k == 1:
        plt.subplot(242)
        plt.imshow(A3,cmap ='gray')
      elif k == 2:
        plt.subplot(243)
        plt.imshow(A3,cmap ='gray')
      elif k == 3:
        plt.subplot(244)
        plt.imshow(A3,cmap ='gray')
      elif k == 4:
        plt.subplot(245)
        plt.imshow(A3,cmap ='gray')
      elif k == 5:
        plt.subplot(246)
        plt.imshow(A3,cmap ='gray')
      elif k == 6:
        plt.subplot(247)
        plt.imshow(A3,cmap ='gray')
      elif k == 7:
        plt.subplot(248)
        plt.imshow(A3,cmap ='gray')
                      
    # A4, [1, 18, 18, 1]
    A4 = np.pad(A3, ((1,1), (1,1)), 'edge')
    A4 = tf.reshape(tf.convert_to_tensor(A4,dtype=tf.float32), [1, 18, 18, 1])
    # 卷积运算,A*Vyij -> [1, 16, 16, 1]
    A4 = tf.nn.conv2d(A4, filterinput, strides=[1,1,1,1], padding='VALID')

    for i in range(16):
      for j in range(16):
        # Vxij = Vxij + A*Vyij
        A1[i][j] = A1[i][j] + float(A4[0][i][j][0])*0.2

    for i in range(16):
      for j in range(16):
        A3[i][j] = sgn(float(A1[i][j]))

6.去噪效果对比

convolution_fig(input_x=img01_noise1, filterinput=filters_4a, epochs=4, fig_size=4, fig_num=4, title='Fig.5')

在这里插入图片描述

convolution_fig(input_x=img01_noise2, filterinput=filters_4a, epochs=4, fig_size=4, fig_num=4, title='Fig.6')

在这里插入图片描述

convolution_fig(input_x=img01_noise1, filterinput=filters_4b, epochs=4, fig_size=4, fig_num=4, title='Fig.7')

在这里插入图片描述

convolution_fig(input_x=img01_noise2, filterinput=filters_4b, epochs=4, fig_size=4, fig_num=4, title='Fig.8')

在这里插入图片描述

convolution_fig(input_x=img01_noise3, filterinput=filters_4b, epochs=4, fig_size=4, fig_num=4, title='Fig.9')

在这里插入图片描述

convolution_fig(input_x=img01_noise4, filterinput=filters_4b, epochs=8, fig_size=4, fig_num=4, title='Fig.10')

在这里插入图片描述

convolution_fig(input_x=img01_noise1, filterinput=filters_4c, epochs=6, fig_size=6, fig_num=6, title='Fig.11')

在这里插入图片描述

convolution_fig(input_x=img01_noise2, filterinput=filters_4c, epochs=6, fig_size=6, fig_num=6, title='Fig.12')

在这里插入图片描述

convolution_fig(input_x=img01_noise5, filterinput=filters_4a, epochs=6, fig_size=6, fig_num=6, title='Fig.13')

在这里插入图片描述

convolution_fig(input_x=img01_noise5, filterinput=filters_4d, epochs=6, fig_size=6, fig_num=6, title='Fig.14')

在这里插入图片描述

7.特征提取: 边缘与角点

convolution_fig(input_x=get_diamond(-0.5), filterinput=filters_15, epochs=8, fig_size=10, fig_num=8, title='Fig.19')

在这里插入图片描述

convolution_fig(input_x=get_diamond(-0.8), filterinput=filters_15, epochs=8, fig_size=10, fig_num=8, title='Fig.20')

在这里插入图片描述

convolution_fig(input_x=get_diamond(0.9), filterinput=filters_15, epochs=8, fig_size=10, fig_num=8, title='Fig.21')

在这里插入图片描述

convolution_fig(input_x=get_square(-0.8), filterinput=filters_17, epochs=64, fig_size=10, fig_num=8, title='Fig.22')

在这里插入图片描述

convolution_fig(input_x=get_square(-0.5), filterinput=filters_17, epochs=32, fig_size=6, fig_num=6, title='Fig.23')

在这里插入图片描述

convolution_fig(input_x=get_diamond(-0.5), filterinput=filters_18b, epochs=4, fig_size=4, fig_num=4, title='Fig.24')

在这里插入图片描述

convolution_fig(input_x=get_square(-0.5), filterinput=filters_18b, epochs=4, fig_size=4, fig_num=4, title='Fig.25')

在这里插入图片描述

convolution_fig(input_x=get_diamond(-0.2), filterinput=filters_17, epochs=4, fig_size=4, fig_num=4, title='Fig.26')

在这里插入图片描述

convolution_fig(input_x=get_square(-0.5), filterinput=filters_15, epochs=8, fig_size=4, fig_num=4, title='Fig.27')

在这里插入图片描述

8.中文识别

convolution_fig(input_x=get_zhong(-0.5), filterinput=filters_17, epochs=32, fig_size=4, fig_num=4, title='Fig.34')

在这里插入图片描述

convolution_fig(input_x=get_bu(0.1), filterinput=filters_17, epochs=32, fig_size=4, fig_num=4, title='Fig.35')

在这里插入图片描述

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值