使用Python,OpenCV进行平滑和模糊
使用Python,OpenCV進行平滑和模糊
- 1. 效果圖
- 2. 原理
- 2.1 依賴庫及安裝
- 2.2 簡單平均模糊
- 2.3 高斯模糊
- 2.4 中值模糊
- 2.5 雙邊濾波
 
- 3. 源代碼
- 參考
 
這篇博客將介紹如何使用OpenCV對圖片進行平滑和模糊操作。
 具體包括:
- 簡單平均模糊(cv2.blur)
- 加權高斯模糊(cv2.GaussianBlur)
- 中值濾波(cv2.medianBlur)
- 雙邊濾波(cv2.bilateralFilter)
平滑和模糊是計算機視覺和圖像處理中最常見的預處理步驟之一。
模糊是當相機拍攝的照片失去焦點時發生的事情。圖像中更清晰的區域會丟失其細節。模糊意味著圖像中的每個像素與其周圍的像素強度混合。鄰居中的一個“混合”像素成為模糊像素。
平滑能夠減少高頻內容,幫助忽略圖像中較小的細節,而留下更多圖像結果的內容。首先對圖像平滑或模糊后,會使得閾值化、邊緣檢測能取得更好的效果。
1. 效果圖
簡單均值模糊——原始圖 VS 3 * 3 VS 9 * 9 VS 15 * 15 效果圖如下:
M * N(均為奇數)的內核取平均值作為中心像素的值,可以看到隨著內核的增加,圖像越來越模糊~
 高斯模糊——原始圖 VS 3 * 3 VS 9 * 9 VS 15 * 15 效果圖如下:
M*N(均為奇數)的內核,不是簡單的取平均值,而是取加權平均值。可以看到隨著內核的增大,圖像也會變得模糊,但能保存更多的圖像邊緣。
 
 中值模糊——原始圖 VS 3 * 3 VS 9 * 9 VS 15 * 15 效果圖如下:
M * M(奇數,正方形)的內核,不取均值,也不取加權平均值,而是取鄰域像素的中位數值,可以看到中值模糊不像高斯平滑那樣的“自然模糊”,丟失了更多的細節和噪聲。
 
 模糊方法的目的是減少圖像中的噪聲和細節;然而,缺點是往往會失去圖像的邊緣。為了在保持邊緣的同時減少噪聲,可以使用雙邊模糊。雙邊模糊通過引入兩個高斯分布來實現。
雙邊模糊——原始圖 VS sc=21 VS sc=41 VS sc=61 效果圖如下:
 可以看到既模糊了圖像,又極大的保持了邊緣。
2. 原理
2.1 依賴庫及安裝
pip install opencv-contrib-python
opencv安裝可參考
2.2 簡單平均模糊
平均值過濾器:采用M* N(均為奇數)的標準化濾波器對圖像進行卷積,取一個中心像素周圍的像素區域,將所有這些像素平均在一起,并用平均值替換中心像素。
對于輸入圖像中的每個像素,這個內核將從左到右,從上到下滑動。要計算內核中心的像素(必須使用奇數,否則就不會有真正的“中心”)被設置為它周圍所有其他像素的平均值。
- 隨著內核大小的增加,圖像的模糊程度也會隨之增加。簡單地說:平滑內核越大,圖像看起來就越模糊。 這很容易導致圖像中對象的重要結構邊緣的丟失。
- 雖然平均平滑很容易理解,但它也會平均加權核心區域內的每個像素,這樣做很容易使圖像過度模糊,錯過重要的邊緣。可以通過應用高斯模糊來解決這個問題。
2.3 高斯模糊
高斯模糊類似于平均模糊,但使用的不是簡單的平均值,而是加權平均值,即更接近中心像素的鄰域像素對平均值貢獻更多的“權重”。
- 高斯平滑用于去除近似服從高斯分布的噪聲。M * N(均為奇數)的內核,取加權平均值,使得能夠保持圖像中更多的邊緣,看起來更“自然模糊。”
-當內核的大小增加時,應用于輸出圖像的模糊量也會增加。但是,模糊看起來更“自然”,比簡單的平均平滑更能保留圖像中的邊緣。
2.4 中值模糊
**中值模糊方法在去除椒鹽噪聲時是最有效的。**想象一下拍照,把它放在你的餐桌上,然后在上面撒鹽和胡椒。使用中值模糊方法,可以從圖像中去除椒鹽。
- M * M(均為奇數,正方形的內核),在均值模糊、高斯模糊中,核大小可以是矩形的,而中值模糊的核大小必須是方形的。不同于取平均值,而是用鄰域的中值代替中心像素。
- 中值模糊在去除圖像中的椒鹽噪聲方面更有效的原因是,每個中心像素總是被存在于圖像中的像素強度所取代。由于中位數對異常值具有魯棒性,因此椒鹽噪聲對中位數的影響將小于另一種統計方法,如平均值。
- 平均和高斯等方法計算鄰域的平均值或加權平均值-該平均像素強度可能存在于鄰域中,也可能不存在于鄰域中。但根據定義,中間像素必須存在于鄰域中。
- 通過將中心像素替換為中值而不是平均值,可以大大降低噪聲。但也會丟失更多的細節。
2.5 雙邊濾波
雙邊濾波能很好的彌補尚需三種模糊方法的缺陷,能顯著平滑圖像的細節和紋理,同時仍然保留邊界和邊緣。
 是通過倆個高斯核實現的。
