Python,OpenCV中的非局部均值去噪(Non-Local Means Denoising)
生活随笔
收集整理的這篇文章主要介紹了
Python,OpenCV中的非局部均值去噪(Non-Local Means Denoising)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python,OpenCV中的非局部均值去噪(Non-Local Means Denoising)
- 1. 效果圖
- 2. 原理
- 3. 源碼
- 2.1 單彩色圖去噪
- 2.2 多連續彩色幀去噪
- 參考
這篇博客將介紹不同的計算攝影技術——非局部均值去噪(Non-Local Means Denoising),以去除圖像中的噪聲。OpenCV提供了4個方法實現該算法;
- cv2.FastNLMeansDeoising() 適用于單個灰度圖像
- cv2.FastNLMeansDeoisingColor() 適用于彩色圖像。
- cv2.fastNlMeansDenoisingMulti() 適用于短時間內捕獲的圖像序列(灰度圖像)
- cv2.fastNlMeansDenoisingColoredMulti() 適用于短時間內捕獲的圖像序列(彩色圖像)
1. 效果圖
原圖 VS 彩色圖像去噪效果圖1如下:
原圖 VS 彩色圖像去噪效果圖2如下:
可以看到去噪的效果圖右看起來更加磨皮美白了,穎寶更加動人了。
對彩色圖像序列幀進行去噪,原圖灰度圖 VS 噪音圖 VS 去噪效果圖1如下:
可能因為圖像的原因,看著不是很明顯~
對彩色圖像序列幀進行去噪,原圖灰度圖 VS 噪音圖 VS 去噪效果圖2如下:
用自己的數據集,效果看起來也基本差不多~
2. 原理
-
前邊學習幾種圖像平滑方法:如高斯模糊,均值模糊,中值模糊,它們在一定程度上很好地去除了少量的噪聲。 這些技術在一個像素周圍選取一個小鄰域,并進行一些操作,如高斯加權平均、值的均值、中值等,以替換中心元素。簡言之,像素處的噪聲消除是其鄰近區域的局部問題。
-
與之前看到的模糊技術相比,非局部均值去噪需要更多的時間,但效果非常好。
-
非局部均值去噪需要一組相似的圖像來平均噪聲。考慮圖像中的一個小窗口(比如說5x5窗口)。同一補丁可能在圖像中的其他地方的可能性很大。
-
對于彩色圖像,非局部均值去噪將圖像轉換為CIELAB顏色空間,然后分別對L和AB分量進行去噪。
- h:決定過濾器強度的參數。較高的h值可以更好地去除噪聲,但也可以去除圖像的細節(建議10)
- hForColorComponents:與h相同,但僅適用于彩色圖像(通常與h相同)
- TemplateWindowsSize: 應該是奇數(建議7)
- SearchWindowsSize: 應該是奇數(建議21)
3. 源碼
2.1 單彩色圖去噪
# 圖像去噪:非局部均值去噪(Non-Local MeansDenoising)# 前面已經學習了許多圖像平滑技術,如高斯模糊、均值模糊、中值模糊等,它們在一定程度上很好地去除了少量的噪聲。
# 這些技術在一個像素周圍選取一個小鄰域,并進行一些操作,如高斯加權平均、值的中值等,以替換中心元素。簡言之,像素處的噪聲消除是其鄰近區域的局部問題。
# 需要一組相似的圖像來平均噪聲??紤]圖像中的一個小窗口(比如說5x5窗口)。同一補丁可能在圖像中的其他地方的可能性很大。# 與之前看到的模糊技術相比,它需要更多的時間,但效果非常好。
# 對于彩色圖像,將圖像轉換為CIELAB顏色空間,然后分別對L和AB分量進行去噪。# 對單個彩色圖像進行去噪
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('images/ml.jpg')dst = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.xticks([]), plt.yticks([]), plt.title("origin")
plt.subplot(122), plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
plt.xticks([]), plt.yticks([]), plt.title("dst")
plt.show()
2.2 多連續彩色幀去噪
# 對彩色圖像序列幀進行去噪
import cv2
import numpy as np
from matplotlib import pyplot as pltcap = cv2.VideoCapture('images/Megamind.avi')# 對前5幀創建一個lsit
img = [cap.read()[1] for i in range(5)]# 均轉換為灰度圖
gray = [cv2.cvtColor(i, cv2.COLOR_BGR2GRAY) for i in img]# 轉換為float64
gray = [np.float64(i) for i in gray]# 填充一些噪聲點 create a noise of variance 25
noise = np.random.randn(*gray[1].shape) * 10# 添加噪聲到圖像中
noisy = [i + noise for i in gray]# 轉換為圖像uint8
noisy = [np.uint8(np.clip(i, 0, 255)) for i in noisy]# 考慮5幀圖像,對第2幀進行去噪,Denoise 3rd frame considering all the 5 frames
dst = cv2.fastNlMeansDenoisingMulti(noisy, 2, 5, None, 4, 7, 35)plt.subplot(131), plt.imshow(gray[2], 'gray')
plt.xticks([]), plt.yticks([]), plt.title("origin")plt.subplot(132), plt.imshow(noisy[2], 'gray')
plt.xticks([]), plt.yticks([]), plt.title("noise")plt.subplot(133), plt.imshow(dst, 'gray')
plt.xticks([]), plt.yticks([]), plt.title("dst")
plt.show()
參考
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_photo/py_table_of_contents_photo/py_table_of_contents_photo.html#py-table-of-content-photo
總結
以上是生活随笔為你收集整理的Python,OpenCV中的非局部均值去噪(Non-Local Means Denoising)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python采用Basemap绘制完美中
- 下一篇: Postgresql:删除及查询字段中包