OpenCV 4.13.0
開源計算機視覺庫 (Open Source Computer Vision)
正在載入...
正在搜尋...
未找到匹配項
影像濾波

詳細說明

本節描述的函式和類用於對二維影像(以 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 將輸入資料轉換為所需的精度。

列舉

enum  cv::MorphShapes {
  cv::MORPH_RECT = 0 ,
  cv::MORPH_CROSS = 1 ,
  cv::MORPH_ELLIPSE = 2 ,
  cv::MORPH_DIAMOND = 3
}
 結構元素的形狀 更多...
 
enum  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
}
 形態學操作型別 更多...
 
enum  cv::SpecialFilter { cv::FILTER_SCHARR = -1 }
 

函式

void cv::bilateralFilter (InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)
 對影像應用雙邊濾波。
 
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)
 使用框式濾波模糊影像。
 
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)
 將影像與卷積核進行卷積。
 
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)
 計算影像的拉普拉斯運算元。
 
void cv::medianBlur (InputArray src, OutputArray dst, int ksize)
 使用中值濾波器模糊影像。
 
static Scalar cv::morphologyDefaultBorderValue ()
 返回腐蝕和膨脹的“魔術”邊界值。在膨脹操作中,它會自動轉換為 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)
 模糊並下采樣影像。
 
void cv::pyrMeanShiftFiltering (InputArray src, OutputArray dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1))
 執行影像均值漂移分割的初始步驟。
 
void cv::pyrUp (InputArray src, OutputArray dst, const Size &dstsize=Size(), int borderType=BORDER_DEFAULT)
 上取樣並模糊影像。
 
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 模糊影像。
 

列舉型別文件 (Enumeration Type Documentation)

◆ MorphShapes

#include <opencv2/imgproc.hpp>

結構元素的形狀

列舉值 (Enumerator)
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

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

◆ MorphTypes

#include <opencv2/imgproc.hpp>

形態學操作型別

列舉值 (Enumerator)
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

“擊中擊不中”運算。僅支援 CV_8UC1 二值影像。教程可以在文件中找到。

◆ SpecialFilter

#include <opencv2/imgproc.hpp>

列舉值 (Enumerator)
FILTER_SCHARR 
Python: cv.FILTER_SCHARR

函式文件 (Function Documentation)

◆ bilateralFilter()

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>

對影像應用雙邊濾波。

該函式對輸入影像應用雙邊濾波,如 https://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html 中所述。bilateralFilter 可以非常好地減少不必要的噪聲,同時保持邊緣相當清晰。但是,與大多數濾波器相比,它的速度非常慢。

Sigma 值:為簡單起見,您可以將 2 個 sigma 值設定為相同。如果它們很小(< 10),濾波器將不會有太大效果;而如果它們很大(> 150),它們將產生非常強烈的效果,使影像看起來像“卡通畫”。

濾波器大小:大型濾波器(d > 5)非常慢,因此建議即時應用使用 d=5,對於需要重度噪聲過濾的離線應用,建議使用 d=9。

此濾波器不支援就地 (inplace) 操作。

引數
src源 8 位或浮點型,1 通道或 3 通道影像。
dst目標影像,與 src 具有相同的大小和型別。
d濾波期間使用的每個畫素鄰域的直徑。如果它是非正數,則從 sigmaSpace 計算得出。
sigmaColor顏色空間中的濾波器 sigma。該引數值越大,畫素鄰域內(參見 sigmaSpace)較遠顏色將被混合在一起,從而產生更大的半等色區域。
sigmaSpace座標空間中的濾波器 sigma。該引數值越大,只要顏色足夠接近(參見 sigmaColor),較遠的畫素就會相互影響。當 d>0 時,它指定鄰域大小而不考慮 sigmaSpace。否則,d 與 sigmaSpace 成正比。
borderType用於外推影像外部畫素的邊界模式,請參閱 BorderTypes

◆ blur()

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用於外推影像外部畫素的邊界模式,請參閱 BorderTypes。不支援 BORDER_WRAP
另請參閱
boxFilter, bilateralFilter, GaussianBlur, medianBlur

◆ boxFilter()

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>

使用框式濾波模糊影像。

該函式使用核心平滑影像

