OpenCV 4.13.0
開源電腦視覺 (Open Source Computer Vision)
載入中...
搜尋中...
無符合項
影像濾波

詳細描述

本節所述的函數和類別用於對 2D 影像(以 Mat 表示)執行各種線性或非線性濾波操作。這表示對於來源影像(通常為矩形)中的每個像素位置 \((x,y)\),都會考慮其鄰域並用於計算響應。在線性濾波器中,它是像素值的加權和。在形態學操作中,它是最小值或最大值,依此類推。計算出的響應會儲存在目標影像的相同位置 \((x,y)\)。這表示輸出影像將與輸入影像具有相同的大小。通常,這些函數支援多通道陣列,每個通道會獨立處理。因此,輸出影像也會具有與輸入影像相同數量的通道。

本節所述函數和類別的另一個共同特點是,與簡單的算術函數不同,它們需要推斷一些不存在像素的值。例如,如果您想使用高斯 \(3 \times 3\) 濾波器來平滑影像,那麼在處理每行的最左邊像素時,您需要其左側的像素,即影像外部的像素。您可以讓這些像素與影像最左邊的像素相同(「重複邊界」外推法),或者假設所有不存在的像素都為零(「常數邊界」外推法),依此類推。OpenCV 允許您指定外推方法。詳情請參閱 BorderTypes

深度組合

輸入深度 (src.depth())輸出深度 (ddepth)
CV_8U-1/CV_16S/CV_32F/CV_64F
CV_16U/CV_16S-1/CV_32F/CV_64F
CV_32F-1/CV_32F
CV_64F-1/CV_64F
備註
當 ddepth=-1 時,輸出影像將與來源影像具有相同的深度。
如果您需要雙精度浮點數的精確度,並且使用單精度浮點數的輸入資料(CV_32F 輸入和 CV_64F 輸出深度組合),您可以使用 Mat::convertTo 將輸入資料轉換為所需的精度。

列舉

列舉  cv::MorphShapes {
  cv::MORPH_RECT = 0 ,
  cv::MORPH_CROSS = 1 ,
  cv::MORPH_ELLIPSE = 2 ,
  cv::MORPH_DIAMOND = 3
}
 結構元素的形狀 更多...
 
列舉  cv::MorphTypes {
  cv::MORPH_ERODE = 0 ,
  cv::MORPH_DILATE = 1 ,
  cv::MORPH_OPEN = 2 ,
  cv::MORPH_CLOSE = 3 ,
  cv::MORPH_GRADIENT = 4 ,
  cv::MORPH_TOPHAT = 5 ,
  cv::MORPH_BLACKHAT = 6 ,
  cv::MORPH_HITMISS = 7
}
 形態學操作的類型 更多...
 
列舉  cv::SpecialFilter { cv::FILTER_SCHARR = -1 }
 

函式

void cv::bilateralFilter (InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)
 對影像套用雙邊濾波 (bilateral filter)。
 
void cv::blur (InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT)
 使用正規化盒狀濾波器 (normalized box filter) 模糊影像。
 
void cv::boxFilter (InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT)
 使用盒狀濾波器 (box filter) 模糊影像。
 
void cv::buildPyramid (InputArray src, OutputArrayOfArrays dst, int maxlevel, int borderType=BORDER_DEFAULT)
 建構影像的高斯金字塔。
 
void cv::dilate (InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar &borderValue=morphologyDefaultBorderValue())
 使用特定的結構元素膨脹影像。
 
void cv::erode (InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar &borderValue=morphologyDefaultBorderValue())
 使用特定的結構元素侵蝕影像。
 
void cv::filter2D (InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT)
 將影像與卷積核 (kernel) 進行卷積。
 
void cv::GaussianBlur (InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
 使用高斯濾波器模糊影像。
 
void cv::getDerivKernels (OutputArray kx, OutputArray ky, int dx, int dy, int ksize, bool normalize=false, int ktype=CV_32F)
 返回用於計算空間影像導數的濾波器係數。
 
Mat cv::getGaborKernel (Size ksize, double sigma, double theta, double lambd, double gamma, double psi=CV_PI *0.5, int ktype=CV_64F)
 返回 Gabor 濾波器係數。
 
Mat cv::getGaussianKernel (int ksize, double sigma, int ktype=CV_64F)
 返回高斯濾波器係數。
 
Mat cv::getStructuringElement (int shape, Size ksize, Point anchor=Point(-1,-1))
 返回用於形態學操作的指定大小和形狀的結構元素。
 
void cv::Laplacian (InputArray src, OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType=BORDER_DEFAULT)
 計算影像的拉普拉斯算子(Laplacian)。
 
void cv::medianBlur (InputArray src, OutputArray dst, int ksize)
 使用中值濾波器模糊影像。
 
static Scalar cv::morphologyDefaultBorderValue ()
 返回用於侵蝕(erosion)與擴張(dilation)的「魔術」邊界值。對於擴張操作,它會自動轉換為 Scalar::all(-DBL_MAX)。
 
void cv::morphologyEx (InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar &borderValue=morphologyDefaultBorderValue())
 執行進階形態學轉換。
 
void cv::pyrDown (InputArray src, OutputArray dst, const Size &dstsize=Size(), int borderType=BORDER_DEFAULT)
 模糊影像並對其進行降採樣(downsamples)。
 
void cv::pyrMeanShiftFiltering (InputArray src, OutputArray dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1))
 對影像執行均值漂移(meanshift)分割的初始步驟。
 