- diameter:定義像素鄰域的直徑——直徑越大,模糊計算中包含的像素就越多,是一個正方形的內核大小。
- sigmaColor: 顏色標準差——值越大,表示在計算模糊度時,將考慮鄰域中的更多顏色。足夠大——則只有顏色相似的像素才會對模糊產生顯著影響。
- sigmaSpace: 空間標準差——值越大意味著遠離中心像素直徑的像素將影響模糊計算。
blurred = cv2.bilateralFilter(image, diameter, sigmaColor, sigmaSpace)
3. 源代碼
# USAGE
# python blurring.py --image images/flower.jpg
# 對圖像執行簡單平均模糊、高斯模糊、中值模糊;# 導入必要的包
import argparseimport cv2
import imutils# 構建命令行參數及解析
# --image 要執行平滑和模糊操作的圖像路徑
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, default="adrian.png",help="path to input image")
args = vars(ap.parse_args())# 加載圖像,展示它,初始化一個內核list,因此可以評估不同內核大小對模糊的影響
image = cv2.imread(args["image"])
image = imutils.resize(image, width=300)
cv2.imshow("Original", image)
kernelSizes = [(3, 3), (9, 9), (15, 15)]# 遍歷內核
# 可以看到圖像隨著內核大小的增加而變得模糊。內核越大,圖像就會越模糊。
for (kX, kY) in kernelSizes:# 應用當前內核執行簡單平均模糊# 圖像,高斯內核blurred = cv2.blur(image, (kX, kY))cv2.imshow("Average ({}, {})".format(kX, kY), blurred)cv2.waitKey(0)# 關閉所有窗口,清理屏幕
cv2.destroyAllWindows()
cv2.imshow("Original", image)# 遍歷內核
for (kX, kY) in kernelSizes:# 對圖像應用高斯平滑# 圖像,高斯內核,sigma(標準偏差,0表示根據內核自動計算)blurred = cv2.GaussianBlur(image, (kX, kY), 0)cv2.imshow("Gaussian ({}, {})".format(kX, kY), blurred)cv2.waitKey(0)# 關閉所有窗口,清理屏幕
cv2.destroyAllWindows()
cv2.imshow("Original", image)# 遍歷內核
for k in (3, 9, 15):# 應用中值模糊# 圖像,內核blurred = cv2.medianBlur(image, k)cv2.imshow("Median {}".format(k), blurred)cv2.waitKey(0)# 關閉所有窗口,清理屏幕
cv2.destroyAllWindows()
cv2.imshow("Original", image)
params = [(11, 21, 7), (11, 41, 21), (11, 61, 39)]# 遍歷雙邊濾波器的直徑、顏色標準差、空間標準差
# diameter:定義像素鄰域的直徑——直徑越大,模糊計算中包含的像素就越多,是一個正方形的內核大小。
# sigmaColor: 顏色標準差——值越大,表示在計算模糊度時,將考慮鄰域中的更多顏色。足夠大——則只有顏色相似的像素才會對模糊產生顯著影響。
# sigmaSpace: 空間標準差——值越大意味著遠離中心像素直徑的像素將影響模糊計算。
for (diameter, sigmaColor, sigmaSpace) in params:# 應用當前設置參數執行雙邊濾波blurred = cv2.bilateralFilter(image, diameter, sigmaColor, sigmaSpace)# 展示輸出圖像及關聯參數title = "Blurred d={}, sc={}, ss={}".format(diameter, sigmaColor, sigmaSpace)cv2.imshow(title, blurred)cv2.waitKey(0)cv2.destroyAllWindows()
參考
- https://www.pyimagesearch.com/2021/04/28/opencv-smoothing-and-blurring/
總結
以上是生活随笔為你收集整理的使用Python,OpenCV进行平滑和模糊的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 求一个放下的微信网名
- 下一篇: 杨柳青的的下一句是什么啊?
