圖像平滑處理
- 四種常用方式
- 1. 均值濾波 (cv2.blur())
- 2. 高斯濾波 (cv2.GaussianBlur())
- 3. 中值濾波 (cv2.medianBlur())
- 4、雙邊濾波 (cv2.bilateralFilter())
- 總結
- 存圖時遇到一個中文版亂碼問題
四種常用方式
平滑處理(也稱為模糊處理),用于減少圖像中的噪聲或細節。
OpenCV 提供了多種平滑處理的方法,這里展示四種常用的平滑處理技術:均值濾波、高斯濾波、中值濾波和雙邊濾波。
1. 均值濾波 (cv2.blur())
均值濾波是最簡單的平滑處理方法之一。
均值濾波的原理是將圖像中每個像素的值替換為其周圍像素的平均值。
均值濾波可以有效地去除噪聲,但可能會導致圖像變得模糊。
# 讀取圖片img = cv2.imread('D:\Word\keli.jpg')# 應用均值濾波blurred_image = cv2.blur(img, (5, 5))# 保存圖片cv2.imwrite('D:\Word\keli_blurred.jpg', blurred_image)# 顯示結果cv2.imshow('blurred_image', blurred_image)cv2.waitKey(0)cv2.destroyAllWindows()
2. 高斯濾波 (cv2.GaussianBlur())
高斯濾波是一種基于高斯函數的平滑處理方法。與均值濾波不同,高斯濾波在計算像素平均值時,會給中心像素賦予更高的權重,而給邊緣像素賦予較低的權重。
高斯濾波在去除噪聲的同時,能夠更好地保留圖像的邊緣信息。
# 讀取圖片img = cv2.imread('D:\Word\keli_thres2.jpg')# 應用高斯濾波blurred_image = cv2.GaussianBlur(img, (5, 5), 0)# 保存圖片cv2.imwrite('D:\Word\keli_blurred.jpg', blurred_image)# 顯示結果cv2.imshow('blurred_image', blurred_image)cv2.waitKey(0)cv2.destroyAllWindows()
cv2.GaussianBlur(image, (5, 5), 0) 參數說明
image: 輸入的圖像。
(5, 5): 濾波核的大小。
0: 高斯核的標準差,如果為0,則根據核大小自動計算。
適用場景
高斯濾波適用于去除圖像中的高斯噪聲,并且在保留圖像邊緣信息方面表現較好。
3. 中值濾波 (cv2.medianBlur())
中值濾波是一種非線性平滑處理方法。它的原理是將圖像中每個像素的值替換為其周圍像素的中值。
中值濾波在去除椒鹽噪聲(即圖像中隨機出現的黑白點)時非常有效。
# 讀取圖片img = cv2.imread('D:\Word\keli_thres2.jpg')# 應用中值濾波blurred_image = cv2.medianBlur(img, 5)# 保存圖片cv2.imwrite('D:\Word\keli_blurred.jpg', blurred_image)# 顯示結果cv2.imshow('blurred_image', blurred_image)cv2.waitKey(0)cv2.destroyAllWindows()
參數說明
image: 輸入的圖像。
5: 濾波核的大小,必須是奇數。
適用場景
中值濾波適用于去除圖像中的椒鹽噪聲,并且在保留圖像邊緣信息方面表現較好。
4、雙邊濾波 (cv2.bilateralFilter())
雙邊濾波是一種非線性的平滑處理方法,它結合了空間鄰近度和像素值相似度。
與高斯濾波不同,雙邊濾波在平滑圖像的同時,能夠保留圖像的邊緣信息。這是因為雙邊濾波不僅考慮像素之間的空間距離,還考慮像素值之間的差異。
# 讀取圖片img = cv2.imread('D:\Word\keli.jpg')# 應用雙邊濾波blurred_image = cv2.bilateralFilter(img, 11, 17, 17)# 保存圖片cv2.imwrite('D:\Word\keli_blurred.jpg', blurred_image)# 顯示結果cv2.imshow('blurred_image', blurred_image)cv2.waitKey(0)cv2.destroyAllWindows()
cv2.bilateralFilter(image, 9, 75, 75)
參數說明
image: 輸入的圖像。
9: 濾波核的大小。
75: 顏色空間的標準差,控制像素值相似度的權重。
75:坐標空間的標準差,控制空間距離的權重。
適用場景
雙邊濾波適用于在去除噪聲的同時保留圖像的邊緣信息,常用于圖像美化或預處理。
總結
OpenCV 提供了多種圖像平滑處理方法,每種方法都有其獨特的優勢和適用場景。
均值濾波簡單易用,但可能導致圖像模糊;
高斯濾波在去除噪聲的同時能較好地保留邊緣信息;
中值濾波特別適合去除椒鹽噪聲;
雙邊濾波則在保留邊緣信息方面表現出色。
根據具體的應用場景,選擇合適的平滑處理方法,可以顯著提升圖像處理的效果。
存圖時遇到一個中文版亂碼問題
當使用cv2.imwrite保存帶有中文路徑或名稱的圖片時,可能會出現亂碼問題。這是因為cv2.imwrite在處理非ASCII字符時存在限制
# 保存圖片cv2.imwrite(r'D:\Word\keli_均值濾波.jpg', blurred_image1)cv2.imwrite(r'D:\Word\keli_高斯濾波.jpg', blurred_image2)cv2.imwrite(r'D:\Word\keli_中值濾波.jpg', blurred_image3)cv2.imwrite(r'D:\Word\keli_雙邊濾波.jpg', blurred_image4)# 使用cv2.imencode和tofile保存圖片,避免中文路徑亂碼cv2.imencode('.jpg', blurred_image1)[1].tofile('D:\Word\keli_均值濾波.jpg')cv2.imencode('.jpg', blurred_image2)[1].tofile('D:\Word\keli_高斯濾波.jpg')cv2.imencode('.jpg', blurred_image3)[1].tofile('D:\Word\keli_中值濾波.jpg')cv2.imencode('.jpg', blurred_image4)[1].tofile('D:\Word\keli_雙邊濾波.jpg')
第一種會中文亂碼,第二種就不會