void cv::pyrUp (InputArray src, OutputArray dst, const Size &dstsize=Size(), int borderType=BORDER_DEFAULT)
 對影像進行上採樣(upsamples)然後模糊處理。
 
void cv::Scharr (InputArray src, OutputArray dst, int ddepth, int dx, int dy, double scale=1, double delta=0, int borderType=BORDER_DEFAULT)
 使用 Scharr 算子計算一階 x 或 y 影像導數。
 
void cv::sepFilter2D (InputArray src, OutputArray dst, int ddepth, InputArray kernelX, InputArray kernelY, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT)
 對影像應用可分離線性濾波器。
 
void cv::Sobel (InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT)
 使用擴展的 Sobel 算子計算一階、二階、三階或混合影像導數。
 
void cv::spatialGradient (InputArray src, OutputArray dx, OutputArray dy, int ksize=3, int borderType=BORDER_DEFAULT)
 使用 Sobel 算子計算 x 和 y 方向的一階影像導數。
 
void cv::sqrBoxFilter (InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1, -1), bool normalize=true, int borderType=BORDER_DEFAULT)
 計算與濾波器重疊的像素值平方和的正規化結果。
 
void cv::stackBlur (InputArray src, OutputArray dst, Size ksize)
 使用 stackBlur 模糊影像。
 

列舉類型文件

◆ 形態形狀

#include <opencv2/imgproc.hpp>

結構元素的形狀

列舉值
MORPH_RECT 
Python: cv.MORPH_RECT

矩形結構元素

\[E_{ij}=1\]

MORPH_CROSS 
Python: cv.MORPH_CROSS

十字形結構元素

\[E_{ij} = \begin{cases} 1 & \texttt{if } {i=\texttt{anchor.y } {or } {j=\texttt{anchor.x}}} \\0 & \texttt{otherwise} \end{cases}\]

MORPH_ELLIPSE 
Python: cv.MORPH_ELLIPSE

在矩形 Rect(0, 0, esize.width, esize.height) 中

橢圓形結構元素,即內切的實心橢圓

MORPH_DIAMOND 
Python: cv.MORPH_DIAMOND

由曼哈頓距離定義的菱形結構元素

◆ 形態學類型

#include <opencv2/imgproc.hpp>

形態學操作的類型

列舉值
MORPH_ERODE 
Python: cv.MORPH_ERODE

請參閱 erode

MORPH_DILATE 
Python: cv.MORPH_DILATE

請參閱 dilate

MORPH_OPEN 
Python: cv.MORPH_OPEN

開啟操作

\[\texttt{dst} = \mathrm{open} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \mathrm{erode} ( \texttt{src} , \texttt{element} ))\]

MORPH_CLOSE 
Python: cv.MORPH_CLOSE

閉合操作

\[\texttt{dst} = \mathrm{close} ( \texttt{src} , \texttt{element} )= \mathrm{erode} ( \mathrm{dilate} ( \texttt{src} , \texttt{element} ))\]

MORPH_GRADIENT 
Python: cv.MORPH_GRADIENT

形態學梯度

\[\texttt{dst} = \mathrm{morph\_grad} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \texttt{src} , \texttt{element} )- \mathrm{erode} ( \texttt{src} , \texttt{element} )\]

MORPH_TOPHAT 
Python: cv.MORPH_TOPHAT

「頂帽」

\[\texttt{dst} = \mathrm{tophat} ( \texttt{src} , \texttt{element} )= \texttt{src} - \mathrm{open} ( \texttt{src} , \texttt{element} )\]

MORPH_BLACKHAT 
Python: cv.MORPH_BLACKHAT

「黑帽」

\[\texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src}\]

MORPH_HITMISS 
Python: cv.MORPH_HITMISS

「擊中或錯過」 (hit or miss) .- 僅支援 CV_8UC1 二值影像。相關教學可在文件檔中找到

◆ 特殊濾波器

#include <opencv2/imgproc.hpp>

列舉值
FILTER_SCHARR 
Python: cv.FILTER_SCHARR

函式文件

◆ 雙邊濾波器()

void cv::bilateralFilter ( InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT )
Python
cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst

#include <opencv2/imgproc.hpp>

對影像套用雙邊濾波 (bilateral filter)。

此函數將雙邊濾波應用於輸入影像,如 https://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html 所述。雙邊濾波器能很好地減少不必要的雜訊,同時保持邊緣相當清晰。然而,與大多數濾波器相比,它的速度非常慢。

Sigma 值:為求簡便,您可以將兩個 sigma 值設為相同。如果它們很小(< 10),濾波器效果不大;如果它們很大(> 150),則會產生非常強烈的效果,使影像看起來像「卡通」。

濾波器尺寸:大型濾波器 (d > 5) 速度很慢,因此建議即時應用使用 d=5,而對於需要大量雜訊濾波的離線應用則可考慮使用 d=9。

