图像去模糊算法 deblur

2023-05-16

图像去模糊算法 循序渐进 附完整代码

https://www.cnblogs.com/cpuimage/p/9735150.html

(后面要对比smartdeblur,deblur-gan)

关于图像模糊算法的实现,

我相信大多数学习图像算法的朋友都很熟悉。

例如常见的毛玻璃效果,高斯模糊等等。

而图像模糊最简单的实现就是 在一定区域 对像素做平均值计算。

术语描述,卷积。

1.认识卷积

而平均值计算可以,看做是一种常见的卷积计算,卷积核权重都为1。

OpenCV中与之对应的算法是BoxBlur。

图像方面深度学习中最重要的两个层,一个池化层,一个卷积层,

其中池化层可以认为是一种特例的卷积层,与求平均值类似。

从网上找了一张卷积操作的示例图片。

 

这样看,虽然知道是在做一个点面计算的操作,但是要具体描述卷积的用途或者原理,是有点困难的。

在两年前一次公司的内部技术分享会上,我是这么定义卷积的。

卷积计算从形象上来描述,在图像领域,一般是2维,

所以可以这么说 “计算两个物体在n维空间的相似度(叠加度)的操作,就称之为(n维)卷积。”

所以图像是计算两个物体在2维空间的相似度(叠加度)的操作,就称之为卷积。

如果两个物体完全一致,卷积完全重合,重合度为1,这时可以认为它就是同一个物体。

以上描述的两个物体,在算法中一般 指的是 卷积核 和被卷积图片,卷积结果就是其两者的重合度。

 

看下深度学习中的池化层。

根据上面的描述,重新理解一下,这个层的作用。

这里就不展开细讲了,大概大家能理解一下卷积这个操作即可。

而一般情况下,卷积操作,是一种信息外散或内聚的计算,

当然也有卷积,反卷积,转置卷积的说法。

举个例子,例如均值池化或者说均值卷积,均值模糊。

从计算来看,是取目标像素临近区域像素的平均值,而所有临近像素的权重都为1.

最终目标像素的值为n分之1. 

那么这个计算就好像是把一个物品在2维空间直接摊平,还不能理解的再看下上面对卷积的描述。

就像你有9只蚂蚁,你希望他们长得一样大,你一巴掌下去,身体全部压平。

而在图像领域,绝大多数的模糊,就是受到一个“物体”或者说“卷积核”的干扰,

致使采集到的信息丢失,或者说不准确。

例如在按下快门的一瞬间,你手抖了,或者说失去焦点,

就会很容易造成呈像模糊。

2.图像修复

假设我们能找到导致成像模糊的原因,是不是就能实现修复模糊图像呢?

答案是肯定的。

不过取决于最终采集到的信息的完整度。

如果最后成像一片漆黑,那这个时候是无能为力的。

因为已经没有足够的信息了。

而一般图像是由色光三原色组成,红绿蓝。

理论上只要其中一种颜色信息完整,就可以用于辅助修复其他色光。

只要能计算到当时的色光分布情况即可实现。

这里我们就需要稍微提及一下摄像领域3大算法,自动白平衡,自动对焦,自动曝光。

简单讲下 这三个算法的区别。

白平衡是为了解决色光分布不均,信息缺失或失真问题的。

自动对焦是为了成像清晰,人为干扰辅助最终成像。

自动曝光当然是为了解决采光问题,弥补感光元件的不足。

大概的先后顺序,理论上应该是 对焦->曝光->白平衡

一般而言,从这逻辑来看,白平衡是最难解决的,因为它受到前面两个因素的干扰。

但是实际上,白平衡和曝光目前都解决得很好。

HDR严格意义上来说,能兼顾白平衡和曝光。

但是对焦或者说失焦,抖动的问题,一直以来都是老大难。

原因也很简单,导致成像模糊的因素有很多,通过什么样的方法来有效评估修复,就显得比较困难。

 假设能知道计算到当时受到什么“物体”的干扰,通过卷积的方式,移除这干扰,是不是就能修复模糊,恢复图片呈像。

