【图像处理opencv】_图像锐化
目錄
0 程序環境與所學函數
1 卷積
2 均值模糊
3 中值濾波
4 高斯模糊
5 雙邊濾波
0 程序環境與所學函數
本章程序運行需要導入下面三個庫,并定義了一個顯示圖像的函數
import cv2 as cv import numpy as np import matplotlib.pyplot as pltdef show(img):if img.ndim == 2:plt.imshow(img, cmap='gray')else:plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.show()所學函數
#卷積
cv.filter2D(img, -1, kernel)
#均值模糊
cv.blur(img, (5,5))
cv.boxFilter(img, -1, (5,5))
#中值濾波
cv.medianBlur(img,3)
#高斯模板
cv.GaussianBlur(img, (5,5), sigma)
#雙邊濾波
cv.bilateralFilter(img, -1, sigmaColor=50, sigmaSpace=3)
1 卷積
原理:?
opencv里面提供了一個卷積函數 cv.filter2D(img,-1,kernel)
img-圖像,-1--數據類型,用-1代替表示與原圖像輸出一致,kernel--卷積核
程序實現:
img = np.ones((5,5)) kernel = np.ones((3,3)) #卷積核的選擇盡量選擇3×3,5×5等有中心的矩陣,不然可能報錯print(img) print(kernel)結果
#數學上的卷積應該先要將卷積核鏡像一下再操作,這里是直接相乘相加只表示相關性 #卷積后得到的結果應該變小,邊緣會默認填充,也可以指定邊緣填充方式,具體可以在函數里查看 img2 = cv.filter2D(img,-1,kernel) print(img2)結果
2 均值模糊
原理:均值濾波相當于對濾波器范圍內的矩陣數值取均值輸出得到的結果
?程序實現
#讀入一張帶有噪聲的圖片 img = cv.imread('pic/rose_spnoise_200x200.jpg') show(img)顯示
#用一種原始的定義方法實現均值濾波 K = np.ones((3,3)) / 9img1 = cv.filter2D(img,-1,K) show(np.hstack([img,img1]))結果
opencv提供函數實現,下面這兩個函數功能是一摸一樣,效果也是一模一樣的
cv.blur(img,(5,5))
cv.boxFilter(img,-1,(5,5))
結果
img3 = cv.boxFilter(img,-1,(3,3)) show(np.hstack([img,img3]))結果
3 中值濾波
原理
程序實現
img4= cv.medianBlur(img,3) #第二個數字必須是3,5,7...這樣的奇數 show(np.hstack([img,img4]))結果
4 高斯模糊
原理:?高斯模糊卷積核與sigma(方差)的值有關,方差越大越平緩,方差越小越陡峭
?sigma很小時是幾乎沒有濾波效果的,sigma很大時和均值濾波結果相似
程序實現
?img = cv.imread('pic/rose_spnoise_200x200.jpg') show(img)#使用opencv里面提供的函數實現 cv.GaussianBlur(img,(5,5),sigma) 圖像 卷積核大小 方差 sigma = 0.5img2 = cv.GaussianBlur(img,(5,5),sigmaX=sigma) show(np.hstack([img,img2]))結果
5 雙邊濾波
原理:可以保留邊緣等高頻信息,平滑顏色(灰度)相近的地方
?不斷計算卷積核:顏色差異越大,加權值越小;距離越遠,加權值越小
?
程序實現
img = cv.imread('pic/beer.jpg',0) show(img)#opencv提供函數實現 cv.bilateralFilter(img,-1,sigmaColor=50,sigmaSpace=3) img2 = cv.bilateralFilter(img,-1,sigmaColor=50,sigmaSpace=3) show(np.hstack([img,img2]))?結果
總結
以上是生活随笔為你收集整理的【图像处理opencv】_图像锐化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【图像处理opencv】_图像几何变换
- 下一篇: 【图像处理opencv】_图像边缘