百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

图像去噪的自动编码器(图像去噪算法代码)

ztj100 2024-11-08 15:06 26 浏览 0 评论

引言

在这篇文章中,我们将了解自动编码器的工作原理以及为什么使用它们来对医学图像进行去噪。

正确理解图像信息在医学等领域至关重要。去噪可以专注于清理旧的扫描图像或有助于癌症生物学中的特征选择工作。噪音的存在可能混淆疾病的识别和分析,可能导致不必要的死亡。因此,医学图像去噪是一项必不可少的前处理技术。

自动编码器技术已被证明对图像去噪非常有用。

自动编码器由两个连接的人工神经网络组成: 编码器模型和解码器模型。自动编码器的目标是找到一种将输入图像编码成压缩形式(也称为潜在空间)的方法,使得解码后的图像版本尽可能接近输入图像。

自动编码器是如何工作的

下面的网络提供了原始图像 x,以及它们的噪声版本 x ~ 。网络试图重建它的输出 x’尽可能接近原始图像 x,通过这样做,它学会了如何对图像进行去噪。

如图所示,编码器模型将输入转换为小的密集表示。解码器模型可以看作是能够生成特定特征的生成模型。

编码器和解码器网络通常作为一个整体进行训练。损失函数惩罚网络以创建与原始输入 x 不同的输出 x'。

通过这样做,编码器学会在潜在空间中保存尽可能多的相关信息,尽可能地去除不相关部分(例如噪声)。解码器则学习获取潜在空间的信息并将其重构为无错的输入。

如何实现自动编码器

让我们实现一个自动编码器来去除手写数字的噪音。输入是一个28x28的灰度图像,构建一个784个元素的矢量。

编码器网络是具有 64 个神经元的单一密集层。因此,潜在空间将具有 64 维。ReLu激活函数附加到层中的每个神经元,并确定是否应该被激活。激活函数还有助于将每个神经元的输出归一化到 1 到 0 之间。

解码器网络是具有 784 个神经元的单个密集层,对应于 28x28 灰度输出图像。sigmoid 激活函数用于比较编码器输入与解码器输出。

import keras
from keras.layers import Input, Dense
from keras.models import Model
from keras.datasets import mnist
import numpy as np

# input layer
input_img = Input(shape=(784,))

# autoencoder
encoding_dim = 32  
encoded = Dense(encoding_dim, activation='relu')(input_img)
encoded_input = Input(shape=(encoding_dim,))
decoded = Dense(784, activation='sigmoid')(encoded)
autoencoder = Model(input_img, decoded)
decoder_layer = autoencoder.layers[-1]
decoder = Model(encoded_input, decoder_layer(encoded_input))
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

我们将使用MNIST数据集来进行训练和测试,首先我们使用如下对本对其进行噪声加持以及一些预处理。

import matplotlib.pyplot as plt
import random
%matplotlib inline

# get MNIST images, clean and with noise
def get_mnist(noise_factor=0.5):
  (x_train, y_train), (x_test, y_test) = mnist.load_data()

  x_train = x_train.astype('float32') / 255.
  x_test = x_test.astype('float32') / 255.
  x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))
  x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))

  x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) 
  x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) 

  x_train_noisy = np.clip(x_train_noisy, 0., 1.)
  x_test_noisy = np.clip(x_test_noisy, 0., 1.)
  
  return x_train, x_test, x_train_noisy, x_test_noisy, y_train, y_test

x_train, x_test, x_train_noisy, x_test_noisy, y_train, y_test = get_mnist()

# plot n random digits
# use labels to specify which digits to plot
def plot_mnist(x, y, n=10, randomly=False, labels=[]):
  plt.figure(figsize=(20, 2))
  if len(labels)>0:
    x = x[np.isin(y, labels)]
  for i in range(1,n,1):
      ax = plt.subplot(1, n, i)
      if randomly:
        j = random.randint(0,x.shape[0])
      else:
        j = i
      plt.imshow(x[j].reshape(28, 28))
      plt.gray()
      ax.get_xaxis().set_visible(False)
      ax.get_yaxis().set_visible(False)
  plt.show()
  
plot_mnist(x_test_noisy, y_test, randomly=True)

