圖像去模糊演算法 循序漸進 附完整代碼

来源:https://www.cnblogs.com/cpuimage/archive/2018/10/01/9735150.html
-Advertisement-
Play Games

關於圖像模糊演算法的實現, 我相信大多數學習圖像演算法的朋友都很熟悉。 例如常見的毛玻璃效果,高斯模糊等等。 而圖像模糊最簡單的實現就是 在一定區域 對像素做平均值計算。 術語描述,捲積。 1.認識捲積 而平均值計算可以,是一種常見的捲積計算,捲積核權重都為1。 OpenCV中與之對應的演算法是BoxBl ...


關於圖像模糊演算法的實現,

我相信大多數學習圖像演算法的朋友都很熟悉。

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

而圖像模糊最簡單的實現就是 在一定區域 對像素做平均值計算。

術語描述,捲積。

1.認識捲積

而平均值計算可以,看做是一種常見的捲積計算,捲積核權重都為1。

OpenCV中與之對應的演算法是BoxBlur。

圖像方面深度學習中最重要的兩個層,一個池化層,一個捲積層,

其中池化層可以認為是一種特例的捲積層,與求平均值類似。

從網上找了一張捲積操作的示例圖片。

這樣看,雖然知道是在做一個點面計算的操作,但是要具體描述捲積的用途或者原理,是有點困難的。

在兩年前一次公司的內部技術分享會上,我是這麼定義捲積的。

捲積計算從形象上來描述,在圖像領域,一般是2維,

所以可以這麼說 “計算兩個物體在n維空間的相似度(疊加度)的操作,就稱之為(n維)捲積。”

所以圖像是計算兩個物體在2維空間的相似度(疊加度)的操作,就稱之為捲積。

如果兩個物體完全一致,捲積完全重合,重合度為1,這時可以認為它就是同一個物體。

以上描述的兩個物體,在演算法中一般 指的是 捲積核 和被捲積圖片,捲積結果就是其兩者的重合度。

看下深度學習中的池化層。

根據上面的描述,重新理解一下,這個層的作用。

這裡就不展開細講了,大概大家能理解一下捲積這個操作即可。

而一般情況下,捲積操作,是一種信息外散或內聚的計算,

當然也有捲積,反捲積,轉置捲積的說法。

舉個例子,例如均值池化或者說均值捲積,均值模糊。

從計算來看,是取目標像素臨近區域像素的平均值,而所有臨近像素的權重都為1.

最終目標像素的值為n分之1. 

那麼這個計算就好像是把一個物品在2維空間直接攤平,還不能理解的再看下上面對捲積的描述。

就像你有9只螞蟻,你希望他們長得一樣大,你一巴掌下去,身體全部壓平。

而在圖像領域,絕大多數的模糊,就是受到一個“物體”或者說“捲積核”的干擾,

致使採集到的信息丟失,或者說不准確。

例如在按下快門的一瞬間,你手抖了,或者說失去焦點,

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

2.圖像修複

假設我們能找到導致成像模糊的原因,是不是就能實現修複模糊圖像呢?

答案是肯定的。

不過取決於最終採集到的信息的完整度。

如果最後成像一片漆黑,那這個時候是無能為力的。

因為已經沒有足夠的信息了。

而一般圖像是由色光三原色組成,紅綠藍。

理論上只要其中一種顏色信息完整,就可以用於輔助修複其他色光。

只要能計算到當時的色光分佈情況即可實現。

這裡我們就需要稍微提及一下攝像領域3大演算法,自動白平衡,自動對焦,自動曝光。

簡單講下 這三個演算法的區別。

白平衡是為瞭解決色光分佈不均,信息缺失或失真問題的。

自動對焦是為了成像清晰,人為干擾輔助最終成像。

自動曝光當然是為瞭解決採光問題,彌補感光元件的不足。

大概的先後順序,理論上應該是 對焦->曝光->白平衡

一般而言,從這邏輯來看,白平衡是最難解決的,因為它受到前面兩個因素的干擾。

但是實際上,白平衡和曝光目前都解決得很好。

HDR嚴格意義上來說,能兼顧白平衡和曝光。

但是對焦或者說失焦,抖動的問題,一直以來都是老大難。

原因也很簡單,導致成像模糊的因素有很多,通過什麼樣的方法來有效評估修複,就顯得比較困難。

 假設能知道計算到當時受到什麼“物體”的干擾,通過捲積的方式,移除這干擾,是不是就能修複模糊,恢復圖片呈像。

假設造成模糊的因素為:   清晰的圖片 + 干擾因素 = 最終成像

那麼反之恢復圖像即為:   最終成像 - 干擾因素 = 清晰圖片

而這裡把干擾因素和清晰的圖片都認為是一種捲積“物體”。

3.去模糊

有了前面的基礎知識,我們可以做一個假設,進行驗證。

例如,我先對一張圖片做捲積操作,模擬模糊成像。

這個時候: 你同時有了  清晰的圖片 + 干擾因素 = 最終成像

驗證一下:  最終成像 - 干擾因素 = 清晰圖片

這裡不展開演算法實現,

但是結果我可以告訴大家,這思路沒錯,但是有一個干擾因素錯了。

