通俗語言說BM3D


隨着友商某以攝像著稱的旗艦機型的發佈,其SOC中ISP5.0採用的所謂單反級降噪算法BM3D一下火熱起來,本文試圖用盡量通俗易懂的語言從算法原理的角度揭開BM3D算法的神祕面紗。


本文結構如下:
1.前言
2.硬閾值濾波原理介紹
3.維納濾波原理介紹
4.BM3D原理詳述
5.空間域降噪原理
6.再談3D降噪(3DNR)


1.前言
圖像去噪是計算機視覺前處理中很重要的一個環節,對於手機camera來講,去噪的好壞直接影響最終圖像的質量,圖像去噪算法經歷了傳統的空間域去噪,基於傅立葉變換/離散餘弦變換的頻率域濾波降噪,基於變分法及模擬熱對流的偏微分方程降噪方法,小波/多尺度幾何變換(超小波)的多尺度降噪,以及現在非常火熱的基於CNN(深度卷積神經網絡)的AI降噪等階段的演進。 BM3D降噪是芬蘭的坦佩雷理工大學(Pampere University of Technology)的Kosadin、Alessandro、Vladimir、Karen等人2007年提出的基於傳統方法的圖像降噪算法,該方法的去噪性能目前是非AI圖像降噪中去噪效果最好的,無愧於state-of-art denoising performance的稱號。BM3D的基本思想來自於自然圖像中本身有很多相似的重複結構的觀察結果,採用圖像塊匹配的方式對這些相似的結構進行收集聚合,然後對其正交變換,得到它們的一個稀疏表示,充分利用稀疏性和結構相似性,進行濾波處理,BM3D的去噪能夠充分保留圖像的結構和細節,得到很好的信噪比。

在這裏插入圖片描述

自然圖像自相似塊結構

由於在BM3D降噪算法的兩個很重要的步驟中分別用到了變換域硬閾值濾波和維納濾波,因此在介紹BM3D之前,在本文的第2部分及第三部分分別簡要介紹硬閾值濾波的基本原理和維納濾波的基本原理。

在這裏插入圖片描述


2.硬閾值濾波原理介紹
硬閾值濾波是著名信號處理調和分析領域專家Donoho 1995年提出的在小波域對白噪聲進行去噪的方法,它的基本假設是白噪聲在小波的各個尺度中均勻分佈,但是相對於主要信號的係數來說很小,於是可以通過一個硬閾值來將其區分開來,小於閾值的係數,將其置零,大於閾值的係數保持不變,通過這樣的方法可以達到對信號進行去噪的目的,其基本流程如下圖所示:

在這裏插入圖片描述

其具體過程描述如下:
(1)將信號從時間域或者空間域通過正交變換變換到變換域
(2)對變換域係數進行硬閾值濾波
(3)將硬閾值濾波後的變換域係數通過正交反變換還原到原來的時間域或者空間域得到去噪後的信號
這裏的硬閾值濾波就是對變換域係數做一個簡單的判斷,如果其係數絕對值大於給定的閾值,那麼保持係數不變,如果係數絕對值小於給點閾值,那麼將係數置零。

這裏的信號可以是一維信號,也可以是二維三維甚至是高維信號,其中本文要談的圖像就是二維信號,這裏的正交變換可以是任意針對信號處理設計的正交變換,常用的傅立葉變換,離散餘弦變換,小波變換,多尺度幾何分析(超小波)等均在正交變換的範圍內。

爲了更形象理解上述過程,這裏分別給出一維及二維信號的硬閾值濾波過程

在這裏插入圖片描述

close all
x = 0:0.02:3*pi;
y = 5 * cos(1 * x) + 8 * cos(3 * x)  + 7 * cos(5 * x) + 6 * cos(7 * x) + 5 * cos(10 * x);

y1 = y + 2.5 * randn(1, length(x));

freq_f1 = dct(y1);
freq_f  = dct(y);

hard_thresh = 50;

freq_signal_index = abs(freq_f1) > hard_thresh;
freq_f1_signal = freq_f1 .* freq_signal_index;