此濾波器不支援就地操作 (in-place)。

參數
src來源 8 位元或浮點型,單通道或 3 通道影像。
dst與 src 具有相同大小和類型的目標影像。
d濾波期間使用的每個像素鄰域的直徑。如果為非正值,則從 sigmaSpace 計算。
sigmaColor顏色空間中的濾波 sigma。該參數值越大,表示像素鄰域內較遠的顏色(參閱 sigmaSpace)將混合在一起,產生更大的半均勻顏色區域。
sigmaSpace座標空間中的濾波 sigma。該參數值越大,表示只要像素顏色足夠接近(參閱 sigmaColor),較遠的像素也會相互影響。當 d>0 時,它指定了鄰域大小,與 sigmaSpace 無關。否則,d 與 sigmaSpace 成正比。
borderType用於外推影像外部像素的邊界模式,請參閱 BorderTypes

◆ 模糊濾波器()

void cv::blur ( InputArray src,
OutputArray dst,
Size ksize,
Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT )
Python
cv.blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst

#include <opencv2/imgproc.hpp>

使用正規化盒狀濾波器 (normalized box filter) 模糊影像。

此函數使用以下卷積核平滑影像

\[\texttt{K} = \frac{1}{\texttt{ksize.width*ksize.height}} \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \end{bmatrix}\]

呼叫 blur(src, dst, ksize, anchor, borderType) 等同於 boxFilter(src, dst, src.type(), ksize, anchor, true, borderType)

參數
src輸入影像;可具有任意數量的通道,這些通道會獨立處理,但深度應為 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。
dst與 src 具有相同大小和類型的輸出影像。
ksize模糊卷積核大小。
anchor錨點;預設值 Point(-1,-1) 表示錨點位於卷積核中心。
borderType用於外推影像外部像素的邊界模式,請參閱 BorderTypesBORDER_WRAP 不受支援。
參見
boxFilter, bilateralFilter, GaussianBlur, medianBlur

◆ 方框濾波器()

void cv::boxFilter ( InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT )
Python
cv.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) -> dst

#include <opencv2/imgproc.hpp>

使用盒狀濾波器 (box filter) 模糊影像。

此函數使用以下卷積核平滑影像

\[\texttt{K} = \alpha \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \end{bmatrix}\]

其中

\[\alpha = \begin{cases} \frac{1}{\texttt{ksize.width*ksize.height}} & \texttt{when } \texttt{normalize=true} \\1 & \texttt{otherwise}\end{cases}\]

未歸一化的方框濾波器可用於計算每個像素鄰域上的各種積分特性,例如影像導數的協方差矩陣(用於稠密光流演算法等)。如果您需要計算可變大小視窗內的像素總和,請使用 integral

參數
src輸入影像。
dst與 src 具有相同大小和類型的輸出影像。
ddepth輸出影像深度(-1 表示使用 src.depth())。
ksize模糊卷積核大小。
anchor錨點;預設值 Point(-1,-1) 表示錨點位於卷積核中心。
normalize標誌,指定卷積核是否按其面積歸一化。
borderType用於外推影像外部像素的邊界模式,請參閱 BorderTypesBORDER_WRAP 不受支援。
參見
blur, bilateralFilter, GaussianBlur, medianBlur, integral

◆ 建立金字塔()

void cv::buildPyramid ( InputArray src,
OutputArrayOfArrays dst,
int maxlevel,
int borderType = BORDER_DEFAULT )

#include <opencv2/imgproc.hpp>

建構影像的高斯金字塔。

此函數建構一個影像向量,並透過從 dst[0]==src 開始,遞迴地將 pyrDown 應用於先前建立的金字塔層來建立高斯金字塔。

參數
src來源影像。請參閱 pyrDown 以取得支援類型的列表。
dst目標向量,包含 maxlevel+1 個與 src 相同類型的影像。dst[0] 將與 src 相同。dst[1] 是下一個金字塔層,是經過平滑和縮小的 src,依此類推。
maxlevel最後(最小)金字塔層的零基索引。它必須是非負值。
borderType像素外推方法,請參閱 BorderTypes(不支援 BORDER_CONSTANT)。

◆ 膨脹()

void cv::dilate ( InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue() )
Python
cv.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst

#include <opencv2/imgproc.hpp>

使用特定的結構元素膨脹影像。

此函數使用指定的結構元素對來源影像進行膨脹,該結構元素決定了取最大值的像素鄰域形狀。

\[\texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\]

此函數支援就地模式。膨脹可以應用多次 (iterations)。對於多通道影像,每個通道都會獨立處理。

參數
src輸入影像;通道數可以是任意值,但深度應為 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F 之一。
dst與 src 具有相同大小和類型的輸出影像。
kernel用於膨脹的結構元素;如果 element=Mat(),則使用一個 3 x 3 的矩形結構元素。可以使用 getStructuringElement 建立卷積核。
anchor元素內的錨點位置;預設值 (-1, -1) 表示錨點位於元素中心。
iterations應用膨脹的次數。
borderType像素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
borderValue常數邊界情況下的邊界值
參見
erode, morphologyEx, getStructuringElement

◆ 腐蝕()

void cv::erode ( InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue() )
Python
cv.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst

#include <opencv2/imgproc.hpp>

使用特定的結構元素侵蝕影像。

此函數使用指定的結構元素對來源影像進行腐蝕,該結構元素決定了取最小值的像素鄰域形狀。

\[\texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\]

此函數支援就地模式。腐蝕可以應用多次 (iterations)。對於多通道影像,每個通道都會獨立處理。

參數
src輸入影像;通道數可以是任意值,但深度應為 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F 之一。
dst與 src 具有相同大小和類型的輸出影像。
kernel用於腐蝕的結構元素;如果 element=Mat(),則使用一個 3 x 3 的矩形結構元素。可以使用 getStructuringElement 建立卷積核。
anchor元素內的錨點位置;預設值 (-1, -1) 表示錨點位於元素中心。
iterations應用腐蝕的次數。
borderType像素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
borderValue常數邊界情況下的邊界值
參見
dilate, morphologyEx, getStructuringElement

◆ filter2D()

void cv::filter2D ( InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor = Point(-1,-1),
double delta = 0,
int borderType = BORDER_DEFAULT )
Python
cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst

#include <opencv2/imgproc.hpp>

將影像與卷積核 (kernel) 進行卷積。

此函數將任意線性濾波器應用於影像。支援就地操作。當光圈部分位於影像外部時,函數會根據指定的邊界模式插入異常像素值。

此函數實際計算的是相關性 (correlation),而非卷積 (convolution)。

\[\texttt{dst} (x,y) = \sum _{ \substack{0\leq x' < \texttt{kernel.cols}\\{0\leq y' < \texttt{kernel.rows}}}} \texttt{kernel} (x',y')* \texttt{src} (x+x'- \texttt{anchor.x} ,y+y'- \texttt{anchor.y} )\]

也就是說,卷積核不會圍繞錨點翻轉。如果您需要真正的卷積,請使用 flip 翻轉卷積核,並將新的錨點設為 (kernel.cols - anchor.x - 1, kernel.rows - anchor.y - 1)

對於足夠大的卷積核(約 `11 x 11` 或更大),此函數使用基於 DFT 的演算法;對於小型卷積核,則使用直接演算法。

參數
src輸入影像。
dst與 src 具有相同大小和通道數的輸出影像。
ddepth目標影像的所需深度,請參閱 組合
kernel卷積核(或稱相關核),一個單通道浮點數矩陣;如果您想對不同通道應用不同的卷積核,請使用 split 將影像分成單獨的顏色平面並單獨處理它們。
anchor卷積核的錨點,表示濾波點在卷積核內的相對位置;錨點應位於卷積核內;預設值 (-1,-1) 表示錨點位於卷積核中心。
delta儲存到 dst 之前添加到濾波像素的選用值。
borderType像素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
參見
sepFilter2D, dft, matchTemplate

◆ 高斯模糊濾波器()

void cv::GaussianBlur ( InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT,
AlgorithmHint hint = cv::ALGO_HINT_DEFAULT )
Python
cv.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType[, hint]]]]) -> dst

#include <opencv2/imgproc.hpp>

使用高斯濾波器模糊影像。

此函數使用指定的高斯卷積核對來源影像進行卷積。支援就地濾波。

參數
src輸入影像;影像可以具有任意數量的通道,這些通道會獨立處理,但深度應為 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。
dst與 src 具有相同大小和類型的輸出影像。
ksize高斯卷積核大小。ksize.width 和 ksize.height 可以不同,但它們都必須是正奇數。或者,它們可以是零,然後從 sigma 計算。
sigmaXX 方向的高斯卷積核標準差。
sigmaYY 方向的高斯卷積核標準差;如果 sigmaY 為零,則設為等於 sigmaX;如果兩個 sigma 都為零,則分別從 ksize.width 和 ksize.height 計算(詳情請參閱 getGaussianKernel);為了完全控制結果,而不論未來所有語義可能發生的修改,建議同時指定 ksize、sigmaX 和 sigmaY。
borderType像素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
hint實作修改標誌。請參閱 AlgorithmHint
參見
sepFilter2D, filter2D, blur, boxFilter, bilateralFilter, medianBlur

◆ 取得導數卷積核()

void cv::getDerivKernels ( OutputArray kx,
OutputArray ky,
int dx,
int dy,
int ksize,
bool normalize = false,
int ktype = CV_32F )
Python
cv.getDerivKernels(dx, dy, ksize[, kx[, ky[, normalize[, ktype]]]]) -> kx, ky

#include <opencv2/imgproc.hpp>

返回用於計算空間影像導數的濾波器係數。

此函數計算並返回空間影像導數的濾波器係數。當 ksize=FILTER_SCHARR 時,會產生 Scharr \(3 \times 3\) 卷積核(請參閱 Scharr)。否則,會產生 Sobel 卷積核(請參閱 Sobel)。這些濾波器通常傳遞給 sepFilter2D