假设造成模糊的因素为:   清晰的图片 + 干扰因素 = 最终成像

那么反之恢复图像即为:   最终成像 - 干扰因素 = 清晰图片

而这里把干扰因素和清晰的图片都认为是一种卷积“物体”。

3.去模糊

有了前面的基础知识,我们可以做一个假设,进行验证。

例如,我先对一张图片做卷积操作,模拟模糊成像。

这个时候: 你同时有了  清晰的图片 + 干扰因素 = 最终成像

验证一下:  最终成像 - 干扰因素 = 清晰图片

这里不展开算法实现,

但是结果我可以告诉大家,这思路没错,但是有一个干扰因素错了。

它就是卷积核的大小。

卷积核大小直接决定它的作用范围。

而我们第一步拿到的 清晰的图片 + 干扰因素 = 最终成像

这里 最终成像-干扰因素 却绝对不等于清晰的图片。

因为 这里的干扰因素和最终成像 两者之间并不是简单的线性关系,相加或者相减,

他们的关系是卷积关系,也就是说他们都受到卷积核的影响。

如果想要达到 最终成像 - 干扰因素 = 清晰图片

必须 在最终成像的时候用类似卷积的方式,消除卷积核的内容以及范围的影响。

换句话说,这个操作必须控制好变量。

这个问题说真的,我思考了很久很久。

最后终于知道问题在哪里,就是图像的明度,也就是最终成像。

也就是最终成像中是含有卷积核权重信息的,如果要消除这个信息,

必须将成像也作为权重参与计算。

 也就是说,造成模糊的情况应该是:

1

2

3

4

5

6

7

ifsqrt(nx-x) + sqrt(ny-y) <  sqrt(radius) )

{

    w = luminance(rgb)

    sum += w*rgb;

    wsum += w;

}

 sum /= wsum;

 伪代码,简洁形象地表达这个现象。

知道这个前因后果,现在恢复模糊,该如何计算。

这个留个作业给大家。

上面伪代码我称之为  散焦 算法,反之为 聚焦 也就是去模糊 。

聚焦算法最终可以实现耗时模糊半径无关,它是去模糊的一种特例。

目前,此算法暂无开源计划。

好几年前就有去模糊的商业软件,当然早期版本作者也开源了。

项目地址:https://github.com/Y-Vladimir/SmartDeblur

但是这个项目并没有很好准确计算到去模糊卷积核。

前几天ipol.im公布了一个比较优秀的评估去模糊卷积核的算法。

Estimating an Image's Blur Kernel Using Natural Image Statistics, and Deblurring it: An Analysis of the Goldstein-Fattal Method

从官网demo演示来看,效果特别不错。

 

但是,它和SmartDeblur 都有着一样的问题,就是用到傅里叶变换去做卷积操作,

十分耗时。

都采用了fftw,计算量还是居高不下。

我对它提供的代码,做了一些简单的裁剪,cmake编译通过,仅依赖fftw。

而代码的算法调优等等,还没做,算法优化空间比较大,最近精力有限,

在音频算法上花的时间比较多,图像暂时没有精力做起来。

感兴趣的朋友,可以移步项目:

https://github.com/cpuimage/Deblurring

而近些年,深度学习大兴,各种各样的模型以及训练集,五花八门。

当然也有去模糊的实现。

效果非常惊艳!

 

网络结构如下:

 

对于采用深度学习的方法进行去模糊实现,可以参阅文章:

https://blog.sicara.com/keras-generative-adversarial-networks-image-deblurring-45e3ab6977b5

项目地址:

https://github.com/RaphaelMeudec/deblur-gan

相关论文:

DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks

https://arxiv.org/pdf/1711.07064.pdf

 

最后做一个简单的总结,在图像领域,使用卷积就能非常好解决 图像的空间问题,

而深度学习训练得到的权重,可以简单的类比上面提到的干扰因素。

通过大量的数据,训练提取 可能性的干扰因素(物体),若是当前图像也有符合这个特征的因素(物体),

则进行相应的操作计算。

定位特征,确认特征,发现并处理特征。

分别 对应物体检测,物体识别,风格化或其他增强修复处理。