y1_hat = idct(freq_f1_signal);

y_hard = 50 * ones(1, length(x));


figure
subplot(211)
plot(x, y)
title('Original Signal')
subplot(212)
plot(x, y1)
title('Dirty Signal')

figure
subplot(511)
plot(x, y)
title('Original Signal')
subplot(512)
plot(x, y1)
title('Dirty Signal')
subplot(513)
plot(freq_f1)
title('DCT Coef of Dirty Signal')
hold on
plot(y_hard, 'r')
subplot(514)
plot(freq_f1_signal)
title('Dct Coef after Hard Shrinkage')
subplot(515)
plot(x, y1_hat)
title('Dirty Signal after Hard Shrinkage')

圖中的紅線即爲給定的閾值,小於紅線的係數全部改成零,然後反變換回來,可以將髒信號恢復到原始信號

從上到下的信號處理過程如下圖所示

在這裏插入圖片描述

從圖片可以看出,經過簡單的硬閾值濾波,可以很好的過濾掉噪聲信號,當然,這裏的濾波結果太完美,實際上在噪聲很大的時候,會殘留一些噪聲信號,但是信號的整體信噪比還是會有很大的提升的。

對於二維信號,這裏主要指的是數字圖像信號,其原理也類似,下面也給出一個直觀的例子,

在這裏插入圖片描述

close all
x = linspace(0, 3*pi, 128);
y = linspace(0, 3*pi, 128);
[X, Y] = meshgrid(x, y);
Z = 6 + cos(X).*cos(Y) + 8 * cos(3*X).*cos(3*Y) + 9 * cos(5*X).*cos(5*Y) + 7 * cos(7*X).*cos(7*Y);
Z1 = 10.5 * randn(128, 128) + Z;

freq_Z = dct2(Z);
freq_Z1 = dct2(Z1);

hard_thresh = 45;
freq_Z1_mask = abs(freq_Z1) > hard_thresh;
freq_Z1_hat = freq_Z1 .* freq_Z1_mask;
Z1_hat = idct2(freq_Z1_hat);


%surf(Z1)

Z_img = uint8((Z+30)/60 * 255);
Z1_img = uint8((Z1+30)/60 * 255);
Z1_hat_img = uint8((Z1_hat + 30)/60 * 255);

imshow(Z_img)
title('Original 2D Signal')
figure, imshow(Z1_img)
title('2D Signal with Noise')
figure, imshow(Z1_hat_img)
title('2D Signal After Hard Shrinkage')
figure, mesh(freq_Z)
title('2D DCT Coef of Original 2D Signal')
figure, mesh(freq_Z1)
title('2D DCT Coef of Noisy 2D Signal')
figure, mesh(freq_Z1_hat)
title('2D DCT Coef after Hard Shrinkage')

figure
subplot(151)
imshow(Z_img)
title('Original 2D Signal')
subplot(152)
imshow(Z1_img)
title('2D Signal with Noise')
subplot(153)
surf(abs(freq_Z1))
title('2D DCT Coef of Noisy 2D Signal')
subplot(154)
surf(abs(freq_Z1_hat))
title('2D DCT Coef after Hard Shrinkage')
subplot(155)
imshow(Z1_hat_img)
title('2D Signal After Hard Shrinkage')

3.維納濾波原理介紹
維納濾波器是採用統計的方法對平穩信號進行濾波的一種方法,其基本思想是設計一個濾波器使得信號經過濾波器後的輸出信號和原始信號誤差在統計意義上最小,其流程如下圖所示:

在這裏插入圖片描述

