在數字圖像處理中,模糊(Blurring)和銳化(Sharpening)是最基礎也最常用的濾鏡效果。模糊可以去除圖像噪聲、平滑細節,讓圖像看起來更柔和;銳化則相反,能增強圖像邊緣和細節,讓圖像更清晰。本文將用 Python 和 OpenCV 從零開始學習這兩種基礎操作,適合圖像處理初學者快速上手。
一、環境準備:安裝與導入¶
首先確保安裝了 OpenCV 和 NumPy(用於數值計算)。如果還沒安裝,在命令行執行:
pip install opencv-python numpy
然後在 Python 中導入庫:
import cv2
import numpy as np
二、圖像模糊:讓圖像“變柔和”¶
模糊處理的核心是降低圖像細節的對比度,常用方法包括均值濾波、高斯濾波、中值濾波和雙邊濾波。
1. 圖像模糊的原理¶
模糊可以理解爲“讓圖像像素值更接近周圍鄰居”。數學上,模糊是通過卷積核(即一個小矩陣)與圖像矩陣逐個像素計算加權和實現的。卷積核的作用是“平均”或“加權平均”周圍像素的值。
2. 常用模糊方法與代碼¶
(1)均值濾波(簡單平均)¶
原理:將卷積核內的所有像素值取平均,替換中心像素。
適用場景:快速去噪(但會模糊細節)。
代碼示例:
# 讀取圖像(默認讀取爲BGR格式)
img = cv2.imread("test.jpg") # 替換爲你的圖像路徑
# 均值濾波:(5,5)是卷積核大小(必須爲奇數)
blur = cv2.blur(img, ksize=(5, 5))
# 顯示原圖和模糊圖
cv2.imshow("Original", img)
cv2.imshow("Mean Blur", blur)
cv2.waitKey(0) # 按任意鍵關閉窗口
cv2.destroyAllWindows()
(2)高斯濾波(加權平均)¶
原理:卷積核中中心像素權重最高,周圍像素按高斯分佈(距離中心越遠,權重越低)。
適用場景:比均值濾波更自然,適合去除高斯噪聲(高頻噪聲)。
代碼示例:
# 高斯濾波:ksize=(5,5),sigmaX=0(自動計算標準差)
gaussian_blur = cv2.GaussianBlur(img, ksize=(5, 5), sigmaX=0)
cv2.imshow("Gaussian Blur", gaussian_blur)
cv2.waitKey(0)
(3)中值濾波(中值替代)¶
原理:取卷積核內像素的中值(排序後中間的值),替換中心像素。
適用場景:對椒鹽噪聲(黑白點噪聲)效果極佳,且能保留邊緣。
代碼示例:
# 中值濾波:ksize=3(必須爲奇數)
median_blur = cv2.medianBlur(img, ksize=3)
cv2.imshow("Median Blur", median_blur)
cv2.waitKey(0)
(4)雙邊濾波(保邊模糊)¶
原理:同時考慮像素值差異和空間距離,既模糊噪聲又保留邊緣。
適用場景:人像美顏、細節保留的模糊(如去除皮膚紋理但保留輪廓)。
代碼示例:
# 雙邊濾波:參數越大,模糊越強但細節保留越好
bilateral_blur = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)
cv2.imshow("Bilateral Blur", bilateral_blur)
cv2.waitKey(0)
三、圖像銳化:讓圖像“更清晰”¶
銳化處理的核心是增強圖像邊緣和細節,常用方法包括拉普拉斯算子、Sobel算子和簡單像素疊加。
1. 圖像銳化的原理¶
銳化通過增強像素值的差異實現,本質是“突出邊緣”。例如,拉普拉斯算子是二階導數(邊緣處像素值變化劇烈,二階導數爲0時是邊緣點),通過計算圖像的二階導數可以增強邊緣。
2. 常用銳化方法與代碼¶
(1)拉普拉斯算子(二階導數銳化)¶
原理:直接對圖像做拉普拉斯變換,增強邊緣(圖像變“銳”)。
代碼示例:
# 轉爲灰度圖(拉普拉斯通常在單通道處理)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 拉普拉斯算子:ksize=3,delta=0(無偏移)
laplacian = cv2.Laplacian(gray, cv2.CV_64F, ksize=3)
# 轉換爲無符號整數(避免負數值導致的黑色背景)
laplacian = np.uint8(np.absolute(laplacian))
# 銳化效果 = 原圖(灰度) - 拉普拉斯結果(邊緣)
sharpened = cv2.addWeighted(gray, 1.5, laplacian, 0.5, 0)
# 顯示結果
cv2.imshow("Original Gray", gray)
cv2.imshow("Laplacian Sharpened", sharpened)
cv2.waitKey(0)
(2)簡單銳化(原圖 + 邊緣增強)¶
原理:直接將原圖與“原圖 - 模糊圖”疊加,突出邊緣(簡單有效)。
代碼示例:
# 生成模糊圖(作爲邊緣參考)
blur_img = cv2.GaussianBlur(img, (5,5), 0)
# 原圖 - 模糊圖 = 邊緣信息(高頻分量)
edge = cv2.subtract(img, blur_img)
# 疊加回原圖(增強對比度)
sharp = cv2.add(img, edge)
cv2.imshow("Simple Sharp", sharp)
cv2.waitKey(0)
(3)Sobel算子(梯度銳化)¶
原理:計算圖像的水平和垂直梯度,疊加後增強邊緣。
代碼示例:
# 提取水平梯度(Sobel X)和垂直梯度(Sobel Y)
sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) # X方向梯度
sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # Y方向梯度
# 合併梯度(絕對值相加)
sobel_combined = cv2.addWeighted(np.absolute(sobelx), 0.5, np.absolute(sobely), 0.5, 0)
# 疊加回原圖
sharp_sobel = cv2.addWeighted(gray, 1.2, sobel_combined, 0.8, 0)
cv2.imshow("Sobel Sharp", sharp_sobel)
cv2.waitKey(0)
四、總結與練習¶
核心對比表¶
| 處理類型 | 方法 | 特點 | 適用場景 |
|---|---|---|---|
| 模糊 | 均值濾波 | 快速去噪,模糊細節 | 簡單噪聲去除 |
| 模糊 | 高斯濾波 | 自然模糊,保留細節 | 高斯噪聲去除 |
| 模糊 | 中值濾波 | 抗椒鹽噪聲,邊緣清晰 | 黑白斑點噪聲去除 |
| 模糊 | 雙邊濾波 | 保邊模糊,美顏效果 | 人像處理 |
| 銳化 | 拉普拉斯 | 二階導數,邊緣增強 | 通用銳化 |
| 銳化 | 簡單疊加 | 效果直接,計算快 | 快速突出邊緣 |
練習建議¶
- 嘗試不同卷積核大小(如3x3、5x5、7x7)觀察效果差異;
- 對比不同模糊方法對同一張圖像的處理結果(用手機拍攝一張含噪圖像測試);
- 嘗試“原圖 - 雙邊模糊圖”疊加,看是否能實現簡單美顏效果。
通過本文,你已經掌握了圖像模糊與銳化的基礎原理和 OpenCV 實現方法。這些技術是圖像處理的基石,後續可以嘗試更復雜的濾鏡(如浮雕、油畫效果)或結合機器學習進行智能增強。