目錄
- 1. 函式定義
- 2. 工作原理
- 3. 示例
- 4. 效果說明
- 5. 應用場景
cv::blur()
是 OpenCV 提供的一個用於影像模糊處理的函式,它透過卷積運算對影像進行均值濾波。這個函式對於消除噪聲、平滑影像非常有效,尤其是在邊緣檢測等操作之前常用。
1. 函式定義
void cv::blur(
InputArray src, // 輸入影像
OutputArray dst, // 輸出影像
Size ksize, // 濾波器的核大小
Point anchor = Point(-1, -1), // 錨點,預設為核中心
int borderType = BORDER_DEFAULT // 邊界插值方法
);
引數:
-
src
(輸入影像):- 輸入影像可以是 1 通道(灰度圖)或 3 通道(彩色圖)。
- 型別可以是 8 位、16 位或 32 位浮點型別。
-
dst
(輸出影像):- 與輸入影像具有相同的大小和型別,儲存模糊後的影像。
-
ksize
(核大小):Size(kwidth, kheight)
是濾波器的寬度和高度,決定了卷積核的大小,必須是正數。核的大小越大,影像的模糊程度越明顯。- 常見的值為
(3, 3)
,即 3x3 的均值濾波器,這會對周圍 8 個畫素以及中心畫素進行平均計算。
-
anchor
(錨點):- 錨點是指濾波器的中心點在影像中的位置,預設值為
Point(-1, -1)
,表示使用濾波器的中心點作為錨點。可以自定義錨點來控制濾波的方式,但一般情況下使用預設值。
- 錨點是指濾波器的中心點在影像中的位置,預設值為
-
borderType
(邊界型別):- 定義當卷積核接觸到影像邊緣時如何處理邊界外的畫素。常見的值包括:
BORDER_CONSTANT
: 填充固定常量值。BORDER_REPLICATE
: 重複邊緣畫素。BORDER_REFLECT
: 映象反射邊界。BORDER_WRAP
: 用對面影像邊緣的畫素填充。BORDER_DEFAULT
是 OpenCV 預設值,通常為BORDER_REFLECT_101
。
- 定義當卷積核接觸到影像邊緣時如何處理邊界外的畫素。常見的值包括:
2. 工作原理
cv::blur()
使用均值濾波器(mean filter)對影像進行平滑處理。其基本原理是透過一個核視窗(由 ksize
定義)在影像上滑動,對核視窗內的畫素求平均值,並將該值賦給輸出影像中對應位置的畫素。公式如下:
\[dst(x, y) = \frac{1}{kwidth \times kheight} \sum_{i=0}^{kwidth-1} \sum_{j=0}^{kheight-1} src(x+i, y+j)
\]
src(x+i, y+j)
是原影像在核視窗中的畫素值。dst(x, y)
是輸出影像中的模糊畫素值。
3. 示例
#include <opencv2/opencv.hpp>
int main() {
// 讀取輸入影像
cv::Mat src = cv::imread("input.jpg");
// 輸出影像
cv::Mat dst;
// 使用3x3均值濾波器模糊處理
cv::blur(src, dst, cv::Size(3, 3));
// 顯示原始影像和模糊影像
cv::imshow("Original Image", src);
cv::imshow("Blurred Image", dst);
cv::waitKey(0);
return 0;
}
4. 效果說明
- 小的核大小(例如
3x3
)會導致輕微模糊,適合去除細微噪聲。 - 較大的核大小(例如
15x15
)會導致明顯模糊,使得影像變得平滑,但也會失去很多細節。
5. 應用場景
- 去除影像噪聲: 在對影像進行邊緣檢測之前,透過均值濾波可以減少噪聲的干擾,使得邊緣檢測效果更加精確。
- 影像平滑: 在影像處理中,模糊操作有時用於簡化影像的細節,從而突出更大的結構。
- 去除過多的細節: 某些情況下,影像的過多細節會影響後續處理,使用均值濾波可以有效降低這種影響。
cv::blur()
是一種簡單的線性濾波器,適用於基本的影像平滑和降噪任務。在更高階的影像處理需求中,可能會使用其他濾波器如高斯模糊(cv::GaussianBlur()
)或者中值濾波(cv::medianBlur()
)。