在信號的採集或者傳輸的過程中,信道里存在噪聲,比如拍照過程,傳感器中本身存在熱噪聲,同時在光子計數過程中也存在着泊松噪聲,這樣我們的ISP處理器得到的信號就是一個含噪信號,ISP去噪的過程就是爲了從含有噪聲的CMOS RAW數據中恢復出原始不好早的照片。維納濾波器想要達到的目的是經過濾波其得到的信號y和原始信號在統計意義上誤差最小,即均方誤差最小(MMSE),可用如下公式表示:
minE(e2)=minE((ys)2) min E(e^2)= min E((y-s)^2)
圖像信號通常是先採集然後處理的信號,因此可以用非因果的維納濾波器,其系統函數在頻率域的表達式爲:
H(z)=Pxy(z)Pss(z)+Pw(z) H(z)=\frac{P_{xy}(z)}{P_{ss}(z)+P_w(z)}
這裏H(z)H(z)爲維納濾波器系統函數的頻域表達式,Pxy(z)P_{xy}(z)爲信號x與濾波後信號y的相關函數的功率譜,Pss(z)P_{ss}(z)爲原始信號的功率譜,Pw(z)P_w(z)爲噪聲信號的功率譜。如果對統計信號處理不太瞭解,可以將維納濾波器當作一個黑盒子,經過黑盒子後,信號便恢復到和原始信號誤差統計意義上最小,也就達到我們去噪的目的了。

Donoho等人在1995年發表文章認爲,白噪聲信號經過正交變換後,在每個正交基張成的子空間裏仍然是白噪聲,而通常採用的正交變換基函數爲歸一化的基函數,其功率爲單位功率,因此在正交變換域的某個基上的功率即爲該係數的代數平方,基於此在正交變換域做維納濾波的方法是點對點的係數收縮即可達到濾波的目的,而圖像的噪聲水平很容易採用統計的方法估計出來,我們記其方差爲σ2\sigma^2,於是給出在正交變換域中的維納濾波系統函數公式:
H=Tx2Tx2+σ2 H = \frac{T_x^2}{T_x^2+\sigma^2}
其中TxT_x爲信號經過正交變換後的係數,比如傅立葉變換係數,離散餘弦變換系數,小波變換系數等
在工程中,我們是沒法拿到原始信號的,因此也無法拿到原始信號的正交變換系數放到上述維納濾波器中進行濾波,最簡單的方法便是將噪聲信號當作原始信號進行正交變換帶入維納濾波公式得到濾波結果,但是這樣的效果通常不怎麼理想,下面給出這樣的一組實驗結果

在這裏插入圖片描述

從圖像效果上來看,直接拿含噪信號當作原始信號帶入到維納濾波系統函數中進行維納濾波,效果並不太理想,從2D-DCT係數上來看也是如此。因此對上述維納濾波進行改進,對含噪信號進行硬閾值濾波,得到的信號當作原始信號帶入到維納濾波系統函數中,然後對爲經過任何操作的含噪信號進行維納濾波,這樣得到的結果更好,下面給出這樣的一組實驗:

在這裏插入圖片描述

clear
clc
close all
x = linspace(0, 3*pi, 128);
y = linspace(0, 3*pi, 128);
[X, Y] = meshgrid(x, y);
Z = 6 + cos(X).*cos(Y) + 8 * cos(3*X).*cos(3*Y) + 9 * cos(5*X).*cos(5*Y) + 7 * cos(7*X).*cos(7*Y);
Z1 = 10.5 * randn(128, 128) + Z;

freq_Z = dct2(Z);
freq_Z1 = dct2(Z1);

sigma = 20.5^2;
hard_thresh = 35;

winer_filter_ideal =  freq_Z.^2 ./ (freq_Z.^2 + sigma);
winer_filter = freq_Z1.^2 ./ (freq_Z1.^2 + sigma);
freq_Z1_hat_ideal = winer_filter_ideal .* freq_Z1;
freq_Z1_hat = winer_filter .* freq_Z1;
Z1_hat = dct2(freq_Z1_hat);
Z1_hat_ideal = dct2(freq_Z1_hat_ideal);

freq_Z1_mask = abs(freq_Z1) > hard_thresh;
freq_Z1_hard = freq_Z1 .* freq_Z1_mask;
freq_Z1_hat_hard = freq_Z1_hard.^2 ./ (freq_Z1_hard.^2 + sigma) .* freq_Z1;
Z1_hat_hard = dct2(freq_Z1_hat_hard);


