图像处理之图像平滑
圖像平滑
本節(jié)主要知識(shí)點(diǎn):
- 使用各種低通濾鏡模糊圖像
- 將定制的濾鏡應(yīng)用于圖像(2D卷積)
1.2D卷積(圖像過濾)
與一維信號(hào)一樣,還可以使用各種低通濾波器(LPF),高通濾波器(HPF)等對(duì)圖像進(jìn)行濾波。LPF有助于消除噪聲,使圖像模糊等。HPF濾波器有助于在圖像中找到邊緣。
OpenCV提供了一個(gè)函數(shù)cv.filter2D來將內(nèi)核與圖像進(jìn)行卷積。例如,我們將嘗試對(duì)圖像進(jìn)行平均濾波。5x5平均濾波器內(nèi)核如下所示:
K=125[1111111111111111111111111]K = \frac{1}{25} \begin{bmatrix} 1 & 1 & 1 & 1 & 1 \ 1 & 1 & 1 & 1 & 1 \ 1 & 1 & 1 & 1 & 1 \ 1 & 1 & 1 & 1 & 1 \ 1 & 1 & 1 & 1 & 1 \end{bmatrix} K=251?[1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?1?]
操作如下:保持這個(gè)內(nèi)核在一個(gè)像素上,將所有低于這個(gè)內(nèi)核的25個(gè)像素相加,取其平均值,然后用新的平均值替換中心像素。它將對(duì)圖像中的所有像素繼續(xù)此操作。試試這個(gè)代碼,并檢查結(jié)果:
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('opencv_logo.png') kernel = np.ones((5,5),np.float32)/25 dst = cv.filter2D(img,-1,kernel) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(dst),plt.title('Averaging') plt.xticks([]), plt.yticks([]) plt.show()運(yùn)行結(jié)果:
2.圖像模糊
通過將圖像與低通濾波器內(nèi)核進(jìn)行卷積來實(shí)現(xiàn)圖像模糊。這對(duì)于消除噪音很有用。它實(shí)際上從圖像中消除了高頻部分(例如噪聲,邊緣)。因此,在此操作中邊緣有些模糊。(有一些模糊技術(shù)也可以不模糊邊緣)。OpenCV主要提供四種類型的模糊技術(shù)。
1.平均
這是通過將圖像與歸一化框?yàn)V鏡進(jìn)行卷積來完成的。它僅獲取內(nèi)核區(qū)域下所有像素的平均值,并替換中心元素。這是通過功能cv.blur()或cv.boxFilter()完成的。檢查文檔以獲取有關(guān)內(nèi)核的更多詳細(xì)信息。我們應(yīng)該指定內(nèi)核的寬度和高度。3x3歸一化框式過濾器如下所示:
K=19[111111111]K = \frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \ 1 & 1 & 1 \ 1 & 1 & 1 \end{bmatrix} K=91?[1?1?1?1?1?1?1?1?1?]
注意 如果您不想使用標(biāo)準(zhǔn)化的框式過濾器,請(qǐng)使用cv.boxFilter()。將參數(shù)normalize = False傳遞給函數(shù)。
查看下面的示例演示,其內(nèi)核大小為5x5:
import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('opencv-logo-white.png') blur = cv.blur(img,(5,5)) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()運(yùn)行結(jié)果:
2.高斯模糊
在這種情況下,代替盒式濾波器,使用了高斯核。這是通過功能cv.GaussianBlur() 完成的。我們應(yīng)指定內(nèi)核的寬度和高度,該寬度和高度應(yīng)為正數(shù)和奇數(shù)。我們還應(yīng)指定X和Y方向的標(biāo)準(zhǔn)偏差,分別為sigmaX和sigmaY。如果僅指定sigmaX,則將sigmaY與sigmaX相同。如果兩個(gè)都為零,則根據(jù)內(nèi)核大小進(jìn)行計(jì)算。高斯模糊對(duì)于從圖像中去除高斯噪聲非常有效。
如果需要,可以使用函數(shù)cv.getGaussianKernel() 創(chuàng)建高斯內(nèi)核。
可以修改以上代碼以實(shí)現(xiàn)高斯模糊:
blur = cv.GaussianBlur(img,(5,5),0)運(yùn)行結(jié)果:
3.中位模糊
在這里,函數(shù)cv.medianBlur() 提取內(nèi)核區(qū)域下所有像素的中值,并將中心元素替換為該中值。這對(duì)于消除圖像中的椒鹽噪聲非常有效。有趣的是,在上述過濾器中,中心元素是新計(jì)算的值,該值可以是圖像中的像素值或新值。但是在中值模糊中,中心元素總是被圖像中的某些像素值代替。有效降低噪音。其內(nèi)核大小應(yīng)為正奇數(shù)整數(shù)。
在此演示中,我向原始圖像添加了50%的噪聲并應(yīng)用了中值模糊。檢查結(jié)果:
median = cv.medianBlur(img,5)
4.雙邊濾波
cv.bilateralFilter() 在去除噪聲的同時(shí)保持邊緣清晰銳利非常有效。但是,與其他過濾器相比,該操作速度較慢。我們已經(jīng)看到,高斯濾波器采用像素周圍的鄰域并找到其高斯加權(quán)平均值。高斯濾波器僅是空間的函數(shù),也就是說,濾波時(shí)會(huì)考慮附近的像素。它不考慮像素是否具有幾乎相同的強(qiáng)度。它不考慮像素是否是邊緣像素。因此它也模糊了邊緣,這是我們不想做的。
雙邊濾波器在空間中也采用高斯濾波器,但是又有一個(gè)高斯濾波器,它是像素差的函數(shù)。空間的高斯函數(shù)確保僅考慮附近像素的模糊,而強(qiáng)度差的高斯函數(shù)確保僅考慮強(qiáng)度與中心像素相似的那些像素的模糊。由于邊緣的像素強(qiáng)度變化較大,因此可以保留邊緣。
以下示例顯示了使用雙邊過濾器。
blur = cv.bilateralFilter(img,9,75,75)
可以看到,此時(shí)表面上的紋理消失了,但是邊緣仍然保留。
總結(jié)
- 上一篇: 外国小哥,把整个 CNN 都给可视化了,
- 下一篇: 最优频带分配方案