您好,登錄后才能下訂單哦!
在早先的章節(jié)里,我們看到很多圖像平滑技術(shù)如高斯模糊,Median模糊等,它們?cè)谝瞥龜?shù)量小的噪音時(shí)在某種程度上比較好用。在這些技術(shù)里,我們?nèi)∠袼刂車囊恍〔糠粥従樱鲆恍╊愃朴诟咚蛊骄鶛?quán)重,中值等替換掉中間的元素。簡(jiǎn)單說(shuō),移除一個(gè)像素的噪音是基于本地鄰居的。
噪音有一個(gè)屬性,噪音一般被認(rèn)為是具有零平均值的隨機(jī)變量。假設(shè)一個(gè)像素噪音,p = p0 + n, 其中p0是像素的真實(shí)值,n是那個(gè)像素的噪音。你可以從不同圖像取大量的同一個(gè)像素(N)并計(jì)算他們的平均值,理想情況下,你應(yīng)該得到p=p0,因?yàn)榫凳?.
你可以自己通過(guò)一個(gè)簡(jiǎn)單例子驗(yàn)證一下。保持一個(gè)靜止的攝像機(jī)對(duì)準(zhǔn)一個(gè)位置多呆幾秒,這會(huì)給你很多幀,或者是對(duì)一個(gè)場(chǎng)景的很多圖像。然后寫(xiě)一些代碼來(lái)找到視頻里所有幀的平均值。比較最終的結(jié)果和第一幀。你可以看到噪點(diǎn)被去掉了。不幸的是這個(gè)簡(jiǎn)單的方法對(duì)于攝像機(jī)和場(chǎng)景的運(yùn)動(dòng)來(lái)說(shuō)就不健壯了。而且經(jīng)常你也只有一個(gè)噪音圖像可用。
Image Denoising
OpenCV提供了這種技術(shù)的四種變體。
Common arguments:
cv2.fastNlMeansDenoisingColored()
如上所述,它用于從彩色圖像中去除噪聲。 (噪音預(yù)計(jì)是高斯噪音)
import numpy as np import cv2 import matplotlib.pyplot as plt img = cv2.imread('img.jpg') dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21) plt.subplot(121),plt.imshow(img) plt.subplot(122),plt.imshow(dst) plt.show()
cv2.fastNlMeansDenoisingMulti()
現(xiàn)在我們將相同的方法應(yīng)用于視頻。 第一個(gè)參數(shù)是嘈雜幀的列表。 第二個(gè)參數(shù)imgToDenoiseIndex指定我們需要去噪的幀,因?yàn)槲覀冊(cè)谳斎肓斜碇袀鬟f了frame的索引。 第三個(gè)是temporalWindowSize,它指定了用于去噪的附近幀的數(shù)量。 在這種情況下,使用總共temporalWindowSize幀,其中中心幀是要去噪的幀。 例如,傳遞了5個(gè)幀的列表作為輸入。 設(shè)imgToDenoiseIndex = 2和temporalWindowSize = 3.然后使用frame-1,frame-2和frame-3對(duì)幀-2進(jìn)行去噪
import numpy as np import cv2 import matplotlib.pyplot as plt cap = cv2.VideoCapture('test.mp4') # create a list of first 5 frames img = [cap.read()[1] for i in range(5)] # convert all to grayscale gray = [cv2.cvtColor(i, cv2.COLOR_BGR2GRAY) for i in img] # convert all to float64 gray = [np.float64(i) for i in gray] # create a noise of variance 25 noise = np.random.randn(*gray[1].shape)*10 # Add this noise to images noisy = [i+noise for i in gray] # Convert back to uint8 noisy = [np.uint8(np.clip(i,0,255)) for i in noisy] # 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.subplot(132),plt.imshow(noisy[2],'gray') plt.subplot(133),plt.imshow(dst,'gray') plt.show()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。