Z_img = uint8((Z+30)/60 * 255);
Z1_img = uint8((Z1+30)/60 * 255);
Z1_hat_img = uint8((Z1_hat + 30)/60 * 255);
Z1_hat_img_ideal = uint8((Z1_hat_ideal + 30)/60 * 255);
Z1_hat_img_hard = uint8((Z1_hat_hard + 30)/60 * 255);

figure, imshow(Z_img);
title('Original 2D Signal')
figure, imshow(Z1_img);
title('Noisy 2D Signal')
figure, imshow(Z1_hat_img);
title('2D Signal After Wiener Filtering')
figure, imshow(Z1_hat_img_ideal)
title('2D Signal After Hard Wiener Filtering')
figure, mesh(freq_Z);
title('2D DCT Coef of Noisy Signal')
figure, mesh(freq_Z1);
title('2D DCT Coef of Original Signal')
figure, mesh(freq_Z1_hat);
title('2D DCT Coef After Wiener Filtering')
figure, mesh(freq_Z1_hat_ideal)
title('2D DCT Coef After Hard Wiener Filtering')

figure, mesh(freq_Z1_hat_hard)
figure, imshow(Z1_hat_img_hard)

這次可以看到實驗結果有了很明顯的提升,無論從圖像效果,還是2D-DCT頻譜系數上來看均是如此。

有人會問,既然前面一部分已經指出,直接經過硬閾值濾波就可以得到很好的結果,爲什麼這裏要做一次硬閾值濾波,然後放到維納濾波器中進行維納濾波呢?這是因爲,在工程中想要找到區分信號和噪聲的合適閾值很困難,很容易“誤傷”小系數的真實信號,而維納濾波里通過系統函數H可以分成以下三種情況:(1)在信號功率很小的時候噪聲爲主,那麼H幾乎等於零,H與含噪信號係數相乘,含噪信號的係數幾乎等於零,很好抑制噪聲信號;(2)在信號功率很大的時候信號爲主,那麼H幾乎等於一,H與含噪信號係數相乘,信號幾乎不變,信號得到了很好的保留;(3)在噪聲功率和信號功率差不多的時候,這時候信號與噪聲各佔一半,H的數值約等於二分之一,H與含噪信號係數相乘,含噪係數近似恢復到原始信號係數;基於上面三種情況的分析,維納濾波器可以減少信號的“誤傷”,比直接進行硬閾值濾波會有更好的結果,另外維納濾波是一種統計意義上誤差最小的濾波方式。
介紹完了BM3D中要用到的兩種變換域中使用的濾波技巧,我們正式切入正題,介紹BM3D的基本原理。


4.BM3D原理詳述
BM3D全稱Block Matching and 3D collaborative filtering,基於塊匹配的3D協同濾波,算法的中心思想是充分利用自然圖像中豐富的自相似結構來進行圖像降噪。

BM3D降噪算法過程分爲兩個階段,第一個階段稱爲基本估計濾波,第二個階段稱爲最終估計濾波,其流程如下圖所示:

在這裏插入圖片描述

第一階段:
a)塊匹配估計:i)塊匹配分組 ii)3D協同硬閾值濾波
b)聚合加權濾波
第二階段:
a)塊匹配估計:i)塊匹配分組 ii)3D協同維納濾波
b)聚合加權濾波

下面按照流程裏的數據流向,詳細說明BM3D濾波過程

1)第一階段塊匹配:按照劃窗的方式在圖像中搜索與給定圖像塊的相似圖像塊,如果和圖像的相似度高,那麼將其加入到該分組中,如果相似度不高,捨棄,繼續尋找下一個相似的圖像塊,需要特殊說明的是,圖像的相似度與圖像的差異成反相關關係,在相似度比較之前先對圖像塊做一個硬閾值收縮,去掉因爲高頻噪聲帶來的影響,塊匹配的動態過程如下圖所示

在這裏插入圖片描述
在這裏插入圖片描述

