Programming Computer Vision with Python (學習筆記八)

圖像去噪(Image Denoising)的過程就是將噪點從圖像中去除的同時儘量的保留原圖像的細節和結構。這裏講的去噪跟前面筆記提過的去噪不同,這裏是指高級去噪技術,前面提過的高斯平滑也能去噪,但高斯平滑去噪的同時也把邊緣模糊化了,另外使用形態學的方法去噪是指去除一些粗的椒鹽噪聲。對於一幅密佈噪點的圖像,若是使其變得清晰又保留邊緣細節,這是高級去噪技術所要解決的問題。html

全變差

全變差去噪(Total variation denoising)是一種經常使用的去噪模型。全變差(或叫總變差)大概是指圖像梯度的範數(norm)的積分。
一幅圖像的細節(噪聲或是干擾的沒必要要的)過多,全變差的值越高,因此讓全變差最小化,去掉噪聲和沒用細節的同時,保留邊緣等主要細節,正是這種模型的處理思想。用這種去噪技術產生的圖像有點接近卡通的感受。
下面要介紹的Chambolle去噪算法就是基於全變差去噪模型實現的。python

chambolle去噪

scipy.ndimage模塊只是提供了基本的圖像處理方法,並無提供Chambolle去噪函數,因此就要藉助另外一個庫——scikit-image。算法

scikit-image
scikit-image(簡稱skimage)庫是從scipy.ndimage擴展下來的,提供了更豐富的圖像處理函數,去噪函數除了Chambolle還有Bilateral算法,好比邊緣檢測還有之前簡單提過的Canny算子濾波器。
它也是由 SciPy 社區所開發的,能夠跟NumPy等完美配合。segmentfault

安裝:函數

sudo apt-get install python-skimage

函數說明:學習

skimage.restoration.denoise_tv_chambolle(im, weight=50, eps=0.0002, n_iter_max=200, multichannel=False)
im: ndarray類型,2維或3維
weight:越大去噪越多,但圖像也會越失真
multichannel:對彩色圖像而言,true表示對每一通道去噪

返回去噪後的圖像,ndarray類型。

下面我用看具體的例子,將chambolle和高斯平滑進行對比:spa

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import filters
from skimage.filter import denoise_tv_chambolle  #for versoin: 0.9.3
#from skimage.restoration import denoise_tv_chambolle  #for new version

im = np.array(Image.open('noising.jpg').convert('L'))

index = 221
plt.subplot(index)
plt.gray()
plt.imshow(im)
plt.axis('off')
plt.title("original")

chdnim = denoise_tv_chambolle(im, weight=0.2)
plt.subplot(index+1)
plt.imshow(chdnim)
plt.axis('off')
plt.title("chambolle weight=0.2")

gs2dnim = filters.gaussian_filter(im, sigma=2)
plt.subplot(index+2)
plt.imshow(gs2dnim)
plt.axis('off')
plt.title("gaussion sigma=2")

gs3dnim = filters.gaussian_filter(im, sigma=3)

plt.subplot(index+3)
plt.imshow(gs3dnim)
plt.axis('off')
plt.title("gaussion sigmal=3")

plt.show()

效果對好比下:
圖片描述3d

明顯感受使用chambolle的效果要比高斯平滑好不少。rest

Bilateral濾波器
Bilateral濾波器跟以前介紹過的高斯模糊運算過程類似,並且它也使用了高斯核,但它的特色是在對圖像進行平滑的同時能保留邊緣。由於它在平滑濾波時同時考慮了像素間的幾何距離和色彩距離。具體點說,若是要處理的像素與鄰近像素的歐式距離比較大(即像素值相差比較大)時,那麼這些鄰近像素的權重就比較小,從而使得對濾波後的新像素值影響較小。另外,每一個濾波後像素點的值,受與他色彩相近而且距離較近的像素點的影響較大,這兩種權值分配方法起到了保護邊緣的做用。code

Bilateral去噪函數:

skimage.restoration.denoise_bilateral(image, win_size=5, sigma_range=None, sigma_spatial=1, bins=10000, mode='constant', cval=0)

示例:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import filters
from skimage.filter import denoise_bilateral  #for versoin: 0.9.3
#from skimage.restoration import denoise_bilateral  #for new version

im = np.array(Image.open('noising.jpg').convert('L'))

index = 221
plt.subplot(index)
plt.gray()
plt.imshow(im)
plt.axis('off')
plt.title("original")

plt.subplot(index+1)
plt.imshow(denoise_bilateral(im))
plt.axis('off')
plt.title("default")

plt.subplot(index+2)
plt.imshow(denoise_bilateral(im, sigma_range=0.2, sigma_spatial=10))
plt.axis('off')
plt.title("0.2/10")

plt.subplot(index+3)
plt.imshow(denoise_bilateral(im, sigma_range=0.8, sigma_spatial=10))
plt.axis('off')
plt.title("0.8/10")

plt.show()

效果如圖:
圖片描述

感受比高斯平滑要好一些,但比Chambolle仍是要遜色很多。

小結

因全變差的數學原理比較高深,因此暫時沒去研究,只大概瞭解下並使用skimage庫的接口進行了一番對比,結論就是使用chambolle去噪效果很是好。

至此,書中第一章的內容結束了。後面將開始下一章節的內容學習——圖像描述。

你還能夠查看個人其它筆記

參考資料

scikit-image.org
scikit denoising example
Bilateral Filtering

相關文章
相關標籤/搜索