OpenCV實(shí)現(xiàn)圖像平滑處理的方法匯總
本文是OpenCV圖像視覺入門之路的第10篇文章,本文詳細(xì)的在圖像上面進(jìn)行了圖像均值濾波、方框?yàn)V波 、高斯濾波、中值濾波、雙邊濾波、2D卷積等操作。
1 均值濾波
OpenCV 中的簡單濾波(例如均值濾波或中值濾波)可能會使圖像變得模糊,因?yàn)樗鼈儠交瑘D像中的細(xì)節(jié)和邊緣。如果濾波的程度過強(qiáng),則可能會導(dǎo)致圖像失真,使其看起來更差。因此,濾波的程度需要適當(dāng)?shù)乜刂疲垣@得最佳效果。
import cv2 import numpy as np from numpy import unicode if __name__ == '__main__': img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) # 均值濾波 # 簡單的平均卷積操作 img_blur1 = cv2.blur(img1, (3, 3)) # 使用3*3的卷積核 img_blur2 = cv2.blur(img1, (30, 30)) # 使用30*30的卷積核 cv2.imshow("blur1", img_blur1) # 顯示疊加圖像 dst cv2.imshow("blur2", img_blur2) # 顯示疊加圖像 dst cv2.imshow("image", img1) # 顯示疊加圖像 dst cv2.waitKey(0) cv2.destroyAllWindows()
2 方框?yàn)V波
方框?yàn)V波是一種圖像平滑技術(shù),在 OpenCV 中可以使用。方框?yàn)V波的主要作用是對圖像進(jìn)行去噪和平滑處理,使圖像變得更加平滑,減少圖像的鋸齒狀、噪聲等不規(guī)則的部分。在圖像處理中,方框?yàn)V波通常作為預(yù)處理步驟,以提高圖像的質(zhì)量和處理效果。
import cv2 import numpy as np from numpy import unicode if __name__ == '__main__': img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) # 方框?yàn)V波 # 基本和均值一樣,可以選擇歸一化 img_box1 = cv2.boxFilter(img1, -1, (3, 3), normalize=True) img_box2 = cv2.boxFilter(img1, -1, (2, 2), normalize=False) cv2.imshow("box1", img_box1) # 顯示疊加圖像 dst cv2.imshow("box2", img_box2) # 顯示疊加圖像 dst cv2.imshow("image", img1) # 顯示疊加圖像 dst cv2.waitKey(0) cv2.destroyAllWindows()
3 高斯濾波
高斯濾波是圖像處理中一種常用的平滑處理方法。在使用OpenCV處理圖像時(shí),高斯濾波可以用于減少圖像中的噪聲和模糊不清的細(xì)節(jié)。此外,它還可以用于圖像的邊緣檢測和圖像分割,因?yàn)楦咚篂V波能夠保留圖像的主要特征,同時(shí)去除小的干擾。
import cv2 import numpy as np from numpy import unicode if __name__ == '__main__': img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) # 高斯濾波 # 高斯模糊的卷積核里的數(shù)值是滿足高斯分布,相當(dāng)于更重視中間的 img_aussian1 = cv2.GaussianBlur(img1, (5, 5), 0, 0) img_aussian2 = cv2.GaussianBlur(img1, (5, 5), 13, 13) cv2.imshow("aussian1", img_aussian1) # 顯示疊加圖像 dst cv2.imshow("aussian2", img_aussian2) # 顯示疊加圖像 dst cv2.imshow("image", img1) # 顯示疊加圖像 dst cv2.waitKey(0) cv2.destroyAllWindows()
4 中值濾波
OpenCV 中值濾波是一種圖像去噪方法,它通過在圖像上選擇一個(gè)掩碼,并將其中的每個(gè)像素與周圍像素值進(jìn)行比較,以計(jì)算該像素的新值。新值是該像素周圍像素值的中位數(shù)。這樣,中值濾波能夠有效去除圖像中的噪聲和椒鹽噪聲,使圖像更清晰、更加穩(wěn)定。
import cv2 import numpy as np from numpy import unicode if __name__ == '__main__': img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) # 中值濾波 # 相當(dāng)于用中值代替 img_median1 = cv2.medianBlur(img1, 3) # 中值濾波 img_median2 = cv2.medianBlur(img1, 9) # 中值濾波 cv2.imshow("median1", img_median1) # 顯示疊加圖像 dst cv2.imshow("median2", img_median2) # 顯示疊加圖像 dst cv2.imshow("image", img1) # 顯示疊加圖像 dst cv2.waitKey(0) cv2.destroyAllWindows()
5 雙邊濾波
雙邊濾波是一種圖像模糊技術(shù),它在保持圖像邊緣清晰的同時(shí),對圖像中的噪聲進(jìn)行有效去除。雙邊濾波算法通過比較圖像上相鄰像素的顏色差異和空間差異來確定每個(gè)像素的權(quán)重,從而決定每個(gè)像素的最終顏色值。在OpenCV中,雙邊濾波算法可用于處理圖像的模糊、去噪、抗抖動等問題。
均值濾波、方框?yàn)V波、高斯濾波、中值濾波都是只單純的考慮了像素點(diǎn)之間的空間信息而進(jìn)行濾波的方式,這些方式都或多或少都會模糊圖像的邊緣信息,就是把圖像里面的邊緣線條弄模糊了,就是在去除圖像噪音的同時(shí)把圖像也弄模糊了,造成圖像邊界信息的部分丟失,這是這些方法的一個(gè)共同的缺點(diǎn)。
雙邊濾波就可以很好的規(guī)避這個(gè)缺點(diǎn)。因?yàn)殡p邊濾波不僅考慮了像素的空間信息(距離越遠(yuǎn)權(quán)重越小)同時(shí)還考慮了像素的色彩信息(色彩差別越大,權(quán)重越小),這樣就可以很好的去除噪聲還可以較好的保護(hù)邊緣信息,所以雙邊濾波器也是一個(gè)保邊去噪的濾波器。
import cv2 import numpy as np from numpy import unicode if __name__ == '__main__': img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) img_bilateralFilter1 = cv2.bilateralFilter(img1, 15, 150, 1000) img_bilateralFilter2 = cv2.bilateralFilter(img1, 3, 255, 1000) cv2.imshow("bilateralFilter2", img_bilateralFilter2) # 顯示疊加圖像 dst cv2.imshow("bilateralFilter1", img_bilateralFilter1) # 顯示疊加圖像 dst cv2.imshow("image", img1) # 顯示疊加圖像 dst cv2.waitKey(0) cv2.destroyAllWindows()
6 2D卷積(自定義卷積核實(shí)現(xiàn)卷積)
OpenCV 中的 2D 卷積的作用是圖像濾波,它可以用來消除圖像中的噪聲、提取圖像的特征、邊緣檢測等。它通過對圖像中的每一個(gè)像素與一個(gè)固定的卷積核進(jìn)行卷積操作來實(shí)現(xiàn)這些目的。
如果上面的均值濾波卷積核、方框?yàn)V波卷積核、高斯濾波卷積核、中值濾波卷積核、雙邊濾波卷積核都不能滿足我們對圖像的處理要求,此時(shí)我們就需要一個(gè)更加靈活的核——即我們自定義一個(gè)我們想要的核。如何實(shí)現(xiàn)呢?opencv中的cv2.filter2D()函數(shù)可以幫助我們實(shí)現(xiàn):
cv2.filter2D(img, ddepth, kernel, anchor, delta, borderType)
- img:要處理的原圖
- ddepth: 默認(rèn)-1,表示與原圖圖像相同的深度
- kernel: 卷積核,是一個(gè)單通道的數(shù)組。如果想處理彩圖時(shí),讓每個(gè)通道使用不同的核,就必須先將彩圖分解后再使用不同的核去卷積操作。
- anchor: 默認(rèn)值是(-1,-1),默認(rèn)計(jì)算的結(jié)果位于核的中心位置。
- delta:這個(gè)參數(shù)可寫可不寫。如果寫,表示在卷積操作時(shí),對應(yīng)位置相乘相加后再加一個(gè)偏置,這個(gè)偏置就是delta。
- borderType: 邊界處理方式,一般用默認(rèn)值即可。
import cv2 import numpy as np from numpy import unicode if __name__ == '__main__': img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) kernel = np.ones((9, 9), np.float32) / 81 # 在實(shí)際中我們可以定義更復(fù)雜的卷積核,以實(shí)現(xiàn)自定義濾波操作 img_kernel1 = cv2.filter2D(img1, -1, kernel) # 這個(gè)濾波器就相當(dāng)于均值濾波 kernel = np.ones((18, 18), np.float32) / 81 # 在實(shí)際中我們可以定義更復(fù)雜的卷積核,以實(shí)現(xiàn)自定義濾波操作 img_kernel2 = cv2.filter2D(img1, -1, kernel) # 這個(gè)濾波器就相當(dāng)于均值濾波 cv2.imshow("kernel1", img_kernel1) # 顯示疊加圖像 dst cv2.imshow("kernel2", img_kernel2) # 顯示疊加圖像 dst cv2.imshow("image", img1) # 顯示疊加圖像 dst cv2.waitKey(0) cv2.destroyAllWindows()
以上就是OpenCV實(shí)現(xiàn)圖像平滑處理的方法匯總的詳細(xì)內(nèi)容,更多關(guān)于OpenCV圖像平滑處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pandas 解決dataframe的一列進(jìn)行向下順移問題
今天小編就為大家分享一篇Pandas 解決dataframe的一列進(jìn)行向下順移問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀
這篇文章主要介紹了python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12linux系統(tǒng)使用python監(jiān)測網(wǎng)絡(luò)接口獲取網(wǎng)絡(luò)的輸入輸出
這篇文章主要介紹了linux系統(tǒng)使用python監(jiān)測網(wǎng)絡(luò)接口獲取網(wǎng)絡(luò)的輸入輸出信息,大家參考使用吧2014-01-01python中的多進(jìn)程的創(chuàng)建與啟動方式
這篇文章主要介紹了python中的多進(jìn)程的創(chuàng)建與啟動,python中的并發(fā)有三種形式,多進(jìn)程、多線程、協(xié)程,執(zhí)?并發(fā)任務(wù)的?的是為了提?程序運(yùn)?的效率,本文通過實(shí)例代碼詳細(xì)講解需要的朋友可以參考下2022-12-12python中pandas操作apply返回多列的實(shí)現(xiàn)
本文主要介紹了python中pandas操作apply返回多列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Python使用pyinstaller打包含有g(shù)ettext?locales語言環(huán)境的項(xiàng)目(推薦)
最近在用 pyhton 做一個(gè)圖片處理的小工具,順便接觸了gettext,用來實(shí)現(xiàn)本地化化中英文轉(zhuǎn)換,本文通過一個(gè)項(xiàng)目給大家詳細(xì)介紹下,感興趣的朋友跟隨小編一起看看吧2022-01-01