虽然我们肉眼仍可以识别出来数字,但已经非常不清晰了。因此,我们希望使用自动编码器来进行图像去噪。我们通过在使用噪声数字作为输入并使用原始去噪声数字作为目标的同时拟合自动编码器超过 100 个 epochs 来做到这一点。

因此,自动编码器将最小化噪声图像和干净图像之间的差异。通过这样做,它将学习如何从任何看不见的手写数字中去除噪音 (这些数字是由类似的噪音产生的) 。

# flatten the 28x28 images into vectors of size 784.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
x_train_noisy = x_train_noisy.reshape((len(x_train_noisy), np.prod(x_train_noisy.shape[1:])))
x_test_noisy = x_test_noisy.reshape((len(x_test_noisy), np.prod(x_test_noisy.shape[1:])))

#training
history = autoencoder.fit(x_train_noisy, x_train,
                          epochs=100,
                          batch_size=128,
                          shuffle=True,
                          validation_data=(x_test_noisy, x_test))
                          
# plot training performance
def plot_training_loss(history):

  loss = history.history['loss']
  val_loss = history.history['val_loss']

  epochs = range(1, len(loss) + 1)

  plt.plot(epochs, loss, 'bo', label='Training loss')
  plt.plot(epochs, val_loss, 'r', label='Validation loss')
  plt.title('Training and validation loss')
  plt.xlabel('Epochs')
  plt.ylabel('Loss')
  plt.legend()

  plt.show()

plot_training_loss(history)

如何用自动编码器降噪

现在我们可以用经过训练的自动编码器来对图像进行去噪了。

# plot de-noised images
def plot_mnist_predict(x_test, x_test_noisy, autoencoder, y_test, labels=[]):
  
  if len(labels)>0:
    x_test = x_test[np.isin(y_test, labels)]
    x_test_noisy = x_test_noisy[np.isin(y_test, labels)]

  decoded_imgs = autoencoder.predict(x_test)
  n = 10  
  plt.figure(figsize=(20, 4))
  for i in range(n):
      ax = plt.subplot(2, n, i + 1)
      plt.imshow(x_test_noisy[i].reshape(28, 28))
      plt.gray()
      ax.get_xaxis().set_visible(False)
      ax.get_yaxis().set_visible(False)

      ax = plt.subplot(2, n, i + 1 + n)
      plt.imshow(decoded_imgs[i].reshape(28, 28))
      plt.gray()
      ax.get_xaxis().set_visible(False)
      ax.get_yaxis().set_visible(False)
  plt.show()
  return decoded_imgs, x_test
 
decoded_imgs_test, x_test_new = plot_mnist_predict(x_test, x_test_noisy, autoencoder, y_test)

总的来说,噪音消除得非常好。输入图像上人工引入的白点已从清理图像中消失。

去噪对信息质量也有不利影响,重建的数字有点模糊。解码器增加了一些原始图像中没有的特征,例如下面的第8和第9位数字几乎无法识别。

总结

在本文中,我描述了一种图像去噪技术,并附有关于如何使用 Python 构建自动编码器的实用指南。放射科医生通常使用自动编码器对 MRI、US、X 射线或皮肤病变图像进行去噪。这些自动编码器在大型数据集上进行了训练,例如印第安纳大学的胸部 X 射线数据库,其中包含 7470 幅胸部 X 射线图像。去噪自编码器可以用卷积层来增强,以产生更有效的结果。

相关推荐

sharding-jdbc实现`分库分表`与`读写分离`

一、前言本文将基于以下环境整合...

三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么

在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...

MySQL8行级锁_mysql如何加行级锁

MySQL8行级锁版本:8.0.34基本概念...

mysql使用小技巧_mysql使用入门

1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...

MySQL/MariaDB中如何支持全部的Unicode?

永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...

聊聊 MySQL Server 可执行注释,你懂了吗?

前言MySQLServer当前支持如下3种注释风格:...

MySQL系列-源码编译安装(v5.7.34)

一、系统环境要求...

MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了

对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...

MySQL字符问题_mysql中字符串的位置

中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...

深圳尚学堂:mysql基本sql语句大全(三)

数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...

MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?

大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...

一文讲清怎么利用Python Django实现Excel数据表的导入导出功能

摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...

用DataX实现两个MySQL实例间的数据同步

DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...

MySQL数据库知识_mysql数据库基础知识

MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...

如何为MySQL中的JSON字段设置索引

背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...

取消回复欢迎 发表评论: