一、?高通濾波
????????高通濾波是對圖像進行卷積操作,以保留圖像中的快速變化部分(如邊緣和細節),同時抑 制低頻分量(如大面積平坦區域)。
應用場景
- 邊緣檢測:提取物體輪廓和邊界。
- 特征提取:用于后續計算機視覺任務(如目標檢測)。
- 圖像銳化:增強圖像清晰度。
二、高通濾波——索貝爾算子
????????索貝爾算子是一種經典的邊緣檢測算子,通過計算像素梯度,檢測圖像的水平和垂直邊緣。
import cv2# 讀取原圖
# 使用 OpenCV 讀取圖像,返回一個 BGR 格式的圖像
img = cv2.imread('./images/waiguoren.png')# 將原圖轉換為灰度圖
# 灰度圖是處理圖像時常用的格式,它可以去除顏色信息,只保留亮度信息
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 計算水平方向的梯度
# 通過索貝爾算子計算水平方向上的變化量,即圖像在 X 軸方向上的梯度
grad_x = cv2.Sobel(gray_img, cv2.CV_64F, 1, 0, ksize=3)# 計算垂直方向的梯度
# 同樣地,計算圖像在 Y 軸方向上的變化量,即圖像在 Y 軸方向上的梯度
grad_y = cv2.Sobel(gray_img, cv2.CV_64F, 0, 1, ksize=3)# 計算梯度幅度
# 通過計算水平方向和垂直方向的梯度值的平方和,再開根號,得到每個像素點的梯度幅度
# 這是用來提取邊緣信息的,邊緣區域的梯度幅度通常較大
magnitude = cv2.magnitude(grad_x, grad_y)
magnitude = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)cv2.imshow('img', img)
cv2.imshow('gray_img', gray_img)
cv2.imshow('magnitude', magnitude)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、高通濾波——沙爾算子
????????沙爾算子是對索貝爾算子的優化版本,它在小窗口(如 3×3)中提供更高的精度。
????????索貝爾算子的卷積核比沙爾算子具有更強的邊緣檢測能力,它在水平方向和垂直方向上采用了不同的權重,更加重視鄰近像素的信息。
邊緣檢測的靈敏度
-
沙爾算子:由于其權重較為均勻,它對圖像的邊緣變化較為敏感,但可能對噪聲的反應也較強,因此邊緣檢測的結果可能不如索貝爾算子清晰。
-
索貝爾算子:由于其加權方式更加注重中心像素及其周圍像素的梯度變化,索貝爾算子在噪聲較多的情況下能提供更穩定和清晰的邊緣檢測結果。
應用場景
-
沙爾算子:適用于較為干凈的圖像(低噪聲環境),由于其結構簡單,計算開銷較小。
-
索貝爾算子:在噪聲較多或需要更精確邊緣檢測的圖像處理中,索貝爾算子表現更好,常用于實際應用中。
import cv2
# 讀取原圖
# 使用 OpenCV 讀取圖像,返回一個 BGR 格式的圖像
img = cv2.imread('./images/waiguoren.png')# 將原圖轉換為灰度圖
# 灰度圖是處理圖像時常用的格式,它可以去除顏色信息,只保留亮度信息
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 計算水平方向的梯度
# 通過索貝爾算子計算水平方向上的變化量,即圖像在 X 軸方向上的梯度
grad_x = cv2.Scharr(gray_img, cv2.CV_64F, 1, 0)# 計算垂直方向的梯度
# 同樣地,計算圖像在 Y 軸方向上的變化量,即圖像在 Y 軸方向上的梯度
grad_y = cv2.Scharr(gray_img, cv2.CV_64F, 0, 1)# 計算梯度幅度
# 通過計算水平方向和垂直方向的梯度值的平方和,再開根號,得到每個像素點的梯度幅度
# 這是用來提取邊緣信息的,邊緣區域的梯度幅度通常較大
magnitude = cv2.magnitude(grad_x, grad_y)
magnitude = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)cv2.imshow('img', img)
cv2.imshow('gray_img', gray_img)
cv2.imshow('magnitude', magnitude)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、高通濾波——拉普拉斯算子
????????拉普拉斯算子是一種二階微分算子。它的作用是計算圖像中像素值的變化率,從而識別圖像 中的邊緣。
不再以x和y的方向計算,而是以圓方向計算變化率。因此不需要Gx+Gy。
特點
-
邊緣檢測:拉普拉斯算子常常用作邊緣檢測的基礎方法之一。
-
圖像增強:拉普拉斯算子有時被用來增強圖像細節,去除模糊部分,提高圖像的清晰度。
高通濾波器的對比與應用場景
算子 | 特點 | 適用場景 |
---|---|---|
索貝爾 | 結合一階導數,能檢測水平和垂直邊緣 | 邊緣檢測、特征提取 |
沙爾 | 索貝爾的改進版,適合處理高頻變化區域,精度更高 | 精細邊緣檢測 |
拉普拉斯 | 二階導數算子,檢測方向無關的邊緣,靈敏度高 | 圖像銳化、邊緣增強 |
?
import cv2
import os# 圖片文件夾位置
dog_directory = "./dog"# 遍歷文件夾中的所有圖片
image_paths = []
for filename in os.listdir(dog_directory):# 獲取文件完整路徑filepath = os.path.join(dog_directory, filename)# 檢查文件是否為圖片格式if not filename.lower().endswith(('.png', '.jpg', '.jpeg')):continue# 讀取圖片img = cv2.imread(filepath)# 將圖像轉灰度gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 應用拉普拉斯算子,計算圖像方差laplacian = cv2.Laplacian(gray_img, cv2.CV_64F)variance = laplacian.var()print(f"Image: {filename}, Variance: {variance}")if variance < 300:image_paths.append(filepath)image_paths
Image: 1.png, Variance: 2113.8365566209127
Image: 2.png, Variance: 248.99712459101005
Image: 3.png, Variance: 1420.862992791666
Image: 4.png, Variance: 153.0638792511676
['./dog\\2.png', './dog\\4.png']
五、圖像浮雕與特效處理
????????圖像浮雕特效是仿造浮雕藝術而衍生的處理,它將要呈現的圖像突起于石頭表面,根據凹凸程度不同形成三維的立體效果。Python繪制浮雕圖像是通過勾畫圖像的輪廓,并降低周圍的像素值,從而產生一張具有立體感的浮雕效果圖。
5.1、圖像浮雕
dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
參數:
- src表示輸入圖像
- ddepth表示目標圖像所需的深度
- kernel表示卷積核,一個單通道浮點型矩陣
import cv2
import numpy as np
img=cv2.imread('./images/waiguoren.png')# 轉為灰度圖像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 浮雕
# 第一個參數 輸入圖像
# 第二個參數 -1 表示輸出圖像與輸入圖像具有相同的深度
# 第三個參數 卷積核,浮雕卷積核
# 第四個參數 dst 輸出圖像,默認是 None
embossed_img = cv2.filter2D(gray_img, -1, np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]]), dst=gray_img)# 顯示結果
cv2.imshow('img', img)
cv2.imshow('img_gray', img_gray)
cv2.imshow('embossed_img', embossed_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.2、油畫效果
????????油畫效果使圖像看起來像是由油畫筆刷繪制的,通常使用平滑化和顏色混合來實現。
cv2.xphoto.oilPainting(src, (size, dyn_ratio))
參數:
-
src
:輸入圖像。 -
(size, dyn_ratio)
:大小和動態比例,影響油畫效果的強度和樣式。
import cv2
import numpy as np
img=cv2.imread('./images/waiguoren.png')# 轉為灰度圖像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 油畫效果
oil_img = cv2.xphoto.oilPainting(img,7,20)# 顯示結果
cv2.imshow('img', img)
cv2.imshow('img_gray', img_gray)
cv2.imshow('oil_img', oil_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.3、彩色映射
????????彩色映射通過將圖像的灰度值映射到不同的顏色范圍,創造不同的視覺效果。例如,可以使用偽彩色來增強圖像的表現力。
dst = cv2.applyColorMap(src, colormap)
參數:
-
src
:灰度圖像。 -
colormap
:選擇的顏色映射類型。
import cv2
import numpy as np
img=cv2.imread('./images/waiguoren.png')# 轉為灰度圖像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 彩色映射
color_img = cv2.applyColorMap(img, cv2.COLORMAP_HSV)# 顯示結果
cv2.imshow('img', img)
cv2.imshow('img_gray', img_gray)
cv2.imshow('color_img', color_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.4、鏡像效果
????????鏡像效果是通過將圖像進行水平或垂直翻轉,來創建對稱圖像的一種方式。
dst = cv2.flip(src, flipCode)
參數:
-
src
:輸入圖像。 -
flipCode
:翻轉類型。1
表示水平翻轉,0
表示垂直翻轉,-1
表示水平和垂直都翻轉。
import cv2
import numpy as np
img=cv2.imread('./images/waiguoren.png')# 轉為灰度圖像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 鏡像
flip_img = cv2.flip(img,-1)# 顯示結果
cv2.imshow('img', img)
cv2.imshow('img_gray', img_gray)
cv2.imshow('flip_img', flip_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.5、油畫效果和浮雕結合
import cv2
import numpy as np
img=cv2.imread('./images/waiguoren.png')# 轉為灰度圖像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 浮雕
embossed_img = cv2.filter2D(gray_img, -1, np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]]), dst=gray_img)
# 油畫
combined = cv2.xphoto.oilPainting(embossed_img,7,20)# 顯示結果
cv2.imshow('img', img)
cv2.imshow('img_gray', img_gray)
cv2.imshow('combined', combined)
cv2.waitKey(0)
cv2.destroyAllWindows()