參數
kx列濾波器係數的輸出矩陣。其類型為 ktype。
ky行濾波器係數的輸出矩陣。其類型為 ktype。
dx關於 x 的導數階數。
dy關於 y 的導數階數。
ksize光圈大小。可以是 FILTER_SCHARR, 1, 3, 5 或 7。
normalize標誌,指示是否歸一化(縮小)濾波器係數。理論上,係數應具有分母 \(=2^{ksize*2-dx-dy-2}\)。如果您要濾波浮點影像,您可能會使用歸一化的卷積核。但如果您計算 8 位元影像的導數,將結果儲存在 16 位元影像中,並希望保留所有小數位,您可能需要將 normalize=false。
ktype濾波器係數的類型。可以是 CV_32f 或 CV_64F。

◆ 取得 Gabor 卷積核()

Mat cv::getGaborKernel ( Size ksize,
double sigma,
double theta,
double lambd,
double gamma,
double psi = CV_PI *0.5,
int ktype = CV_64F )
Python
cv.getGaborKernel(ksize, sigma, theta, lambd, gamma[, psi[, ktype]]) -> retval

#include <opencv2/imgproc.hpp>

返回 Gabor 濾波器係數。

有關 Gabor 濾波器方程式和參數的更多詳細資訊,請參閱:Gabor 濾波器

參數
ksize返回的濾波器大小。
sigma高斯包絡的標準差。
thetaGabor 函數平行條紋法線的方向。
lambd正弦因子的波長。
gamma空間長寬比。
psi相位偏移。
ktype濾波器係數的類型。可以是 CV_32F 或 CV_64F。

◆ 取得高斯卷積核()

Mat cv::getGaussianKernel ( int ksize,
double sigma,
int ktype = CV_64F )
Python
cv.getGaussianKernel(ksize, sigma[, ktype]) -> retval

#include <opencv2/imgproc.hpp>

返回高斯濾波器係數。

此函數計算並返回 \(\texttt{ksize} \times 1\) 的高斯濾波器係數矩陣

\[G_i= \alpha *e^{-(i-( \texttt{ksize} -1)/2)^2/(2* \texttt{sigma}^2)},\]

其中 \(i=0..\texttt{ksize}-1\) 和 \(\alpha\) 是選擇的縮放因子,使得 \(\sum_i G_i=1\)。

兩個這樣產生的卷積核可以傳遞給 sepFilter2D。這些函數會自動識別平滑卷積核(權重之和為 1 的對稱卷積核)並進行相應處理。您也可以使用更高級別的 GaussianBlur。

參數
ksize光圈大小。它應該是正奇數 ( \(\texttt{ksize} \mod 2 = 1\) )。
sigma高斯標準差。如果為非正值,則從 ksize 計算為 sigma = 0.3*((ksize-1)*0.5 - 1) + 0.8
ktype濾波器係數的類型。可以是 CV_32F 或 CV_64F。
參見
sepFilter2D, getDerivKernels, getStructuringElement, GaussianBlur

◆ 取得結構元素()

Mat cv::getStructuringElement ( int shape,
Size ksize,
Point anchor = Point(-1,-1) )
Python
cv.getStructuringElement(shape, ksize[, anchor]) -> retval

#include <opencv2/imgproc.hpp>

返回用於形態學操作的指定大小和形狀的結構元素。

此函數建構並返回可用於 erodedilatemorphologyEx 的結構元素。您也可以自行建構任意二值遮罩作為結構元素。

參數
shape元素形狀,可以是 MorphShapes 之一
ksize結構元素的大小。
anchor元素內的錨點位置。預設值 \((-1, -1)\) 表示錨點位於中心。請注意,只有十字形元素的形狀取決於錨點位置。在其他情況下,錨點僅調整形態學操作結果的偏移量。

◆ 拉普拉斯算子()

void cv::Laplacian ( InputArray src,
OutputArray dst,
int ddepth,
int ksize = 1,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT )
Python
cv.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) -> dst

#include <opencv2/imgproc.hpp>

計算影像的拉普拉斯算子(Laplacian)。

此函數透過將使用 Sobel 算子計算出的第二階 x 和 y 導數相加來計算來源影像的拉普拉斯算子。

\[\texttt{dst} = \Delta \texttt{src} = \frac{\partial^2 \texttt{src}}{\partial x^2} + \frac{\partial^2 \texttt{src}}{\partial y^2}\]

ksize > 1 時執行此操作。當 ksize == 1 時,拉普拉斯算子透過以下 \(3 \times 3\) 光圈濾波影像來計算。

\[\vecthreethree {0}{1}{0}{1}{-4}{1}{0}{1}{0}\]

參數
src來源影像。
dst與 src 具有相同大小和通道數的目標影像。
ddepth目標影像的所需深度,請參閱 組合
ksize用於計算二階導數濾波器的光圈大小。詳情請參閱 getDerivKernels。大小必須為正奇數。
scale計算出的拉普拉斯值的選用縮放因子。預設情況下不應用縮放。詳情請參閱 getDerivKernels
delta在將結果儲存到 dst 之前添加的選用 delta 值。
borderType像素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
參見
Sobel, Scharr

◆ 中值模糊濾波器()

void cv::medianBlur ( InputArray src,
OutputArray dst,
int ksize )
Python
cv.medianBlur(src, ksize[, dst]) -> dst

#include <opencv2/imgproc.hpp>

使用中值濾波器模糊影像。

