Programming Computer Vision with Python (学习笔记八)
圖像去噪(Image Denoising)的過程就是將噪點(diǎn)從圖像中去除的同時(shí)盡可能的保留原圖像的細(xì)節(jié)和結(jié)構(gòu)。這里講的去噪跟前面筆記提過的去噪不一樣,這里是指高級(jí)去噪技術(shù),前面提過的高斯平滑也能去噪,但高斯平滑去噪的同時(shí)也把邊緣模糊化了,另外使用形態(tài)學(xué)的方法去噪是指去除一些粗的椒鹽噪聲。對(duì)于一幅密布噪點(diǎn)的圖像,如果使其變得清晰又保留邊緣細(xì)節(jié),這是高級(jí)去噪技術(shù)所要解決的問題。
全變差
全變差去噪(Total variation denoising)是一種常用的去噪模型。全變差(或叫總變差)大概是指圖像梯度的范數(shù)(norm)的積分。
一幅圖像的細(xì)節(jié)(噪聲或是干擾的不必要的)過多,全變差的值越高,所以讓全變差最小化,去掉噪聲和沒用細(xì)節(jié)的同時(shí),保留邊緣等主要細(xì)節(jié),正是這種模型的處理思想。用這種去噪技術(shù)產(chǎn)生的圖像有點(diǎn)接近卡通的感覺。
下面要介紹的Chambolle去噪算法就是基于全變差去噪模型實(shí)現(xiàn)的。
chambolle去噪
scipy.ndimage模塊只是提供了基本的圖像處理方法,并沒有提供Chambolle去噪函數(shù),所以就要借助另一個(gè)庫(kù)——scikit-image。
scikit-image
scikit-image(簡(jiǎn)稱skimage)庫(kù)是從scipy.ndimage擴(kuò)展下來的,提供了更豐富的圖像處理函數(shù),去噪函數(shù)除了Chambolle還有Bilateral算法,比如邊緣檢測(cè)還有以前簡(jiǎn)單提過的Canny算子濾波器。
它也是由 SciPy 社區(qū)所開發(fā)的,可以跟NumPy等完美配合。
安裝:
sudo apt-get install python-skimage函數(shù)說明:
skimage.restoration.denoise_tv_chambolle(im, weight=50, eps=0.0002, n_iter_max=200, multichannel=False) im: ndarray類型,2維或3維 weight:越大去噪越多,但圖像也會(huì)越失真 multichannel:對(duì)彩色圖像而言,true表示對(duì)每一通道去噪返回去噪后的圖像,ndarray類型。下面我用看具體的例子,將chambolle和高斯平滑進(jìn)行對(duì)比:
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 versionim = 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() 效果對(duì)比如下:
明顯感覺使用chambolle的效果要比高斯平滑好很多。
Bilateral濾波器
Bilateral濾波器跟之前介紹過的高斯模糊運(yùn)算過程相似,而且它也使用了高斯核,但它的特點(diǎn)是在對(duì)圖像進(jìn)行平滑的同時(shí)能保留邊緣。因?yàn)樗谄交瑸V波時(shí)同時(shí)考慮了像素間的幾何距離和色彩距離。具體點(diǎn)說,如果要處理的像素與鄰近像素的歐式距離比較大(即像素值相差比較大)時(shí),那么這些鄰近像素的權(quán)重就比較小,從而使得對(duì)濾波后的新像素值影響較小。另外,每個(gè)濾波后像素點(diǎn)的值,受與他色彩相近并且距離較近的像素點(diǎn)的影響較大,這兩種權(quán)值分配方法起到了保護(hù)邊緣的作用。
Bilateral去噪函數(shù):
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 versionim = 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還是要遜色不少。
小結(jié)
因全變差的數(shù)學(xué)原理比較高深,所以暫時(shí)沒去研究,只大概了解下并使用skimage庫(kù)的接口進(jìn)行了一番對(duì)比,結(jié)論就是使用chambolle去噪效果非常好。
至此,書中第一章的內(nèi)容結(jié)束了。后面將開始下一章節(jié)的內(nèi)容學(xué)習(xí)——圖像描述。
你還可以查看我的其它筆記。
參考資料
scikit-image.org
scikit denoising example
Bilateral Filtering
總結(jié)
以上是生活随笔為你收集整理的Programming Computer Vision with Python (学习笔记八)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Programming Computer
- 下一篇: Programming Computer