OpenCV()

做梦当财神發表於2024-09-14

目錄
  • 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  // 邊界插值方法
);

引數:

  1. src (輸入影像):

    • 輸入影像可以是 1 通道(灰度圖)或 3 通道(彩色圖)。
    • 型別可以是 8 位、16 位或 32 位浮點型別。
  2. dst (輸出影像):

    • 與輸入影像具有相同的大小和型別,儲存模糊後的影像。
  3. ksize (核大小):

    • Size(kwidth, kheight) 是濾波器的寬度和高度,決定了卷積核的大小,必須是正數。核的大小越大,影像的模糊程度越明顯。
    • 常見的值為 (3, 3),即 3x3 的均值濾波器,這會對周圍 8 個畫素以及中心畫素進行平均計算。
  4. anchor (錨點):

    • 錨點是指濾波器的中心點在影像中的位置,預設值為 Point(-1, -1),表示使用濾波器的中心點作為錨點。可以自定義錨點來控制濾波的方式,但一般情況下使用預設值。
  5. 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. 應用場景

  1. 去除影像噪聲: 在對影像進行邊緣檢測之前,透過均值濾波可以減少噪聲的干擾,使得邊緣檢測效果更加精確。
  2. 影像平滑: 在影像處理中,模糊操作有時用於簡化影像的細節,從而突出更大的結構。
  3. 去除過多的細節: 某些情況下,影像的過多細節會影響後續處理,使用均值濾波可以有效降低這種影響。

cv::blur() 是一種簡單的線性濾波器,適用於基本的影像平滑和降噪任務。在更高階的影像處理需求中,可能會使用其他濾波器如高斯模糊(cv::GaussianBlur())或者中值濾波(cv::medianBlur())。



相關文章