此函數使用具有 \(\texttt{ksize} \times \texttt{ksize}\) 光圈的中值濾波器平滑影像。多通道影像的每個通道都會獨立處理。支援就地操作。

備註
中值濾波器內部使用 BORDER_REPLICATE 來處理邊界像素,請參閱 BorderTypes
參數
src輸入 1、3 或 4 通道影像;當 ksize 為 3 或 5 時,影像深度應為 CV_8U、CV_16U 或 CV_32F;對於較大的光圈尺寸,只能是 CV_8U。
dst與 src 具有相同大小和類型的目標陣列。
ksize光圈線性大小;它必須是奇數且大於 1,例如:3、5、7...
參見
bilateralFilter, blur, boxFilter, GaussianBlur

◆ 形態學預設邊界值()

static Scalar cv::morphologyDefaultBorderValue ( )
inlinestatic

#include <opencv2/imgproc.hpp>

返回用於侵蝕(erosion)與擴張(dilation)的「魔術」邊界值。對於擴張操作,它會自動轉換為 Scalar::all(-DBL_MAX)。

這是此函式的呼叫圖

◆ 進階形態學轉換()

void cv::morphologyEx ( InputArray src,
OutputArray dst,
int op,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue() )
Python
cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst

#include <opencv2/imgproc.hpp>

執行進階形態學轉換。

函數 cv::morphologyEx 可以使用腐蝕和膨脹作為基本操作執行進階形態學轉換。

任何操作都可以就地執行。對於多通道影像,每個通道都會獨立處理。

參數
src來源影像。通道數可以是任意值。深度應為 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F 之一。
dst與來源影像具有相同大小和類型的目標影像。
op形態學操作的類型,請參閱 MorphTypes
kernel結構元素。可以使用 getStructuringElement 建立。
anchor卷積核內的錨點位置。負值表示錨點位於卷積核中心。
iterations應用腐蝕和膨脹的次數。
borderType像素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
borderValue常數邊界情況下的邊界值。預設值具有特殊含義。
參見
dilate, erode, getStructuringElement
備註
迭代次數是指腐蝕或膨脹操作將被應用的次數。例如,進行兩次迭代的開啟操作 (MORPH_OPEN) 等同於連續應用:腐蝕 -> 腐蝕 -> 膨脹 -> 膨脹(而不是腐蝕 -> 膨脹 -> 腐蝕 -> 膨脹)。

◆ 金字塔向下取樣()

void cv::pyrDown ( InputArray src,
OutputArray dst,
const Size & dstsize = Size(),
int borderType = BORDER_DEFAULT )
Python
cv.pyrDown(src[, dst[, dstsize[, borderType]]]) -> dst

#include <opencv2/imgproc.hpp>

模糊影像並對其進行降採樣(downsamples)。

預設情況下,輸出影像的大小計算為 Size((src.cols+1)/2, (src.rows+1)/2),但在任何情況下,都應滿足以下條件

\[\begin{array}{l} | \texttt{dstsize.width} *2-src.cols| \leq 2 \\ | \texttt{dstsize.height} *2-src.rows| \leq 2 \end{array}\]

此函數執行高斯金字塔建構的向下取樣步驟。首先,它使用以下卷積核對來源影像進行卷積

\[\frac{1}{256} \begin{bmatrix} 1 & 4 & 6 & 4 & 1 \\ 4 & 16 & 24 & 16 & 4 \\ 6 & 24 & 36 & 24 & 6 \\ 4 & 16 & 24 & 16 & 4 \\ 1 & 4 & 6 & 4 & 1 \end{bmatrix}\]

然後,它透過捨棄偶數行和列來對影像進行向下取樣。

參數
src輸入影像。
dst輸出影像;它具有指定的大小和與 src 相同的類型。
dstsize輸出影像的大小。
borderType像素外推方法,請參閱 BorderTypes(不支援 BORDER_CONSTANT)。

◆ 金字塔均值偏移濾波()

void cv::pyrMeanShiftFiltering ( InputArray src,
OutputArray dst,
double sp,
double sr,
int maxLevel = 1,
TermCriteria termcrit = TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1) )
Python
cv.pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]]) -> dst

#include <opencv2/imgproc.hpp>

對影像執行均值漂移(meanshift)分割的初始步驟。

此函數實作均值偏移分割的濾波階段,即函數的輸出是經過濾波的「海報化」影像,其中顏色梯度和細粒紋理已被平坦化。對於輸入影像(或縮小後的輸入影像,見下文)的每個像素 (X,Y),函數會執行均值偏移迭代,即考慮聯合空間-顏色超空間中的像素 (X,Y) 鄰域

\[(x,y): X- \texttt{sp} \le x \le X+ \texttt{sp} , Y- \texttt{sp} \le y \le Y+ \texttt{sp} , ||(R,G,B)-(r,g,b)|| \le \texttt{sr}\]

