在數字圖像處理中,模糊(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)

四、總結與練習

核心對比表

處理類型 方法 特點 適用場景
模糊 均值濾波 快速去噪,模糊細節 簡單噪聲去除
模糊 高斯濾波 自然模糊,保留細節 高斯噪聲去除
模糊 中值濾波 抗椒鹽噪聲,邊緣清晰 黑白斑點噪聲去除
模糊 雙邊濾波 保邊模糊,美顏效果 人像處理
銳化 拉普拉斯 二階導數,邊緣增強 通用銳化
銳化 簡單疊加 效果直接,計算快 快速突出邊緣

練習建議

  1. 嘗試不同卷積核大小(如3x3、5x5、7x7)觀察效果差異;
  2. 對比不同模糊方法對同一張圖像的處理結果(用手機拍攝一張含噪圖像測試);
  3. 嘗試“原圖 - 雙邊模糊圖”疊加,看是否能實現簡單美顏效果。

通過本文,你已經掌握了圖像模糊與銳化的基礎原理和 OpenCV 實現方法。這些技術是圖像處理的基石,後續可以嘗試更復雜的濾鏡(如浮雕、油畫效果)或結合機器學習進行智能增強。

小夜