opencv(C++) 圖像濾波

文章目錄

    • 介紹
    • 使用低通濾波器對圖像進行濾波
      • 工作原理
        • 均值濾波器(Mean Filter / Box Filter)
        • 高斯濾波器(Gaussian Filter)
      • 案例實現
    • 通過濾波實現圖像的下采樣
      • 工作原理
      • 實現案例
      • 插值像素值(Interpolating pixel values)
        • 雙線性插值(Bilinear interpolation)
        • 雙三次插值(Bicubic interpolation)
    • 使用中值濾波器處理圖像
      • 工作原理
      • 案例實現
    • 應用方向濾波器檢測邊緣
      • 使用 Sobel 方向濾波器進行邊緣檢測
        • 工作原理
        • 案例實現
      • 梯度算子(Gradient Operators)
      • 高斯濾波器的導數(Gaussian derivatives)
    • 圖像拉普拉斯變換
      • 案例實現
      • 使用拉普拉斯增強圖像對比度
      • 高斯差分(Difference of Gaussians, DoG)

介紹

圖像是由不同的灰度(或顏色)模式組成的。圖像之間的區別在于它們的灰度分布不同。然而,還可以從另一個角度來分析圖像——觀察圖像中灰度值的變化

一些圖像包含大面積幾乎恒定的亮度區域(例如藍天),而另一些圖像中的灰度值變化非常迅速(例如擁擠的小物體場景)。因此,觀察圖像中這些變化的頻率是表征圖像的另一種方式。這種視角被稱為頻率域(frequency domain),而通過觀察灰度分布來描述圖像的方式稱為空間域(spatial domain)

頻率域分析將圖像分解為從最低到最高的頻率成分。圖像中亮度變化緩慢的區域僅包含低頻成分,而高頻成分則來源于亮度的快速變化。

如傅里葉變換或余弦變換,可以明確顯示圖像的頻率內容。由于圖像是二維的,它同時包含垂直方向和水平方向的頻率。
在頻率域分析框架下,濾波是一種增強(或保留)某些頻率帶、同時抑制其他頻率帶的操作。
低通濾波器(low-pass filter)會消除圖像的高頻成分;相反,高通濾波器(high-pass filter)會消除低頻成分。

使用低通濾波器對圖像進行濾波

低通濾波器是一種線性濾波器,其核心思想是用一個卷積核(kernel) 對圖像中的每個像素進行加權平均操作。
低通濾波器的主要作用是對圖像進行模糊和平滑。因為這種濾波器會抑制高頻成分,而高頻成分正是圖像邊緣處快速變化所對應的特征
OpenCV 提供了多種低通濾波方法,用于平滑圖像、去除噪聲、模糊細節。主要函數包括:

  • cv::blur():均值濾波
  • cv::GaussianBlur():高斯濾波

工作原理

均值濾波器(Mean Filter / Box Filter)

每個像素被替換為它周圍區域像素的平均值;
卷積核中所有權重相同(例如 3x3 均值濾波核如下):
在這里插入圖片描述
函數:cv::blur() 或 cv::boxFilter();
效果:模糊圖像、去噪,但邊緣會變得模糊不清

高斯濾波器(Gaussian Filter)

使用一個服從高斯分布的卷積核;
中心像素權重最大,遠離中心的像素權重逐漸減小;
更好地保留邊緣信息;
函數:cv::GaussianBlur();
示例核大小:5x5,σ=1.5;
可分離計算:先水平方向,再垂直方向,提高效率;

像素的權重與其到中心像素的距離成反比。一維高斯函數的形式如下:
在這里插入圖片描述
歸一化系數 A 的選取使得高斯曲線下的面積等于 1。σ(sigma)值控制了高斯函數的寬度。σ 越大,函數越平坦。
例如,在 σ = 0.5 時,計算區間 [-4, 0, 4] 上的一維高斯濾波器系數,得到如下結果:

[0.0  0.0  0.00026  0.10645  0.78657  0.10645  0.00026  0.0  0.0]

當 σ = 1.5 時,系數變為:

[0.0076  0.03608  0.1096  0.2135  0.2667  0.2135  0.1096  0.0361  0.0076]

這些系數可以通過調用 OpenCV 函數 cv::getGaussianKernel 得到:

cv::Mat gauss = cv::getGaussianKernel(9, sigma, CV_32F);