其中 (R,G,B) 和 (r,g,b) 分別是 (X,Y) 和 (x,y) 處的顏色分量向量(儘管演算法不依賴於所使用的顏色空間,因此可以使用任何 3 分量顏色空間代替)。在鄰域內找到平均空間值 (X',Y') 和平均顏色向量 (R',G',B'),它們作為下一次迭代的鄰域中心

\[(X,Y)~(X',Y'), (R,G,B)~(R',G',B').\]

迭代結束後,初始像素(即迭代開始的像素)的顏色分量被設定為最終值(最後一次迭代的平均顏色)

\[I(X,Y) <- (R*,G*,B*)\]

當 maxLevel > 0 時,會建立 maxLevel+1 個層級的高斯金字塔,並首先在最小層上運行上述程序。之後,結果會傳播到較大的層,並且僅在該層顏色與金字塔較低解析度層的顏色差異大於 sr 的像素上再次運行迭代。這使得顏色區域的邊界更清晰。請注意,結果將與在整個原始影像上運行均值偏移程序(即當 maxLevel==0 時)所獲得的結果實際不同。

參數
src來源 8 位元、3 通道影像。
dst與來源影像具有相同格式和大小的目標影像。
sp空間視窗半徑。
sr顏色視窗半徑。
maxLevel用於分割的金字塔最大層級。
termcrit終止準則:何時停止均值偏移迭代。

◆ 金字塔向上取樣()

void cv::pyrUp ( InputArray src,
OutputArray dst,
const Size & dstsize = Size(),
int borderType = BORDER_DEFAULT )
Python
cv.pyrUp(src[, dst[, dstsize[, borderType]]]) -> dst

#include <opencv2/imgproc.hpp>

對影像進行上採樣(upsamples)然後模糊處理。

預設情況下,輸出影像的大小計算為 Size(src.cols*2, (src.rows*2)),但在任何情況下,都應滿足以下條件

\[\begin{array}{l} | \texttt{dstsize.width} -src.cols*2| \leq ( \texttt{dstsize.width} \mod 2) \\ | \texttt{dstsize.height} -src.rows*2| \leq ( \texttt{dstsize.height} \mod 2) \end{array}\]

此函數執行高斯金字塔建構的向上取樣步驟,儘管它實際上也可以用於建構拉普拉斯金字塔。首先,它透過插入偶數零行和列來對來源影像進行向上取樣,然後使用與 pyrDown 中相同並乘以 4 的卷積核對結果進行卷積。

參數
src輸入影像。
dst輸出影像。它具有指定的大小和與 src 相同的類型。
dstsize輸出影像的大小。
borderType像素外推方法,請參閱 BorderTypes(僅支援 BORDER_DEFAULT)。

◆ Scharr 算子()

void cv::Scharr ( InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT )
Python
cv.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]) -> dst

#include <opencv2/imgproc.hpp>

使用 Scharr 算子計算一階 x 或 y 影像導數。

此函數使用 Scharr 算子計算影像的 x 或 y 方向的一階空間導數。呼叫

\[\texttt{Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType)}\]

等同於

\[\texttt{Sobel(src, dst, ddepth, dx, dy, FILTER_SCHARR, scale, delta, borderType)} .\]

參數
src輸入影像。
dst與 src 具有相同大小和通道數的輸出影像。
ddepth輸出影像深度,請參閱 組合
dxx 方向導數的階數。
dyy 方向導數的階數。
scale計算出的導數值的選用縮放因子;預設情況下不應用縮放(詳情請參閱 getDerivKernels)。
delta在將結果儲存到 dst 之前添加的選用 delta 值。
borderType像素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
參見
cartToPolar

Sobel, Laplacian

◆ sepFilter2D() ( InputArray src,
OutputArray dst,
int ddepth,
InputArray void cv::sepFilter2D,
InputArray kernelX,
Point anchor = Point(-1,-1),
double delta = 0,
int borderType = BORDER_DEFAULT )
Python
kernelYcv.sepFilter2D() -> dst

#include <opencv2/imgproc.hpp>

對影像應用可分離線性濾波器。

src, ddepth, kernelX, kernelY[, dst[, anchor[, delta[, borderType]]]]

參數
src來源影像。
dst與 src 具有相同大小和通道數的目標影像。
ddepth此函數將可分離線性濾波器應用於影像。也就是說,首先,src 的每一行都使用一維卷積核 kernelX 進行濾波。然後,結果的每一列都使用一維卷積核 kernelY 進行濾波。最終結果再偏移 delta 後儲存到 dst。
void cv::sepFilter2D目標影像深度,請參閱 組合
kernelX用於濾波每行的係數。
anchor用於濾波每列的係數。
delta卷積核內的錨點位置。預設值 \((-1,-1)\) 表示錨點位於卷積核中心。
borderType像素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
參見
在儲存之前添加到濾波結果的值。

◆ Sobel 算子()

void cv::Sobel ( InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
int ksize = 3,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT )
Python
cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) -> dst

#include <opencv2/imgproc.hpp>

使用擴展的 Sobel 算子計算一階、二階、三階或混合影像導數。

除了一種情況外,在所有情況下都使用 \(\texttt{ksize} \times \texttt{ksize}\) 可分離卷積核來計算導數。當 \(\texttt{ksize = 1}\) 時,使用 \(3 \times 1\) 或 \(1 \times 3\) 卷積核(即不進行高斯平滑)。`ksize = 1` 只能用於一階或二階的 x 或 y 導數。

