图像模糊化
这篇教学会介绍 OpenCV 四种图像模糊化的方法 ( blur()、GaussianBlur()、medianBlur()、bilateralFilter() ),透过这些方法,将图像套用模糊化的效果,输出成为新的图像。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
blur() 平均模糊
使用 OpenCV 的 blur() 方法,可以计算指定区域所有像素的平均值,再将平均值取代中心像素,使用方法如下:
cv2.blur(img, ksize)
# img 來源影像
# ksize 指定區域單位
指定区域单位设定的范围越大,则模糊的效果越明显,下面的例子会产生两张模糊化的图像。
import cv2
img = cv2.imread('meme.jpg')
output1 = cv2.blur(img, (5, 5)) # 指定區域單位為 (5, 5)
output2 = cv2.blur(img, (25, 25)) # 指定區域單位為 (25, 25)
cv2.imshow('oxxostudio1', output1)
cv2.imshow('oxxostudio2', output2)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
GaussianBlur() 高斯模糊
使用 OpenCV 的 GaussianBlur() 方法,可以使用高斯分布进行模糊化的计算,指定模糊区域单位 ( 必须是大于 1 的奇数 ) 后就能产生不同程度的模糊效果,使用方法如下:
cv2.GaussianBlur(img, ksize, sigmaX, sigmaY)
# img 來源影像
# ksize 指定區域單位 ( 必須是大於 1 的奇數 )
# sigmaX X 方向標準差,預設 0,sigmaY Y 方向標準差,預設 0
指定区域单位设定的范围越大,则模糊的效果越明显,下面的例子会产生两张高斯模糊化的图像。
import cv2
img = cv2.imread('meme.jpg')
output1 = cv2.GaussianBlur(img, (5, 5), 0) # 指定區域單位為 (5, 5)
output2 = cv2.GaussianBlur(img, (25, 25), 0) # 指定區域單位為 (25, 25)
cv2.imshow('oxxostudio1', output1)
cv2.imshow('oxxostudio2', output2)
cv2.waitKey(0)
cv2.destroyAllWindows()
medianBlur() 中值模糊
使用 OpenCV 的 medianBlur() 方法,可以使用像素点周围灰度值的中值,来代替该像素点的灰度值,模糊程度 ( 必须是大于 1 的奇数 ),使用方法如下:
cv2.medianBlur(img, ksize)
# img 來源影像
# ksize 模糊程度 ( 必須是大於 1 的奇數 )
模糊程度设定的数值越大,则模糊的效果越明显,下面的例子会产生两张中值模糊化的图像。
import cv2
img = cv2.imread('meme.jpg')
output1 = cv2.medianBlur(img, 5) # 模糊程度為 5
output2 = cv2.medianBlur(img, 25) # 模糊程度為 25
cv2.imshow('oxxostudio1', output1)
cv2.imshow('oxxostudio2', output2)
cv2.waitKey(0)
cv2.destroyAllWindows()
bilateralFilter() 双边模糊
使用 OpenCV 的 bilateralFilter() 方法,可以透过非线性的双边滤波器进行计算,让图像模糊化的同时,也能够保留图像内容的边缘,使用方法如下:
cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)
# img 來源影像
# d 相鄰像素的直徑,預設使用 5,數值越大運算的速度越慢
# sigmaColor 相鄰像素的顏色混合,數值越大,會混合更多區域的顏色,並產生更大區塊的同一種顏色
# sigmaSpace 會影響像素的區域,數值越大,影響的範圍就越大,影響的像素就越多
下面的例子会产生三张双边模糊的图像。
import cv2
img = cv2.imread('meme.jpg')
output1 = cv2.bilateralFilter(img, 50, 0, 0)
output2 = cv2.bilateralFilter(img, 50, 50, 100)
output3 = cv2.bilateralFilter(img, 50, 100, 1000)
cv2.imshow('oxxostudio1', output1)
cv2.imshow('oxxostudio2', output2)
cv2.imshow('oxxostudio3', output3)
cv2.waitKey(0)
cv2.destroyAllWindows()
影片的模糊效果
延伸“读取并播放影片”文章的范例,在程序码中使用 medianBlur() 中值模糊方法,就能将电脑镜头拍摄的画面,即时转换成模糊化的图像。
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Cannot receive frame")
break
# 套用 medianBlur() 中值模糊
img = cv2.medianBlur(frame, 25)
cv2.imshow('oxxostudio', img)
if cv2.waitKey(1) == ord('q'):
break # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注