2)第一階段3D協同硬閾值濾波:將上一個過程中得到的圖像塊進行3D的正交變換,在變換域中進行硬閾值濾波,然後反變換到空間域中,得到3D協同硬閾值濾波後的圖像塊,然後將濾波後的圖像塊分別放回其圖像原始位置

在這裏插入圖片描述

這裏的3D正交變換充分利用了圖像塊內部的相關性和圖像塊之間的相關性,在上圖中第一二維空間組成的圖像塊內部,一個2D的正交變換揭示了圖像內部的相關性,所有圖像塊經過第一個2D正交變換後,對應位置的像素點沿着第三維串起來,在第三維方向進行1D的正交變換,這個正交變換揭示了圖像塊之間的相關性,充分利用了同一組圖像塊相似來進行係數表示,通過這樣的先2D正交變換再1D正交變換構成的3D正交變換硬閾值濾波,可以很好的抑制圖像的噪聲,同時保留了該組圖像塊中各個圖像塊自身的獨特的細節。

在這裏插入圖片描述

3)第一階段聚合加權濾波:
經過第2)中的3D協同濾波後,將圖像塊放回到其原始的位置,但是由於搜索相似圖像塊的時候,存在圖像塊重疊的情況,如上圖中紅色區域中的幾個圖像塊,彼此之間有重疊區域,那麼重疊區域裏像素點會有不止一個去噪後的結果,到底取哪一個呢,處理這個問題的方法就叫做聚合加權濾波,即對於同一個像素點的不同估計值賦予它們一個權值,取加權平均結果作爲最終的結果。

4)第二階段塊匹配
經過第一階段的基本估計濾波後得到一幅基本估計濾波後的圖像,再對其進行塊匹配估計,得到新的分組,然後在未經去噪的原始含噪圖像的相同位置按照基本濾波後的分組,將原始含噪圖像也進行相同的分組,具體的塊匹配過程與第一階段塊匹配過程相似,這裏便不再贅述,需要說明的是,這裏得到兩個塊匹配分組,一個分組的圖像塊來自第一階段基本估計濾波後的圖像,我們稱之爲a組,另一個分組來自沒有經過任何處理的含噪圖像,我們稱之爲b組。
5)第二階3D協同段維納濾波
在得到第二階段塊匹配的兩個分組後,我們將a組作爲指導圖像塊,當作爲經過噪聲污染的原始圖像,b組圖像當作要去噪的圖像,對兩組分別進行3D正交變換,然後按照文本第三部分介紹的那樣,進行維納濾波,維納濾波後,對b組進行3D反正交變換到空間域圖像塊,並將圖像塊的圖像塊放回其原始位置。
6)第二階段聚合加權濾波
同第一階段聚合加權濾波一樣,這裏對b組的圖像數據進行聚合加權濾波,得到BM3D的最終結果。

仔細分析BM3D的兩個階段濾波細節可知,第一個階段對圖像進行塊匹配,3D協同濾波得到的圖像,並沒有直接貢獻到最終的圖像結果裏,而是濾波後的結果噪聲相對原始噪聲更少,塊匹配的效果更準,從而用來指導第二階段的塊匹配和3D協同濾波中的維納濾波系統函數的權重計算,得到權重後真正參與到協同濾波的像素點還是原始的含噪圖像,3D維納濾波後反變換回到空間域後再對圖像塊進行加權,得到最終去噪結果,因此真正的去噪過程是第二階段,去噪涉及到的技術有變換域的維納濾波和空間域的線性加權。

在這裏插入圖片描述

通過簡單的擴展,就可以將針對灰度圖像濾波的BM3D擴展到針對彩色圖像濾波的C-BM3D,這裏的C代表顏色color。

在這裏插入圖片描述

至此BM3D降噪算法就介紹完畢了。