采用深度学习最大的好处就是能预先训练得到已知的信息,然后进行对应的处理。

而传统算法,则需要采用先验条件,

然后在一张图片中去发现可能性因素,由于参数较少,鲁棒性一般不佳。

相比而言,传统算法困难重重,因为你要通过科学方式找到一种适配数据自然规律的先验,真的太不容易。

而深度学习是另一个问题,数据依赖,数据干扰,数据处理,这些预处理也着实够人头大的了,

然后还要设计一个比较有效且优良的神经网络。

就目前来看,经典传统算法稳定性比较高,但是泛化能力一般较差。

深度学习目前还需要不少传统算法配合进行训练处理,以求达到更好的效果。

就目前来看,工业化落地也有不少问题,不过相信很快就能做得很好了。

因为有大公司和大量资金资本的助推,应该不是难事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像去模糊算法 deblur 的相关文章

  • 从零开始使用Docker构建Java Web开发运行环境

    概述 前面我们讲了关于Docker的一些基本概念和操作 xff0c 今天我们以一个简单的Java Web例子来说一下Docker在日常工作中的应用 xff0c 本篇主要讲如下几部分内容 xff1a 创建jdk镜像 创建resin镜像 启动w
  • Spring MapFactoryBean应用详解

    在我们工作中 xff0c 尤其是电商系统中 xff0c 一个庞大的电商平台不是一个封闭的平台 xff0c 往往还伴生着一个开放平台 xff0c 用以接入各个企业 xff0c 以实现一种共赢的局面 xff0c 一般来讲 xff0c 针对于这种
  • FreeRTOS系列|二值信号量

    二值信号量 1 信号量简介 信号量一般用来进行资源管理和任务同步 xff0c FreeRTOS中信号量又分为二值信号量 计数型信号量 互斥信号量和递归互斥信号量
  • ubuntu ifconfig命令无效解决方案

    1 更新或升级系统 sudo apt get update 2 安装ipconfig的工具 sudo apt install net tools 3 查看ip ifconfig
  • 树莓派4b镜像烧录以及如何无显示屏远程登陆操作

    1 树莓派的烧录 xff1a 树莓派的烧录我用了很长的时间 xff0c 重新烧录的很多次 xff0c 都是因为没办法打开ssh xff0c 所以没办法进入树莓派调试 因为我使用树莓派主要是用来部署yolov5进行识别物体的 xff0c 所以
  • MyBatis入门——动态SQL

    前言 在我们日常工作中 xff0c 使用MyBatis除了做一般的数据查询之外 xff0c 还有很多业务场景下需要我们针对不同条件从数据库中获取到满足指定条件的数据 xff0c 这时候我们应该如何来做呢 xff1f 针对每种条件封装一个方法
  • Docker搭建本地私有仓库

    和Mavan的管理一样 xff0c Dockers不仅提供了一个中央仓库 xff0c 同时也允许我们使用registry搭建本地私有仓库 使用私有仓库有许多优点 xff1a 一 节省网络带宽 xff0c 针对于每个镜像不用每个人都去中央仓库
  • 斐波那契数列 Java实现

    关于斐波那契数列在百度百科上的定义如下 xff1a 斐波那契数列 xff0c 又称黄金分割数列 xff0c 指的是这样一个数列 xff1a 0 1 1 2 3 5 8 13 21 34 在数学上 xff0c 斐波纳契数列以如下被以递归的方法
  • Maven+Jetty运行项目无法热修改html处理

    一直以来都在做后端工程的开发 xff0c 很少做前端设计 xff0c 最近工作需要开始做前端开发 xff0c 感觉 辛辛苦苦几十年 xff0c 一朝回到解放前 的节奏啊 xff0c 遇到不少问题 xff0c 记录下来以备后查 今天在使用Ma
  • Spring4.3.0 Junit4.11 initializationError(org.junit.runner.manipulation.Filter)

    Spring4 3 0 Junit4 11 initializationError org junit runner manipulation Filter 昨天手欠 xff0c 在项目中把Spring3 2 14版本升级到4 3 0版本
  • zookeeper入门(一)——ZooKeeper伪集群安装

    zookeeper入门 xff08 一 xff09 ZooKeeper伪集群安装 在进行本篇文章之前 xff0c 先请大家了解一下zookeeper xff08 后面的文章为了省事有可能直接使用zk缩写来替代 xff09 xff0c 关于z
  • zookeeper入门(二)——zk客户端脚本使用

    zookeeper入门 xff08 二 xff09 zk客户端脚本使用 在上一篇文章zookeeper入门 xff08 一 xff09 ZooKeeper伪集群安装我们讲了在单机进行zk伪集群安装 xff0c 本篇文章我们来讲一下zk提供的
  • 事务基础知识

    数据库事务 数据库事务定义 xff0c 满足4个特性 xff1a 原子性 xff08 Atomic xff09 一致性 xff08 Consistency xff09 隔离性 xff08 Isolation xff09 和持久性 xff08
  • MySQL事务隔离级别

    1 MySQL所支持的事务隔离级别 MySQL所支持的事务隔离级别 xff1a READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 其中 REPEATABLE READ是
  • Thrift第一个示例

    第一步 xff1a 引入thrift依赖包 compile span class hljs keyword group span span class hljs string 39 org apache thrift 39 span nam
  • FreeRTOS系列|计数信号量

    计数信号量 1 计数信号量简介 计数型信号量有以下两种典型用法 事件计数 xff1a 每次事件发生 xff0c 事件处理函数将释放信号量 xff08 信号量计数值加1 xff09 xff0c 其他处理任务会获取信号量 xff08 信号量计数
  • Redis学习——01.redis安装

    下载 tar xzvf redis span class hljs number 3 2 span span class hljs number 10 span span class hljs preprocessor tar span s
  • IDEA常用设置

    显示主题 建议使用Darcula Appearance gt Theme 编辑器字体 建议使用Courier New或者Consolas Editor gt Font gt Font 打开自动编译 Compiler gt Build pro
  • Windows下执行Linux命令

    常用的工具 Cygwin xff08 http www cygwin com xff09 Cygwin是一个在windows平台上运行的类UNIX模拟环境 xff0c 详细参见百度百科 xff1a https baike baidu com
  • Linux网络编程 - 多线程服务器端的实现(1)

    引言 本来 xff0c 线程在 Windows 中的应用比在 Linux 平台中的应用更广泛 但 Web 服务的发展迫使 UNIX 系列的操作系统开始重视线程 由于 Web 服务器端协议本身具有的特点 xff0c 经常需要同时向多个客户端提