還有一個特殊值 `ksize = #FILTER_SCHARR (-1)`,它對應於 \(3\times3\) 的 Scharr 濾波器,可能比 \(3\times3\) 的 Sobel 提供更精確的結果。Scharr 光圈為

\[\vecthreethree{-3}{0}{3}{-10}{0}{10}{-3}{0}{3}\]

用於 x 方向導數,或轉置用於 y 方向導數。

此函數透過將影像與適當的卷積核進行卷積來計算影像導數

\[\texttt{dst} = \frac{\partial^{xorder+yorder} \texttt{src}}{\partial x^{xorder} \partial y^{yorder}}\]

Sobel 算子結合了高斯平滑和微分,因此結果或多或少能抵抗雜訊。通常,函數會以 (xorder = 1, yorder = 0, ksize = 3) 或 (xorder = 0, yorder = 1, ksize = 3) 呼叫,以計算一階 x 或 y 影像導數。第一種情況對應的卷積核為

\[\vecthreethree{-1}{0}{1}{-2}{0}{2}{-1}{0}{1}\]

第二種情況對應的卷積核為

\[\vecthreethree{-1}{-2}{-1}{0}{0}{0}{1}{2}{1}\]

參數
src輸入影像。
dst與 src 具有相同大小和通道數的輸出影像。
ddepth輸出影像深度,請參閱 組合;對於 8 位元輸入影像,將導致導數截斷。
dxx 方向導數的階數。
dyy 方向導數的階數。
ksize擴展 Sobel 卷積核的大小;必須是 1, 3, 5 或 7。
scale計算出的導數值的選用縮放因子;預設情況下不應用縮放(詳情請參閱 getDerivKernels)。
delta在將結果儲存到 dst 之前添加的選用 delta 值。
borderType像素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
參見
Scharr, Laplacian, sepFilter2D, filter2D, GaussianBlur, cartToPolar

◆ 空間梯度()

void cv::spatialGradient ( InputArray src,
OutputArray dx,
OutputArray dy,
int ksize = 3,
int borderType = BORDER_DEFAULT )
Python
cv.spatialGradient(src[, dx[, dy[, ksize[, borderType]]]]) -> dx, dy

#include <opencv2/imgproc.hpp>

使用 Sobel 算子計算 x 和 y 方向的一階影像導數。

等同於呼叫

Sobel( src, dx, CV_16SC1, 1, 0, 3 );
Sobel( src, dy, CV_16SC1, 0, 1, 3 );
#define CV_16SC1
Definition interface.h:106
void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT)
使用擴展的 Sobel 算子計算一階、二階、三階或混合影像導數。
參數
src輸入影像。
dx具有 x 方向一階導數的輸出影像。
dy具有 y 方向一階導數的輸出影像。
ksizeSobel 卷積核的大小。必須是 3。
borderType像素外推方法,請參閱 BorderTypes。僅支援 BORDER_DEFAULT=BORDER_REFLECT_101BORDER_REPLICATE
參見
Sobel

◆ 平方方框濾波器()

void cv::sqrBoxFilter ( InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor = Point(-1, -1),
bool normalize = true,
int borderType = BORDER_DEFAULT )
Python
cv.sqrBoxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) -> dst

#include <opencv2/imgproc.hpp>

計算與濾波器重疊的像素值平方和的正規化結果。

對於來源影像中的每個像素 \( (x, y) \),函數計算那些與放置在像素 \( (x, y) \) 上的濾波器重疊的鄰近像素值的平方和。

未歸一化的平方方框濾波器可用於計算局部影像統計量,例如像素鄰域周圍的局部變異數和標準差。

參數
src輸入影像
dst與 src 具有相同大小和類型的輸出影像
ddepth輸出影像深度(-1 表示使用 src.depth())
ksize卷積核大小
anchor卷積核錨點。預設值 Point(-1, -1) 表示錨點位於卷積核中心。
normalize標誌,指定卷積核是否按其面積歸一化。
borderType用於外推影像外部像素的邊界模式,請參閱 BorderTypesBORDER_WRAP 不受支援。
參見
boxFilter

◆ 堆疊模糊()

void cv::stackBlur ( InputArray src,
OutputArray dst,
Size ksize )
Python
cv.stackBlur(src, ksize[, dst]) -> dst

#include <opencv2/imgproc.hpp>

使用 stackBlur 模糊影像。

此函數將堆疊模糊應用於影像。堆疊模糊可以產生與高斯模糊相似的結果,並且時間消耗不會隨卷積核大小的增加而增加。它在掃描影像時創建一種移動的顏色堆疊。因此,它只需在堆疊的右側添加一個新的顏色塊,並移除最左側的顏色。堆疊頂層的其餘顏色,取決於它們位於堆疊的右側還是左側,會被添加或減少一格。唯一支援的 borderType 是 BORDER_REPLICATE。原始論文由 Mario Klingemann 提出,可在 https://underdestruction.com/2004/02/25/stackblur-2004 找到。

參數
src輸入影像。通道數可以是任意值,但深度應為 CV_8U、CV_16U、CV_16S 或 CV_32F 之一。
dst與 src 具有相同大小和類型的輸出影像。
ksize堆疊模糊卷積核大小。ksize.width 和 ksize.height 可以不同,但它們都必須是正奇數。