它就是捲積核的大小。

捲積核大小直接決定它的作用範圍。

而我們第一步拿到的 清晰的圖片 + 干擾因素 = 最終成像

這裡 最終成像-干擾因素 卻絕對不等於清晰的圖片。

因為 這裡的干擾因素和最終成像 兩者之間並不是簡單的線性關係,相加或者相減,

他們的關係是捲積關係,也就是說他們都受到捲積核的影響。

如果想要達到 最終成像 - 干擾因素 = 清晰圖片

必須 在最終成像的時候用類似捲積的方式,消除捲積核的內容以及範圍的影響。

換句話說,這個操作必須控制好變數。

這個問題說真的,我思考了很久很久。

最後終於知道問題在哪裡,就是圖像的明度,也就是最終成像。

也就是最終成像中是含有捲積核權重信息的,如果要消除這個信息,

必須將成像也作為權重參與計算。

 也就是說,造成模糊的情況應該是:

    if( sqrt(nx-x) + sqrt(ny-y) <  sqrt(radius) )
    {
        w = luminance(rgb)
        sum += w*s;
        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

 

最後做一個簡單的總結,在圖像領域,使用捲積就能非常好解決 圖像的空間問題,

而深度學習訓練得到的權重,可以簡單的類比上面提到的干擾因素。

通過大量的數據,訓練提取 可能性的干擾因素(物體),若是當前圖像也有符合這個特征的因素(物體),

則進行相應的操作計算。

定位特征,確認特征,發現並處理特征。

分別 對應物體檢測,物體識別,風格化或其他增強修複處理。

採用深度學習最大的好處就是能預先訓練得到已知的信息,然後進行對應的處理。

而傳統演算法,則需要採用先驗條件,

然後在一張圖片中去發現可能性因素,由於參數較少,魯棒性一般不佳。

相比而言,傳統演算法困難重重,因為你要通過科學方式找到一種適配數據自然規律的先驗,真的太不容易。

而深度學習是另一個問題,數據依賴,數據干擾,數據處理,這些預處理也著實夠人頭大的了,

然後還要設計一個比較有效且優良的神經網路。

就目前來看,經典傳統演算法穩定性比較高,但是泛化能力一般較差。

深度學習目前還需要不少傳統演算法配合進行訓練處理,以求達到更好的效果。

就目前來看,工業化落地也有不少問題,不過相信很快就能做得很好了。

因為有大公司和大量資金資本的助推,應該不是難事。

 

若有其他相關問題或者需求也可以郵件聯繫俺探討。

郵箱地址是: 
[email protected]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文: "http://codingpy.com/article/python 201 a tutorial on threads/" 創建多線程 創建多線程主要有2種方式。 使用threading.Thread函數 繼承threading類 1. 使用threading.Thread函數 impo ...
  • 本文主要是總結學習pandas過程中用到的函數和方法, 在此記錄, 防止遺忘. Python數據分析--Pandas知識點(一) Python數據分析--Pandas知識點(二) 下麵將是在知識點一, 二的基礎上繼續總結. 前面所介紹的都是以表格的形式中展現數據, 下麵將介紹Pandas與Matpl ...
  • 堵車節第一天,我沒有出門。把以前一直只限於知道,卻不清晰理解的這幾個概念完完整整地梳理了一番。內容參考自wiki頁面,然後加上自己一些理解。 詞法作用域和動態作用域 不管什麼語言,我們總要學習作用域(或生命周期)的概念,比如常見的稱呼:全局變數、包變數、模塊變數、本地變數、局部變數等等。不管如何稱呼 ...
  • Django提供了認證系統,但是我們的項目中的註冊,需要保存用戶的手機號,所以要自定義用戶模型類,需要給模型類添加額外的欄位。 ...
  • 寫在最前面 大家好,我又回來了,好長時間更新博客,大概是因為我感冒了好久(又找到不學習的理由了),經過再三考慮,我決定重學C語言,對,是重學,因為之前沒有好好學,等於0基礎,所以現在打算打好基礎,再去學其他的東西,因為重新學,所以就打算記錄一下學習過程,順便算是分享吧,由於之前基礎不牢,所以有錯或者 ...
  • 01背包基本模板,要是需要更詳細解釋的話可以評論留言我補上,記得持續關註
  • 傳送門:Wash!! 題意: 有L件衣服要洗,有N台洗衣機,M台烘乾機,給出了每台機器完成一件衣服的工作時間(每台機器同時只能完成一件衣服),問怎麼選擇機器才能使得總的工作時間是最短的。 思路: 用兩個優先隊列,一個表示洗衣機,一個表示烘乾機。先讓洗衣機進行工作,最後一件洗出來的衣服對應著結束的清洗 ...
  • 題意 "題目鏈接" Sol 按照dls的說法,一般這一類的題有兩種思路,一種是枚舉一個點$M$,然後check它能否成為答案。但是對於此題來說好像不好搞 另一種思路是枚舉最小的區間長度是多少,這樣我們把所有區間按長度排序後可以二分出滿足條件的最短的區間長度 觀察後不難發現,較長區間的長度一定是隨著短 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...