iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
佛心分享-IT 人自學之術

OpwnCV影像處理新手村系列 第 13

🚀 DAY 13:影像銳化(Sharpening)|filter2D、Unsharp Mask、Laplacian

  • 分享至 

  • xImage
  •  

影像銳化(Image Sharpening)是一種提升影像細節與邊緣對比的技術,
常用於讓圖片看起來更清晰,特別適合在攝影後期或電腦視覺前處理時使用。


📌 銳化的基本原理

銳化的核心是 強化像素與周圍像素的差異
讓邊緣的變化更明顯,從而突顯細節。
常用的銳化方法有:

  1. 卷積核濾波(filter2D)
  2. 非銳化遮罩(Unsharp Mask)
  3. 邊緣增強 (Laplacian)

🖼 測試圖片準備

準備一張圖片 image.jpg,放在與程式同一資料夾中。

import cv2
import numpy as np

img = cv2.imread("image.jpg")
cv2.imshow("Original", img)

# 放最後面
cv2.waitKey()
cv2.destroyAllWindows()

https://ithelp.ithome.com.tw/upload/images/20250914/201294829ubmxgZdWk.png


🔹 1. 卷積核濾波(filter2D)

filter2D() 可用任意自訂卷積核(Kernel)對影像進行濾波運算。 常用的銳化卷積核範例如下:

# 3x3 銳化 kernel:強化中心、抑制周圍
kernel_sharpen = np.array([[0, -1,  0],
                           [-1, 5, -1],
                           [0, -1,  0]], dtype=np.float32)

sharpen_conv = cv2.filter2D(img, ddepth=-1, kernel=kernel_sharpen)
cv2.imshow("Sharpen - filter2D (3x3)", sharpen_conv)

📌 參數說明

cv2.filter2D(src, ddepth, kernel)

  • src → 輸入影像
  • ddepth → 輸出影像的深度,-1 表示與原圖相同
  • kernel → 卷積核(NumPy 2D 陣列)

效果示意:
https://ithelp.ithome.com.tw/upload/images/20250914/20129482gSWqBXmKrB.png


🔹 2. 非銳化遮罩(Unsharp Mask)

反遮罩的想法是:原圖 − 模糊 = 邊緣;接著把邊緣加回原圖。

blur = cv2.GaussianBlur(img, (0, 0), sigmaX=2)
amount = 1.5
unsharp = cv2.addWeighted(img, 1 + amount, blur, -amount, 0)
cv2.imshow("Unsharp Mask (sigma=2, amount=1.5)", unsharp)
cv2.waitKey()
cv2.destroyAllWindows()

📌 參數說明

cv2.GaussianBlur(src, ksize, sigmaX)

  • ksize → 高斯核大小(必須為奇數)
  • sigmaX → X 方向的標準差,決定模糊程度

cv2.addWeighted(src1, alpha, src2, beta, gamma)

  • src1 → 原圖
  • alpha → 原圖權重
  • src2 → 第二張影像(模糊圖)
  • beta → 第二張影像權重(負數表示減去)
  • gamma → 偏移量(通常設 0)

效果示意:
https://ithelp.ithome.com.tw/upload/images/20250914/20129482frqxDD659S.png


🔹 3. 邊緣增強(Laplacian)

Laplacian 能凸顯影像的二階變化(邊緣/高頻),把邊緣訊號加回原圖即可達到銳化效果。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
lap = cv2.Laplacian(gray, ddepth=cv2.CV_16S, ksize=3)
lap_abs = cv2.convertScaleAbs(lap)
lap_color = cv2.cvtColor(lap_abs, cv2.COLOR_GRAY2BGR)

alpha = 1.0
beta = 0.7
lap_sharp = cv2.addWeighted(img, alpha, lap_color, beta, 0)
cv2.imshow("Laplacian Sharpen", lap_sharp)
cv2.waitKey()
cv2.destroyAllWindows()

📌 參數說明

cv2.Laplacian(src, ddepth, ksize)

  • ddepth → 輸出影像深度(cv2.CV_16S 避免溢位)
  • ksize → 卷積核大小(奇數)

cv2.convertScaleAbs() → 將影像轉為 8 位元整數 cv2.addWeighted() → 加權疊加

效果示意:
https://ithelp.ithome.com.tw/upload/images/20250914/20129482NrMPeQqGYY.png


📊 方法比較

方法 優點 缺點
filter2D 簡單快速,容易調整 容易放大雜訊
Unsharp Mask 控制銳化強度精準 需額外計算模糊
Laplacian 邊緣偵測效果好 容易產生光暈效果

🧭 選擇建議 & 小訣竅

  • filter2D:簡單直覺、速度快,適合一般用途
  • Unsharp Mask:自然、可控性高,適合照片調校
  • Laplacian 銳化:邊緣增強強烈,適合技術影像,但要留心雜訊放大

建議先做適度平滑(如 GaussianBlur)以穩定銳化效果。

參數建議:

  • Unsharp amount:0.5–2.0
  • Gaussian sigmaX:1–3
  • Laplacian ksize:1 或 3,beta 不宜過大

📖 今日結語

影像銳化核心在於 強化高頻訊號(邊緣/細節)。 使用卷積核、反遮罩或 Laplacian 都能讓影像更清晰,但需兼顧雜訊與自然度。 多嘗試不同方法與參數,找到最適合你的影像銳化策略。


上一篇
🌅 DAY 12:影像平滑與模糊化|blur、GaussianBlur、medianBlur
下一篇
🚀 DAY 14:影像二值化(Thresholding)|Threshold、Adaptive Threshold、Otsu
系列文
OpwnCV影像處理新手村14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言