在生活中常看到的美圖秀秀或美圖修修或者其他圖像編輯軟體,通常使用各種濾波器和模糊化技術來實現照片的修飾和美化效果。這些濾波和模糊化技術可以應用於不同的區域,以改進照片的外觀,包括平滑皮膚、去除細節、調整對比度等。
本文會介紹 OpenCV 四種影像模糊化的方法 ( blur()
、GaussianBlur()
、medianBlur()
、bilateralFilter()
),經由圖片輸出,理解其應用。
cv2.blur(img, (kernel_size, kernel_size))
函式實現平均模糊。img
:輸入圖像。(kernel_size, kernel_size)
:核的大小,表示鄰域的大小。blurred = cv2.GaussianBlur(img, (kernel_size, kernel_size), sigma)
函式實現高斯模糊。img
:輸入圖像。(kernel_size, kernel_size)
:高斯核的大小,通常是一個正奇數。越大的核將產生越強的模糊效果。sigma
:高斯核的標準差。標準差越大,生成的高斯分布越寬,模糊效果越強。cv2.medianBlur(img, kernel_size)
函式實現中值模糊。img
:輸入圖像。kernel_size
:核的大小,表示鄰域的大小。bilateral_filtered = cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)
函式實現雙邊濾波器。img
:輸入圖像。d
:在濾波過程中考慮的鄰域直徑,越大表示考慮的範圍越廣。sigmaColor
:色彩空間中的標準差,控制色彩相似性。sigmaSpace
:空間範圍中的標準差,控制空間相似性。平滑皮膚效果,可以增加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()
相對於平均模糊,高斯模糊同樣達到平滑效果。但保留了更多的細節。
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()
與高斯模糊相比細節又相對少一點點,但又比平均模糊細節又多一點。
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()
與中值模糊跟高斯模糊相比,雙邊濾波器在此圖上去躁能力更加好一些,皮膚平滑的效果也比較佳,膚色看起來也較為正常,輪廓的邊緣也還行。
色彩相似性:雙邊濾波器能夠保留像素間的色彩相似性。這對於皮膚平滑等任務很重要,因為皮膚區域可能包含多種顏色,保留這些顏色的細節有助於更自然的外觀。
空間相似性: 雙邊濾波器同時考慮了空間上的相似性,有助於保留輪廓和邊緣細節。這對於不僅僅是平滑,還要保留圖像整體結構的應用場景更為適合。
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()