方框?yàn)V波(Box Filtering)是一種簡單的圖像平滑處理方法,它主要用于去除圖像中的噪聲和減少細(xì)節(jié),同時(shí)保持圖像的整體亮度分布。
方框?yàn)V波的原理很簡單:對于圖像中的每個(gè)像素,將其周圍的一個(gè)固定大小的鄰域內(nèi)的像素值取平均,然后將這個(gè)平均值賦值給當(dāng)前像素。這個(gè)鄰域通常是一個(gè)正方形,稱為方框或窗口。方框?yàn)V波相當(dāng)于用一個(gè)均值濾波器對圖像進(jìn)行濾波。
與均值濾波的不同在于,方框?yàn)V波不會(huì)計(jì)算像素均值。
在均值濾波中,濾波結(jié)果的像素值是任意一個(gè)點(diǎn)的鄰域平均值,等于各鄰域像素值之和除以鄰域面積。
而在方框?yàn)V波中,可以自由選擇是否對均值濾波的結(jié)果進(jìn)行歸一化,即可以自由選擇濾波結(jié)果是鄰域像素值之和的平均值,還是鄰域像素值之和。
我們以 5×5 的鄰域?yàn)槔?,在進(jìn)行方框?yàn)V波時(shí),如果計(jì)算的是鄰域像素值的均值,則濾波關(guān)系如圖 7-15 所示。
仍然以 5×5 的鄰域?yàn)槔谶M(jìn)行方框?yàn)V波時(shí),如果計(jì)算的是鄰域像素值之和,則濾波關(guān)系
如圖 7-16 所示。
根據(jù)上述關(guān)系,如果計(jì)算的是鄰域像素值的均值,則使用的卷積核為:
如果計(jì)算的是鄰域像素值之和,則使用的卷積核為:
在 OpenCV 中,實(shí)現(xiàn)方框?yàn)V波的函數(shù)是 cv2.boxFilter()
,其語法格式為:
dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType
)
式中:
? dst 是返回值,表示進(jìn)行方框?yàn)V波后得到的處理結(jié)果。
? src 是需要處理的圖像,即原始圖像。它能夠有任意數(shù)量的通道,并能對各個(gè)通道獨(dú)立處理。圖像深度應(yīng)該是 CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F 中的一種。
? ddepth 是處理結(jié)果圖像的圖像深度,一般使用-1 表示與原始圖像使用相同的圖像深度。
? ksize 是濾波核的大小。濾波核大小是指在濾波處理過程中所選擇的鄰域圖像的高度和寬度。
例如,濾波核的值可以為(3,3),表示以 3×3 大小的鄰域均值作為圖像均值濾波處理的結(jié)果,如下式所示。
? anchor 是錨點(diǎn),其默認(rèn)值是(-1, -1),表示當(dāng)前計(jì)算均值的點(diǎn)位于核的中心點(diǎn)位置。
該值使用默認(rèn)值即可,在特殊情況下可以指定不同的點(diǎn)作為錨點(diǎn)。
? normalize 表示在濾波時(shí)是否進(jìn)行歸一化(這里指將計(jì)算結(jié)果規(guī)范化為當(dāng)前像素值范圍內(nèi)的值)處理,該參數(shù)是一個(gè)邏輯值,可能為真(值為 1)或假(值為 0)。
? 當(dāng)參數(shù) normalize=1 時(shí),表示要進(jìn)行歸一化處理,要用鄰域像素值的和除以面積。
? 當(dāng)參數(shù) normalize=0 時(shí),表示不需要進(jìn)行歸一化處理,直接使用鄰域像素值的和。
通常情況下,針對方框?yàn)V波,卷積核可以表示為:
上述對應(yīng)關(guān)系為:
例如,針對 5×5 鄰域,當(dāng)參數(shù) normalize=1 時(shí),要進(jìn)行歸一化處理,此時(shí)計(jì)算的就是均值濾波。
這種情況下,函數(shù) cv2.boxFilter()和函數(shù) cv2.blur()的作用是一樣的。
此時(shí),對應(yīng)的卷積核為:
同樣針對 5×5 鄰域,當(dāng)參數(shù) normalize=0 時(shí),不進(jìn)行歸一化處理,此時(shí)濾波計(jì)算的是鄰域像素值之和,使用的卷積核是:
當(dāng) normalize=0 時(shí),因?yàn)椴贿M(jìn)行歸一化處理,因此濾波得到的值很可能超過當(dāng)前像素值范圍的最大值,從而被截?cái)酁樽畲笾怠?/p>
這樣,就會(huì)得到一幅純白色的圖像。
? borderType 是邊界樣式,該值決定了以何種方式處理邊界。
通常情況下,在使用方框?yàn)V波函數(shù)時(shí),對于參數(shù) anchor、normalize 和 borderType,直接采
用其默認(rèn)值即可。因此,函數(shù) cv2.boxFilter()的常用形式為:
dst = cv2.boxFilter( src, ddepth, ksize )
實(shí)驗(yàn)1: 針對噪聲圖像,對其進(jìn)行方框?yàn)V波,顯示濾波結(jié)果
代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-631034.html
import cv2
o=cv2.imread("lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5))
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
運(yùn)行結(jié)果:
在本例中,方框?yàn)V波函數(shù)對 normalize 參數(shù)使用了默認(rèn)值。在默認(rèn)情況下,該值為 1,表示要進(jìn)行歸一化處理。也就是說,本例中使用的是 normalize 為默認(rèn)值 True 的 cv2.boxFilter()函數(shù),
此時(shí)它和函數(shù) cv2.blur()的濾波結(jié)果是完全相同的。如圖 所示,左圖是原始圖像,右圖是方框?yàn)V波結(jié)果圖像
實(shí)驗(yàn)2:針對噪聲圖像,在方框?yàn)V波函數(shù) cv2.boxFilter()內(nèi)將參數(shù) normalize 的值設(shè)置為 0,顯示濾波處理結(jié)果。
代碼如下:
import cv2
o=cv2.imread("lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
在本例中,沒有對圖像進(jìn)行歸一化處理。在進(jìn)行濾波時(shí),計(jì)算的是 5×5 鄰域的像素值之和,圖像的像素值基本都會(huì)超過當(dāng)前像素值的最大值 255。因此,最后得到的圖像接近純白色,部分點(diǎn)處有顏色。部分點(diǎn)有顏色是因?yàn)檫@些點(diǎn)周邊鄰域的像素值均較小,鄰域像素值在相加后仍然小于 255。
此時(shí)的圖像濾波結(jié)果如圖所示,左圖是原始圖像,右圖是方框?yàn)V波后得到的處理結(jié)果
實(shí)驗(yàn)3:針對噪聲圖像,使用方框?yàn)V波函數(shù) cv2.boxFilter()去噪,將參數(shù) normalize 的值設(shè)置為 0,將卷積核的大小設(shè)置為 2×2,顯示濾波結(jié)果
代碼如下:
import cv2
o=cv2.imread("lenaNoise.png")
r=cv2.boxFilter(o,-1,(2,2),normalize=0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
在本例中,卷積核大小為 2×2,參數(shù) normalize=0。因此,本例中方框?yàn)V波計(jì)算的是 2×2鄰域的像素值之和,四個(gè)像素值的和不一定大于 255,因此在計(jì)算結(jié)果圖像中有部分像素點(diǎn)不是白色。如圖 所示,左圖是原始圖像,右圖是方框?yàn)V波處理結(jié)果。文章來源地址http://www.zghlxwxcb.cn/news/detail-631034.html
到了這里,關(guān)于opencv 31-圖像平滑處理-方框?yàn)V波cv2.boxFilter()的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!