在OpenCV裡學習常見問題彙編17

2021-10-04 06:15:00 字數 1874 閱讀 7949

問題十七:laplacian濾波器

前面學習和使用的都是使用一階微分來檢測影象的邊緣,這個問題是使用laplacian濾波器,它是二階微分計算的濾波器。由於影象是乙個二維的方程,可以分別對x和y進行偏導,計算如下:

接著再對上面的導函式進行二次求導,就可以表示如下:

有了二階導數之後,就可以定義laplacian濾波器如下:

根據這個公式,就可以把前面的係數提取出來,構造下面的濾波核:

由此可見,laplacian濾波器是乙個整體的濾波器,不能分離成水平和垂直的方式,這也是與前面濾波器的區別,只能一次性地計算出來。其實我們學習過導數就知道,導數是表示速度,二階導數是表示加速度,因此這也是表示影象變化率比較大的地方,也就是邊緣的位置。

原圖

laplacian濾波器變換後的

整個例子**如下:

#python 3.7.4,opencv4.1

#蔡軍生

#[email protected]

#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。雙三次插值是一種更加複雜的插值方式,它能創造出比雙線性插值更...