更新於 2024/10/18閱讀時間約 7 分鐘

[OpenCV基礎][Python]影像模糊化

在生活中常看到的美圖秀秀美圖修修或者其他圖像編輯軟體,通常使用各種濾波器模糊化技術實現照片修飾和美化效果。這些濾波和模糊化技術可以應用於不同的區域,以改進照片的外觀,包括平滑皮膚去除細節調整對比度等。

本文會介紹 OpenCV 四種影像模糊化的方法 ( blur()GaussianBlur()medianBlur()bilateralFilter() ),經由圖片輸出,理解其應用。


OpenCV中實現影像模糊化的常見方法介紹:

平均模糊(Averaging Blur):

  • 通過將每個像素的值設置為周圍鄰域像素值的平均值來實現。
  • cv2.blur(img, (kernel_size, kernel_size)) 函式實現平均模糊。
    img:輸入圖像。
    (kernel_size, kernel_size):核的大小,表示鄰域的大小。

高斯模糊(Gaussian Blur):

  • 使用高斯函數權重計算每個像素的新值,以達到平滑效果。
  • blurred = cv2.GaussianBlur(img, (kernel_size, kernel_size), sigma) 函式實現高斯模糊。
    img:輸入圖像。
    (kernel_size, kernel_size):高斯核的大小,通常是一個正奇數。越大的核將產生越強的模糊效果。
    sigma:高斯核的標準差。標準差越大,生成的高斯分布越寬,模糊效果越強。

中值模糊(Median Blur):

  • 將每個像素的值設置為鄰域像素值的中值
  • cv2.medianBlur(img, kernel_size) 函式實現中值模糊。
  • img:輸入圖像。
  • kernel_size:核的大小,表示鄰域的大小。

雙邊濾波器(Bilateral Filter):

  • 結合了色彩相似性空間相似性的考慮,可在平滑圖像的同時保留邊緣細節。。
  • bilateral_filtered = cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace) 函式實現雙邊濾波器。
  • img:輸入圖像。
  • d:在濾波過程中考慮的鄰域直徑,越大表示考慮的範圍越廣。
  • sigmaColor:色彩空間中的標準差,控制色彩相似性。
    這個值控制著鄰域中像素之間的色彩差異的容忍度。值越大,更多顏色範圍內的像素會被混合,從而使邊緣區域更模糊。
    效果:較高的 sigmaColor 值允許鄰域中的像素具有較大色彩差異,從而增加模糊程度;而較低的值則意味著只有色彩接近的像素才會被混合,邊緣能夠較好地保持
  • sigmaSpace:空間範圍中的標準差,控制空間相似性。
    用於空間範圍濾波的標準差。這個值決定了距離鄰域中心的像素的權重,控制空間鄰域中的像素的影響。值越大,遠離中心的像素也會參與計算,濾波的效果會更加平滑。
    效果:較大的 sigmaSpace 值將使濾波器考慮鄰域中更遠的像素(即影響更大範圍內的像素);而較小的 sigmaSpace 值則只會考慮鄰近的像素,濾波會更加局部化。



程式範例

平均模糊(Averaging Blur):

平滑皮膚效果,可以增加kernel_size(需奇數)平滑效果會更好喔~

import cv2

img = cv2.imread('imge.jpg')

# 使用 blur 進行平均模糊

kernel_size = (5, 5)
blur = cv2.blur(img, kernel_size)

cv2.imshow('Original Image', img)
cv2.imshow('Averaging blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

皮膚平滑效果

高斯模糊(Gaussian Blur):

相對於平均模糊,高斯模糊同樣達到平滑效果。但保留了更多的細節。

import cv2

img = cv2.imread('123.jpg')

# 使用 GaussianBlur 進行高斯模糊

kernel_size = (5, 5)
sigma = 0
GaussianBlur = cv2.GaussianBlur(img, kernel_size, sigma)

cv2.imshow('Original Image', img)
cv2.imshow('Averaging blur', GaussianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()

與平均模糊作比較

高斯與平均模糊作比較

中值模糊(Median Blur):

與高斯模糊相比細節又相對少一點點,但又比平均模糊細節又多一點。

import cv2

img = cv2.imread('123.jpg')

# 使用 medianBlur 進行中值模糊
kernel_size = 5
medianBlur = cv2.medianBlur(img, kernel_size)

cv2.imshow('Original Image', img)
cv2.imshow('medianBlur', medianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()

高斯模糊與中值模糊比較

雙邊濾波器(Bilateral Filter):

與中值模糊跟高斯模糊相比,雙邊濾波器在此圖上去躁能力更加好一些,皮膚平滑的效果也比較佳膚色看起來也較為正常,輪廓的邊緣也還行。

色彩相似性:雙邊濾波器能夠保留像素間的色彩相似性。這對於皮膚平滑等任務很重要,因為皮膚區域可能包含多種顏色,保留這些顏色的細節有助於更自然的外觀

空間相似性: 雙邊濾波器同時考慮了空間上的相似性,有助於保留輪廓和邊緣細節。這對於不僅僅是平滑,還要保留圖像整體結構的應用場景更為適合。

import cv2

img = cv2.imread('123.jpg')

# 使用 bilateralFilter 進行雙邊濾波

bilateral_filtered = cv2.bilateralFilter(img, d = 9, sigmaColor = 75, sigmaSpace = 75)

cv2.imshow('Original Image', img)
cv2.imshow('bilateral_filtered', bilateral_filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()

雙邊濾波與中值相比


總結

選擇模糊化方法應根據應用的具體需求:

  • 平均模糊高斯模糊適用於一般的平滑去噪工作
  • 中值模糊對於去除椒鹽噪聲效果較好。
  • 雙邊濾波器在需要同時保留色彩空間細節的情境中表現較佳

在實際應用中,通常需要進行實驗和比較,選擇最適合的模糊方法,最重要的是圖片模糊化後,有沒有達到自己想要的效果。










分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.