調用 cv::GaussianBlur() 時:
可指定核大小和 σ 值;
若將 σ 設為 0,則 OpenCV 自動根據核大小選擇合適的 σ;
若將核大小設為 cv::Size(0, 0),則自動根據 σ 計算核大小。

兩種 σ 值對應的高斯曲線如圖所示。高斯函數對稱的“鐘形”形狀使其成為濾波的理想選擇。
在這里插入圖片描述
距離中心越遠的像素權重越低,從而使得像素之間的過渡更加平滑。這與均值濾波中遠離中心的像素可能引起當前平均值突變的情況形成對比。從頻率角度看,這意味著均值濾波并不能完全去除所有高頻成分。

要對圖像應用二維高斯濾波器,可以先對圖像的每一行應用一維高斯濾波器(用于濾除水平方向的高頻),然后再對圖像的每一列應用一維高斯濾波器(用于濾除垂直方向的高頻)。因為高斯濾波器是可分離濾波器(即二維核可以分解為兩個一維核)。OpenCV 中提供了 cv::sepFilter2D 函數用于實現一般的可分離濾波。也可以直接使用 cv::filter2D 應用一個二維核。一般來說,可分離濾波器由于所需乘法運算更少,因此計算效率更高。

在 OpenCV 中使用 cv::GaussianBlur 函數時,可以同時指定核的大小(第三個參數,必須為奇數)和 σ 值(第四個參數)。你也可以只設置 σ 值,讓 OpenCV 自動決定合適的核大小(此時核大小設為 0);或者反之,輸入核大小并設置 σ 為 0,OpenCV 將根據核大小自動確定最合適的 σ 值。

案例實現

#include <opencv2/opencv.hpp>int main() {// 讀取圖像(灰度圖)cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cerr << "無法加載圖像!" << std::endl;return -1;}cv::Mat blurResult, gaussianResult;// 均值濾波(Box Filter)cv::blur(image, blurResult, cv::Size(5, 5));// 高斯濾波cv::GaussianBlur(image, gaussianResult, cv::Size(5, 5), 1.5);// 顯示結果cv::imshow("Original", image);cv::imshow("Blur Result", blurResult);cv::imshow("Gaussian Result", gaussianResult);cv::waitKey(0);return 0;
}

在這里插入圖片描述
在這里插入圖片描述

#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 1. 讀取圖像(灰度圖)cv::Mat image = cv::imread(IMAGE_1, cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cerr << "無法加載圖像,請確認路徑是否正確!" << std::endl;return -1;}// 2. 定義高斯濾波參數int kernelSize = 5;  // 核大小(必須為奇數)double sigma = 1.5;  // 高斯標準差// 3. 應用高斯濾波cv::Mat filteredImage;cv::GaussianBlur(image, filteredImage, cv::Size(kernelSize, kernelSize), sigma);// 4. 可選:獲取并顯示一維高斯核(用于理解權重分布)cv::Mat gaussianKernel = cv::getGaussianKernel(kernelSize, sigma, CV_32F);std::cout << "一維高斯核(kernel size = " << kernelSize << ", sigma = " << sigma << "):\n" << gaussianKernel << std::endl;// 5. 顯示結果cv::imshow("Original Image", image);cv::imshow("Gaussian Filtered Image", filteredImage);// 等待按鍵關閉窗口cv::waitKey(0);cv::destroyAllWindows();return 0;
}

在這里插入圖片描述

在這里插入圖片描述

通過濾波實現圖像的下采樣

圖像經常需要調整大小(重采樣)。將圖像尺寸縮小的過程通常稱為下采樣,而放大則稱為上采樣。執行這些操作面臨的挑戰是盡可能保留圖像的視覺質量。為了實現這一目標,通常使用低通濾波器來去除高頻成分,防止出現混疊(aliasing)現象。

圖像中包含的高頻信息(如細節、邊緣)在縮小后無法被小尺寸圖像正確表示,從而產生空間混疊。
因此,在下采樣前應先應用低通濾波器。

工作原理

  • 圖像縮小前必須進行低通濾波,以去除不能在小尺寸圖像中正確表示的高頻成分;
  • 理論依據是 奈奎斯特-香農采樣定理:若將圖像縮小 N 倍,則可表示的頻率范圍也減少 N 倍;
  • OpenCV 提供了封裝函數 cv::pyrDown() 和 cv::resize() 來簡化操作。