随机推荐

  • 访问带有用户名、密码保护的 URL

    一 URL xff0c 统一资源定位器 指向互联网上的 资源 xff0c 可协议名 主机 端口和资源组成 如 http username password 64 host 8080 directory file query ref Comp
  • 【RT-Thread】STM32F1片内Flash实现Bootloader

    目录 前言1 开发环境搭建2 Bootloader制作3 APP程序制作4 OTA固件打包5 Ymodem升级小结 前言 RT Thread官网对于Bootloader的实现方案有非常详细的描述 xff0c 目前支持F1 F4 L4系列单片
  • SDVOE和传统矩阵的区别

    SDVOE最显著的特点 xff1a 分辨率高 xff0c 最高支持4KP60 4 4 4 图像质量好 xff0c 完全可以达到无压缩效果延时小 xff0c Genlock模式下4K30延时只有不到0 1ms xff0c 链路上嵌入千兆网络
  • GD32的DMA配置

    参考 GD32F4xx 用户手册 DMA 控制器由 4 部分组成 xff1a AHB 从接口配置 DMA xff1b 两个 AHB 主接口进行数据传输 xff1b 两个仲裁器进行 DMA 请求的优先级管理 xff1b 数据处理和计数 DMA
  • nuttx杂记

    1 设置自启动应用 修改deconfig文件下的 CONFIG INIT ENTRYPOINT 参数即可 2 消息队列使用 以下是Nuttx系统中使用queue create函数创建队列的示例代码 xff1a include lt stdi
  • linux下使用jlink 调试 stm32的破事

    安装libusb sudo apt get install libusb 安装readline wget c ftp ftp gnu org gnu readline readline 6 2 tar gz tar zxvf readlin
  • FreeRTOS系列|软件定时器

    软件定时器 MCU一般都自带定时器 xff0c 属于硬件定时器 xff0c 但是不同的MCU其硬件定时器数量不同 xff0c 有时需要考虑成本的问题 在硬件定时器不够用的时候 xff0c FreeRTOS也提供了定时器功能 xff0c 不过
  • 视频芯片选择

    常用的视频芯片记录 HDMI TI ITE Explore Silicon image ADI semtech https www semtech com Realtek MACRO http www mitinc co kr module
  • 眼图里的那些破事

    1 眼图基本概念 1 1 眼图的形成原理 眼图是一系列数字信号在示波器上累积而显示的图形 xff0c 它包含了丰富的信息 xff0c 从眼图上可以观察出码间串扰和噪声的影响 xff0c 体现了数字信号整体的特征 xff0c 从而估计系统优劣
  • IIC的地址

    7位寻址 在7位寻址过程中 xff0c 从机地址在启动信号后的第一个字节开始传输 xff0c 该字节的前7位为从机地址 xff0c 第8位为读写位 xff0c 其中0表示写 xff0c 1表示读 图1 xff1a 7位寻址 I2C总线规范规
  • ODR, BSRR, BRR的差别

    ODR寄存器可读可写 xff1a 既能控制管脚为高电平 xff0c 也能控制管脚为低电平 管脚对于位写1 gpio 管脚为高电平 xff0c 写 0 为低电平 BSRR 只写寄存器 xff1a color 61 Red 既能控制管脚为高电平
  • ACAP究竟是什么

    Xilinx推出Versal系列 xff0c 号称业界首款ACAP xff0c 自适应计算加速平台 ACAP不仅是一个新的处理器 xff0c 而且是新的产品类型 作为率先推出ACAP这样类型产品的公司 xff0c 这也是赛灵思的核心竞争力所
  • ISE 14.7 调试错误笔记

    1 ERROR Pack 2530 The dual data rate register 34 U sys ctl ODDR2 inst 2 34 failed to join an OLOGIC component as require
  • HDMI 4K分辨率 时序

    参考 HDMI1 4标准 High Definition Multimedia Interface Specification 这份文件放在百度网盘共享了 xff0c 上传到文档平台会被封禁 xff0c 如果侵权 xff0c 麻烦联系我删除
  • 深度学习CPU,GPU,NPU,TPU以及其计算能力单位

    处理器运算能力单位 TOPS是Tera Operations Per Second的缩写 xff0c 1TOPS代表处理器每秒钟可进行一万亿次 xff08 10 12 xff09 操作 与此对应的还有GOPS xff08 Giga Oper
  • SSD数据集增强方法

    coding utf 8 import numpy as np import random import cv2 import glob import os import xml etree cElementTree as ET def r
  • 目标检测图像增强

    https blog csdn net wei guo xd article details 74199729 常用的图像扩充方式有 xff1a 水平翻转 xff0c 裁剪 xff0c 视角变换 xff0c jpeg压缩 xff0c 尺度变
  • FreeRTOS系列|低功耗管理

    低功耗管理 很多应用场合对于空耗的要求很严格 xff0c 比如可穿戴低功耗产品 物联网低功耗产品等 一般MCU都有相应的低功耗模式 xff0c 裸机开发时可以使用MCU的低功耗模式 FreeRTOS也提供了一个叫Tickless的低功耗模式
  • PELCO-D

    https blog csdn net subfate article details 36644419 在搞visca的同时顺便也搞了pelco 这里再做个笔记 pelco xff0c 中文翻译为 派尔高 xff0c 在行文和写代码过程
  • 图像去模糊算法 deblur

    图像去模糊算法 循序渐进 附完整代码 https www cnblogs com cpuimage p 9735150 html xff08 后面要对比smartdeblur xff0c deblur gan xff09 关于图像模糊算法的