問題十七:laplacian濾波器
前面學習和使用的都是使用一階微分來檢測影象的邊緣,這個問題是使用laplacian濾波器,它是二階微分計算的濾波器。由於影象是乙個二維的方程,可以分別對x和y進行偏導,計算如下:
接著再對上面的導函式進行二次求導,就可以表示如下:
有了二階導數之後,就可以定義laplacian濾波器如下:
根據這個公式,就可以把前面的係數提取出來,構造下面的濾波核:
由此可見,laplacian濾波器是乙個整體的濾波器,不能分離成水平和垂直的方式,這也是與前面濾波器的區別,只能一次性地計算出來。其實我們學習過導數就知道,導數是表示速度,二階導數是表示加速度,因此這也是表示影象變化率比較大的地方,也就是邊緣的位置。
原圖
laplacian濾波器變換後的
整個例子**如下:
#python 3.7.4,opencv4.1
#蔡軍生
#import numpy as np
import cv2
from matplotlib import pyplot as plt
#讀取img = cv2.imread('lichee.png')
cv2.imshow("original", img)
h, w, c = img.shape
#轉換為灰度圖
b = img[:, :, 0].copy()
g = img[:, :, 1].copy()
r = img[:, :, 2].copy()
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b
gray = gray.astype(np.uint8)
# 濾波
k_size = 3
# 0填充
pad = k_size // 2
out = np.zeros((h + pad*2, w + pad*2), dtype=np.float)
out[pad:pad+h, pad:pad+w] = gray.copy().astype(np.float)
tmp = out.copy()
k = [[0., 1., 0.],[1., -4., 1.], [0., 1., 0.]]
for y in range(h):
for x in range(w):
out[pad+y, pad+x] = np.mean(k * (tmp[y:y+k_size, x:x+k_size]))
out = out[pad:pad+h, pad:pad+w].astype(np.uint8)
cv2.imshow("out", out)
#cv2.waitkey(0)
cv2.destroyallwindows()
在OpenCV裡學習常見問題彙編13
問題十三 max min濾波器 前面學習過均值濾波器,就是取一塊視窗裡資料的平均值,現在考慮一下,我們來選取這個視窗裡的最大值和最小值出來,然後再用它們之間的差值來代替,這種計算方式就叫做max min濾波。影象的細節屬於低頻資訊,影象的邊緣屬於高頻資訊,使用一定大小的 max min 濾波器作用於...
在OpenCV裡學習常見問題彙編19
問題十九 log濾波器 由於laplace運算元是通過對影象進行微分操作實現邊緣檢測的,所以對離散點和雜訊比較敏感。於是,首先對影象進行高斯卷積濾波進行降噪處理,再採用laplace運算元進行邊緣檢測,就可以提高運算元對雜訊和離散點的魯棒性,如此,拉普拉斯高斯運算元log laplace of ga...
在OpenCV裡學習常見問題彙編27
問題二十七 雙三次插值 bicubic interpolation 在這裡採用雙三次插值實現放大影象1.5倍,它計算量要比雙線性二次插值要大,不過它的效果也比雙線性二次插值要好。雙三次插值,英文是bicubic interpolation。雙三次插值是一種更加複雜的插值方式,它能創造出比雙線性插值更...