5.空間域降噪原理詳述
在文章的最後,筆者想囉嗦幾句,介紹一下空間域像素之間進行加權平均能夠達到降噪目的的原因
(1)從空間域加權平均本質上是一個低通濾波器,權重如何分配決定率濾波其的濾波帶塊形狀等性能指標
(2)從隨機變量的角度來看,噪聲信號通常是假設爲獨立同分布的隨機變量,即:
假設有n個像素點參與加權,它們的噪聲分量爲x(i)N(0,σ2),i.i.d,i=1,2,,nx(i)服從N(0,\sigma^2), i.i.d, i=1,2,\cdots,n,權重爲ω1,ω2,,ωn\omega_1,\omega_2,\cdots,\omega_n,且ω1+ω2++ωn=1\omega_1+\omega_2+\cdots+\omega_n=1,那麼x=ω1x(1)+ω2x(2)++ωnx(n)x=\omega_1x(1)+\omega_2x(2)+\cdots+\omega_nx(n)由方差求和公式很容易得到
var(x)=ω12σ2+ω22σ2++ωn2σ2=(ω12+ω22++ωn2)σ2 \begin{aligned} var(x) &=\omega_1^2\sigma^2+\omega_2^2\sigma^2+\cdots+\omega_n^2\sigma^2 \\ &=(\omega_1^2 + \omega_2^2 + \cdots + \omega_n^2)\sigma^2 \end{aligned}
從上式可知經過加權後噪聲的方差變成原來的ω12+ω22++ωn2\omega_1^2+\omega_2^2+\cdots+\omega_n^2,且有ω1+ω2++ωn=1\omega_1+\omega_2+\cdots+\omega_n=1約束條件,這樣的一個優化問題很容易得出,在某個ω=1\omega=1時,其他均爲零,此時只有一個塊或者像素進行加權,它的噪聲方差最大,爲σ2\sigma^2,通過拉格朗日乘子發很容易分析得出,在ω1=ω2==ωn=1n\omega_1=\omega_2=\cdots=\omega_n=\frac{1}{n}時n個圖像塊或者像素點進行加權,噪聲方差最小,變成1nσ2\frac{1}{n}\sigma^2,由這個數學過程分析,在採用空間域圖像去噪時,需要儘可能搜索到相似的圖像塊或者像素點進行加權,這樣彼此的權重接近,得到的加權結果噪聲方差最小,圖像效果更佳。

6.再談3D降噪(3DNR)
從概率論的獨立重複實驗說起,比如我們統計扔一個骰子點數爲1的概率是多少,我們可以讓一個人扔一萬次,然後統計結果中點數爲1的個數,從而計算出扔骰子點數爲1的概率(大數定律意義下),另一種方法是讓1000個人,每人扔十次骰子,然後統計點數爲1的概率;從上面兩個實驗中可以看出,我們要得到一個隨機事件的很多樣本,可以讓這個事件採用實驗的方法,讓隨機事件重複N次,得到統計規律,也可以構造很多m個相同的隨機實驗,然後每個隨機試驗重複N/m次,這樣從整體上來看,總體上也是相同的隨機事件重複了N,得到的統計規律和前面的結論一致。
回到我們要說的圖像去噪,我們知道含噪圖像信號是由一個確定不變的圖像信號和一個噪聲隨機變量的和,那麼我們觀測到的圖像信號本身也是一個隨機變量,我們想通過加權的方法得到真實的信號,那麼我們就需要這個隨機變量的N個樣本。這樣的樣本從哪裏得到了,一種方法就是對圖像進行N次觀測,這種方法就對應了我們在工程上採用的多幀相同曝光圖像進行融合的3D降噪算法,這種方法類似於一個人做了N次獨立重複實驗;另一種方法就是在本身裏面去尋找相同的圖像塊,它的一種實現方法就是本文中提到的BM3D,這種方法近似類比於N個人,每個人做了一次獨立重複實驗。


參考文獻

  1. Kostadin Dabov, Alessandro Foi, Vladimir Kathovnik, Karen Egiazarian, “Image denoising by sparse 3D transform-domain collaborative filtering”, IEEE Transaction on Image Processing, Vol. 16, No. 8. August 2007
  2. http://www.cs.tut.fi/~foi/GCF-BM3D/
  3. 胡廣書,數字信號處理----理論、算法與實現,第三版,2012
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章