cv::Mat reduced;
cv::pyrDown(image, reduced); // 縮小為原來的一半

cv::pyrDown() 內部使用了一個 5x5 的高斯核進行濾波后再下采樣。

cv::Mat resized;
cv::resize(image, resized, cv::Size(image.cols / 4

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81540.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖論學習筆記 4 - 仙人掌圖

先扔張圖&#xff1a; 為了提前了解我們采用的方法&#xff0c;請先閱讀《圖論學習筆記 3》。 仙人掌圖的定義&#xff1a;一個連通圖&#xff0c;且每條邊只出現在至多一個環中。 這個圖就是仙人掌圖。 這個圖也是仙人掌圖。 而這個圖就不是仙人掌圖了。 很容易發現&#xf…

華為OD機試真題——洞穴探險(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 200分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

Java設計模式之職責鏈模式詳解

Java設計模式之職責鏈模式詳解 一、職責鏈模式核心思想 核心目標&#xff1a;將請求的發送者與接收者解耦&#xff0c;使多個對象都有機會處理請求。這些處理者形成鏈式結構&#xff0c;請求沿鏈傳遞直到被處理或到達鏈尾&#xff0c;如政府審批層層上報機制。 二、職責鏈模式…

解決WPF短暫的白色閃爍(白色閃屏)

在 WPF 應用程序啟動時出現 短暫的白色閃爍&#xff08;白色閃屏&#xff09;&#xff0c;通常是由于以下原因導致的&#xff1a; 主要原因 WPF 默認窗口背景是白色&#xff0c;在加載 UI 之前會短暫顯示白色背景。 解決方案 設置窗口背景為透明或黑色&#xff08;推薦&…

《Python基礎》第1期:人生苦短,我用Python

介紹 Python 在英語中是蟒蛇的意思&#xff0c;它的 logo 也是兩條蟒蛇纏繞在一起。 然而 Python 和蟒蛇實際上沒有半點關系。 Python 是由荷蘭程序員 Guido van Rossum&#xff08;因為其名字的前三個字母“gui”是中文“龜”的拼音&#xff0c;所以江湖人稱“龜叔”&#x…

DiT、 U-Net 與自回歸模型的優勢

DiT 相對于 U-Net 的優勢 全局自注意力 vs. 局部卷積 U-Net 依賴卷積和池化/上采樣來逐層擴大感受野&#xff0c;捕捉全局信息需要堆疊很多層或借助跳躍連接&#xff08;skip connections&#xff09;。DiT 在每個分辨率階段都用 Transformer 模塊&#xff08;多頭自注意力 ML…

怎么查找idea插件的下載位置,并更改

長期使用 IntelliJ IDEA 時&#xff0c;默認存儲在 C 盤的配置文件會持續生成大量緩存和日志文件&#xff0c;可能導致系統盤空間不足。通過修改默認配置文件存儲位置&#xff0c;可以有效釋放 C 盤空間并提升系統性能。 1&#xff0c;先找到自己idea的下載目錄&#xff0c;再打…

IoT/HCIP實驗-1/物聯網開發平臺實驗Part2(HCIP-IoT實驗手冊版)

文章目錄 概述產品和設備實例的產品和設備產品和設備的關聯單個產品有多個設備為產品創建多個設備產品模型和物模型設備影子&#xff08;遠程代理&#xff09; 新建產品模型定義編解碼插件開發編解碼插件工作原理消息類型與二進制碼流添加消息&#xff08;數據上報消息&#xf…

15.進程間通信(一)

一、進程間通信介紹 進程間通信目的&#xff1a; 數據傳輸&#xff1a;一個進程需要將它的數據發送給另?個進程 資源共享&#xff1a;多個進程之間共享同樣的資源。 通知事件&#xff1a;一個進程需要向另一個或一組進程發送消息&#xff0c;通知它&#xff08;它們&#xf…

05-jenkins學習之旅-vue前項目部署實踐

1、創建被管理項目 2、構建流程說明 jenkins其實就是將服務部署拆分成了&#xff1a; 1、拉取代碼(git) 2、打包編譯(npm install) 3、自定義腳本(dist復制、執行啟動腳本) 4、部署成功后的一些通知等 3、demo配置 3.1、General 3.2 源碼管理 添加用戶名密碼方式如下圖 3.2…

服務器中分布式存儲數據技術都包含哪些內容?

隨著大數據時代的到來&#xff0c;企業和組織對于服務器的存儲要求也在不斷地增高&#xff0c;傳統的存儲架構已經無法滿足一些大規模的數據存儲和處理需求&#xff0c;分布式存儲技術應運而生&#xff0c;成為了大數據存儲的重要基礎設施&#xff0c;下面&#xff0c;就來介紹…

從比分滾動到數據革命:體育數據如何重構我們的觀賽體驗?

當凌晨三點的歐冠決賽與鬧鐘沖突時&#xff0c;當世界杯小組賽因時差難以全程跟進時&#xff0c;當代體育迷早已不再依賴電視直播 —— 打開手機里的比分網&#xff0c;實時跳動的體育大數據正構建著全新的觀賽宇宙。這些曾經被視為 "輔助工具" 的平臺&#xff0c;如…

vue2使用element中多選組件el-checkbox-group,數據與UI更新不同步

問題描述 使用element多選checkbox組件&#xff0c;點擊勾選取消勾選&#xff0c;視圖未變化&#xff0c;再次點擊表單其他元素&#xff0c;多選組件勾選狀態發生變化&#xff0c;視圖和數據未同步 第一次嘗試&#xff1a;再el-checkbox-group多選父組件上增加點擊事件&…

CodeTop之LRU緩存

題目鏈接 146. LRU 緩存 - 力扣&#xff08;LeetCode&#xff09; 題目解析 算法原理 我們使用雙向鏈表哈希表的形式來模擬緩存機制 首先我們要自己實現一個雙鏈表, 自己寫一個內部類, 這個內部類記錄了key,value,prev,next(前驅和后繼), 后續我們就通過這個內部類來構造雙…

PyQt學習系列11-綜合項目:多語言文件管理器

PyQt學習系列筆記&#xff08;Python Qt框架&#xff09; 第十一課&#xff1a;綜合項目 - 多語言文件管理器 &#xff08;原課程規劃中的第十五課&#xff0c;按用戶要求調整為第十一課&#xff09; 課程目標 綜合運用PyQt框架開發一個支持多語言的文件管理器實現以下核心功…

【Ubuntu修改串口延時(Latency Timer)為1毫秒(設備拔插或系統重啟后自動生效)】

Ubuntu修改串口延時Latency Timer為1毫秒-設備拔插或系統重啟后自動生效 在Ubuntu系統中&#xff0c;串口設備的延時參數(latency_timer)可以通過udev規則永久修改。以下是完整步驟&#xff1a; 創建udev規則文件 sudo vim /etc/udev/rules.d/99-ftdi-low-latency.rules添加以…

OpenCV CUDA模塊圖像處理------顏色空間處理之GPU 上交換圖像的通道順序函數swapChannels()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于在 GPU 上交換圖像的通道順序&#xff08;例如將 BGR 圖像轉為 RGB&#xff09;。 它適用于多通道圖像&#xff08;如 3 通道或 4 通道…

Linux Ubuntu24.04配置安裝MySQL8.4.5高可用集群主從復制!

MySQL 主從復制&#xff08;Replication&#xff09;是實現數據高可用、讀寫分離及異地容災的核心機制之一。主庫寫、從庫讀&#xff0c;提升并發能力&#xff1b;讀寫分離&#xff0c;減輕主庫壓力。 本地 windows 系統有一個Linux Ubuntu子系統&#xff0c;版本為Ubuntu 24.…

R基于邏輯回歸模型實現心臟病檢測及SHAP值解釋項目實戰

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔視頻講解&#xff09;&#xff0c;如需數據代碼文檔視頻講解可以直接到文章最后關注獲取。 1.項目背景 心血管疾病是全球范圍內導致死亡的主要原因之一&#xff0c;每年有數百萬人因此失去生命。在眾多的…

嵌入式學習筆記 -函數嵌套時以及異常響應時,LR使用的具體過程

函數嵌套時以及異常響應時&#xff0c;寄存器LR的作用存在顯著區別&#xff0c;理解這個問題對于理解freeRTOS底層代碼的實現大有幫助&#xff0c;具體使用過程如下&#xff1a; 一 函數嵌套時的LR使用的具體過程 在ARM架構(特別是M0處理器)中&#xff0c;函數嵌套調用時LR(L…