2024-03-05|閱讀時間 ‧ 約 27 分鐘

[OpenCV基礎][Python]影像增強_影像銳利化

在影像處理中,我們總是想要讓特徵更加明顯一點,可以使用銳利化方式將特徵的邊緣增強,提升影像的細節,圖像銳利後就會有提升解析度的感覺。

銳利化後

銳利化後

常見的圖像銳利化方法:

  1. 銳化濾波器:使用 OpenCV 的 cv2.filter2D 函數搭配適當的濾波核(如拉普拉斯濾波器)可以進行圖像銳利化。
  2. 增強對比度:可以通過調整圖像的對比度來增強圖像的銳利度,這可以通過直方圖均衡化或對比度增強的方法來實現。
  3. Unsharp Masking:這是一種常見的圖像銳化技術,通過將原始圖像和模糊版本的圖像相減,再加回原始圖像,可以得到銳利化的效果。


以下程式範例將用Unsharp Masking來實現圖像銳化:


拉普拉斯運算子是一種常用於影像增強的方法之一,特別是用於提高影像的邊緣細節。

在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 相關的重要參數:

ksize:

  • 參數類型:整數
  • 預設值:3(3x3 的運算子)
  • 內容:指定拉普拉斯運算子的內核大小。內核大小越大,檢測到的細節和邊緣越粗糙。
# 使用 5x5 的拉普拉斯運算子
laplacian = cv2.Laplacian(img, cv2.CV_64F, ksize=5)

ddepth:

  • 參數類型:整數
  • 預設值:-1(與原始影像相同的深度)
  • 內容:指定輸出影像的深度。通常情況下,使用 -1 表示與原始影像相同的深度,但你也可以指定其他深度值,例如 cv2.CV_8U
# 使用 8 位無符號深度的輸出影像
laplacian = cv2.Laplacian(img, cv2.CV_8U)

scale 和 delta:

  • scale 參數類型:浮點數
  • delta 參數類型:浮點數
  • 預設值:scale=1, delta=0
  • 內容:scale 用於縮放拉普拉斯運算子的結果,而 delta 用於調整結果的亮度。這兩個參數可以用來調整增強效果。
# 使用不同的 scale 和 delta 值
laplacian = cv2.Laplacian(img, cv2.CV_64F, scale=2, delta=50)


根據應用的需求和影像的特性來調整這些參數。在實際應用中,通常需要不斷嘗試不同的參數組合,以找到最適合的影像增強效果。






分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.