在影像處理中,我們總是想要讓特徵更加明顯一點,可以使用銳利化的方式將特徵的邊緣增強,提升影像的細節,圖像銳利後就會有提升解析度的感覺。
常見的圖像銳利化方法:
cv2.filter2D
函數搭配適當的濾波核(如拉普拉斯濾波器)可以進行圖像銳利化。拉普拉斯運算子是一種常用於影像增強的方法之一,特別是用於提高影像的邊緣和細節。
在OpenCV中,你可以使用cv2.Laplacian
函數來應用拉普拉斯運算子。
cv2.Laplacian
函式的基本語法:#標準函式
dst = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
#常用
laplacian = cv2.Laplacian(img, cv2.CV_64F)
src
: 原始影像,可以是灰度影像或彩色影像。ddepth
: 輸出影像的深度(通常是 cv2.CV_8U、cv2.CV_16U、cv2.CV_64F 等)。dst
: 輸出影像。如果未提供,函數會自動創建一個與 src
大小和深度相同的影像。ksize
: 使用的拉普拉斯運算子的內核大小。如果未提供,則默認為3。scale
: 結果的比例因子,可以用於增強或減弱拉普拉斯梯度。默認為1。delta
: 結果的偏移值,可以用於調整結果的亮度。默認為0。borderType
: 設置邊界擴充的方式。默認為 cv2.BORDER_DEFAULT
。這個函數返回一個包含拉普拉斯梯度的影像
通常,你會在這個結果上進一步進行處理,例如使用 cv2.convertScaleAbs
將結果轉為無符號八位整數形式。
import cv2
import numpy as np
def laplacian_sharpen(image_path, output_path):
# 讀取影像
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 使用拉普拉斯運算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)
# 將負值轉為正值
laplacian = cv2.convertScaleAbs(laplacian)
# 將原始影像和拉普拉斯增強的影像結合
sharpened_img = cv2.addWeighted(img, 1.5, laplacian, -0.5, 0)
# 保存結果
cv2.imwrite(output_path, sharpened_img)
# 呼叫函式,替換為你的輸入和輸出路徑
laplacian_sharpen('input_image.jpg', 'output_image_laplacian.jpg')
銳化後的圖就是使用cv2.addWeighted
函數結合灰階的影像和拉普拉斯增強的影像。
程式範例第六行,cv2.IMREAD_GRAYSCALE
拿掉即可。
# 讀取影像
img = cv2.imread(image_path)
程式範例第七行,拉普拉斯運算子新增其他參數
# 使用拉普拉斯運算子
laplacian = cv2.Laplacian(img, cv2.CV_64F, scale=2, delta=50)
以下是一些與 cv2.Laplacian
相關的重要參數:
# 使用 5x5 的拉普拉斯運算子
laplacian = cv2.Laplacian(img, cv2.CV_64F, ksize=5)
ddepth:
cv2.CV_8U
。# 使用 8 位無符號深度的輸出影像
laplacian = cv2.Laplacian(img, cv2.CV_8U)
scale 和 delta:
scale
用於縮放拉普拉斯運算子的結果,而 delta
用於調整結果的亮度。這兩個參數可以用來調整增強效果。# 使用不同的 scale 和 delta 值
laplacian = cv2.Laplacian(img, cv2.CV_64F, scale=2, delta=50)