\[\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用於外推影像外部畫素的邊界模式,請參閱 BorderTypes。不支援 BORDER_WRAP
另請參閱
blur, bilateralFilter, GaussianBlur, medianBlur, integral

◆ buildPyramid()

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最後一層(最小層)金字塔的從 0 開始的索引。它必須是非負數。
borderType畫素外推方法,請參閱 BorderTypes(不支援 BORDER_CONSTANT

◆ dilate()

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

◆ erode()

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>

將影像與卷積核進行卷積。

該函式對影像應用任意線性濾波器。支援就地操作。當光圈部分位於影像外部時,函式會根據指定的邊界模式插值離群畫素值。

該函式實際上計算的是相關性,而不是卷積

\[\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

◆ GaussianBlur()

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

◆ getDerivKernels()

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。

◆ getGaborKernel()

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。

◆ getGaussianKernel()

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

◆ getStructuringElement()

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)\) 表示錨點位於中心。注意,只有十字形元素的形狀取決於錨點位置。在其他情況下,錨點僅調節形態學操作結果的偏移量。

◆ Laplacian()

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>

計算影像的拉普拉斯運算元。

該函式透過將使用 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可選的 delta 值,在將結果儲存到 dst 之前新增到結果中。
borderType畫素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
另請參閱
Sobel, Scharr

◆ medianBlur()

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

◆ morphologyDefaultBorderValue()

static Scalar cv::morphologyDefaultBorderValue ( )
inlinestatic

#include <opencv2/imgproc.hpp>

返回腐蝕和膨脹的“魔術”邊界值。在膨脹操作中,它會自動轉換為 Scalar::all(-DBL_MAX)。

此函式的呼叫圖

◆ morphologyEx()

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) 等同於依次應用:腐蝕 -> 腐蝕 -> 膨脹 -> 膨脹(而不是 腐蝕 -> 膨脹 -> 腐蝕 -> 膨脹)。

◆ pyrDown()

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>

模糊並下采樣影像。

預設情況下,輸出影像的大小計算為 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

◆ pyrMeanShiftFiltering()

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>

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

該函式實現了均值漂移分割的濾波階段,即函式的輸出是經過濾波的“海報化”影像,顏色梯度和細粒度紋理被平滑。在輸入影像(或縮小尺寸後的輸入影像,見下文)的每個畫素 (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) 處的顏色分量向量(儘管該演算法不依賴於所使用的顏色空間,因此可以使用任何三分量顏色空間)。在鄰域上尋找平均空間值 (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終止標準:何時停止均值漂移迭代。

◆ pyrUp()

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>

上取樣並模糊影像。

預設情況下,輸出影像的大小計算為 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可選的 delta 值,在將結果儲存到 dst 之前新增到結果中。
borderType畫素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
另請參閱
cartToPolar

◆ sepFilter2D()

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 )
Python
cv.sepFilter2D(src, ddepth, kernelX, kernelY[, dst[, anchor[, delta[, borderType]]]]) -> dst

#include <opencv2/imgproc.hpp>

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

該函式對影像應用可分離線性濾波器。也就是說,首先,src 的每一行都使用一維核心 kernelX 進行濾波。然後,結果的每一列都使用一維核心 kernelY 進行濾波。最終結果偏移 delta 後儲存在 dst 中。

引數
src源影像。
dst目標影像,與 src 具有相同的大小和通道數。
ddepth目標影像深度,參見 深度組合
kernelX用於過濾每一行的係數。
kernelY用於過濾每一列的係數。
錨點 (anchor)核心內的錨點位置。預設值 \((-1,-1)\) 表示錨點位於核心中心。
delta在儲存之前新增到濾波結果中的值。
borderType畫素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
另請參閱
filter2D, Sobel, GaussianBlur, boxFilter, blur

◆ 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可選的 delta 值,在將結果儲存到 dst 之前新增到結果中。
borderType畫素外推方法,請參閱 BorderTypes。不支援 BORDER_WRAP
另請參閱
Scharr, Laplacian, sepFilter2D, filter2D, GaussianBlur, cartToPolar

◆ spatialGradient()

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
定義 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

◆ sqrBoxFilter()

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用於外推影像外部畫素的邊界模式,請參閱 BorderTypes。不支援 BORDER_WRAP
另請參閱
boxFilter

◆ stackBlur()

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

#include <opencv2/imgproc.hpp>

使用 stackBlur 模糊影像。

該函式對影像應用 stackBlur。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 可以不同,但它們必須都是正數且為奇數。