c/c++的opencv椒鹽噪聲

在 C/C++ 中實現椒鹽噪聲

椒鹽噪聲(Salt-and-Pepper Noise),也稱為脈沖噪聲(Impulse Noise),是數字圖像中常見的一種噪聲類型。它的特點是在圖像中隨機出現純白色(鹽)或純黑色(椒)的像素點,看起來就像在圖像上撒了鹽和胡椒一樣。這種噪聲通常由圖像傳感器、傳輸錯誤或存儲介質損壞等原因引起。

本文將介紹椒鹽噪聲的基本原理,并提供一個使用 C/C++ 實現向圖像添加椒鹽噪聲的示例。

什么是椒鹽噪聲?

椒鹽噪聲會隨機地將圖像中的一些像素替換為最大值(通常是255,代表“鹽”像素,即白色)或最小值(通常是0,代表“椒”像素,即黑色)。其他未受影響的像素則保持其原始值。

主要特點:

  • 外觀: 圖像中散布著孤立的亮點和暗點。
  • 影響: 噪聲像素的值與周圍像素的值有顯著差異。
  • 密度: 椒鹽噪聲的強度通常用噪聲密度來描述,即圖像中受噪聲污染的像素所占的百分比。

添加椒鹽噪聲的算法

向圖像添加椒鹽噪聲的基本算法步驟如下:

  1. 遍歷圖像像素: 依次處理圖像中的每一個像素,或者隨機選擇一定比例的像素進行處理。
  2. 生成隨機數: 對每個待處理的像素,生成一個隨機數(通常在 [0, 1] 區間內)。
  3. 判斷是否添加噪聲:
    • 將此隨機數與預設的噪聲密度閾值 d 進行比較。如果隨機數小于 d,則該像素將被噪聲污染。
  4. 確定噪聲類型(鹽或椒):
    • 如果像素被確定為噪聲點,則再生成一個隨機數(例如,也在 [0, 1] 區間內)。
    • 根據這個新的隨機數決定是添加“鹽”噪聲還是“椒”噪聲。例如,可以設定一個概率 p_salt(通常為0.5),如果隨機數小于 p_salt,則將像素值設為最大值(如255);否則,設為最小值(如0)。
  5. 保持原樣: 如果步驟3中判斷像素不被噪聲污染,則其像素值保持不變。

C/C++ 實現示例

下面是一個簡單的 C/C++ 函數,用于向灰度圖像(以二維數組表示)添加椒鹽噪聲。為了簡化,我們假設像素值范圍是 0 到 255。

#include <iostream>
#include <vector>
#include <cstdlib> // 用于 rand() 和 srand()
#include <ctime>   // 用于 time()// 假設圖像數據結構
// 這里使用 std::vector<std::vector<int>> 來表示灰度圖像
// 實際應用中可能是自定義的圖像類或指向像素數據的指針/*** @brief 向灰度圖像添加椒鹽噪聲* @param image 圖像數據 (引用傳遞,會被直接修改)* @param noiseDensity 噪聲密度 (0.0 到 1.0),表示受影響像素的比例* @param saltPepperRatio “鹽”噪聲相對于總噪聲的比例 (0.0 到 1.0)* 例如,0.5 表示鹽和椒的概率各占一半*/
void addSaltAndPepperNoise(std::vector<std::vector<int>>& image, double noiseDensity, double saltPepperRatio = 0.5) {if (image.empty() || image[0].empty()) {std::cerr << "錯誤:圖像數據為空!" << std::endl;return;}if (noiseDensity < 0.0 || noiseDensity > 1.0) {std::cerr << "錯誤:噪聲密度必須在 [0.0, 1.0] 之間!" << std::endl;return;}if (saltPepperRatio < 0.0 || saltPepperRatio > 1.0) {std::cerr << "錯誤:鹽/椒比例必須在 [0.0, 1.0] 之間!" << std::endl;return;}int rows = image.size();int cols = image[0].size();// 初始化隨機數生成器// 注意:srand() 最好在程序開始時調用一次,而不是每次調用函數時都調用// 這里為了示例的獨立性,放在函數內部,但實際項目中應避免重復調用// static bool srand_called = false;// if (!srand_called) {//     srand(static_cast<unsigned int>(time(0)));//     srand_called = true;// }for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {// 生成一個0到1之間的隨機數double randVal = static_cast<double>(rand()) / RAND_MAX;if (randVal < noiseDensity) {// 該像素被噪聲污染double saltOrPepper = static_cast<double>(rand()) / RAND_MAX;if (saltOrPepper < saltPepperRatio) {image[i][j] = 255; // 鹽噪聲 (白色)} else {image[i][j] = 0;   // 椒噪聲 (黑色)}}// else: 像素保持不變}}
}// 輔助函數:打印圖像 (用于測試)
void printImage(const std::vector<std::vector<int>>& image) {if (image.empty()) return;for (const auto& row : image) {for (int pixel : row) {std::cout.width(4); // 設置輸出寬度,方便對齊std::cout << pixel << " ";}std::cout << std::endl;}
}int main() {// 初始化隨機數種子 (在main函數開始時調用一次)srand(static_cast<unsigned int>(time(0)));// 創建一個示例圖像 (例如 5x5)int rows = 5, cols = 5;std::vector<std::vector<int>> myImage(rows, std::vector<int>(cols));// 填充一些初始像素值 (例如,都設為128)for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {myImage[i][j] = 128;}}std::cout << "原始圖像:" << std::endl;printImage(myImage);// 添加椒鹽噪聲double density = 0.2; // 20% 的像素會被噪聲污染double saltRatio = 0.5; // 鹽和椒的比例為 1:1addSaltAndPepperNoise(myImage, density, saltRatio);std::cout << "\n添加椒鹽噪聲后的圖像 (密度: " << density * 100 << "%):" << std::endl;printImage(myImage);return 0;
}

代碼說明

  1. addSaltAndPepperNoise 函數:

    • 接收一個二維 std::vector<std::vector<int>> 作為圖像數據。實際項目中,你可能會使用更專業的圖像庫(如 OpenCV)或自定義的圖像數據結構。
    • noiseDensity 參數控制噪聲的多少。例如,0.1 表示大約10%的像素會被修改。
    • saltPepperRatio 參數控制噪聲點中“鹽”像素(白色)所占的比例。0.5 表示鹽和椒出現的概率均等。
    • 函數遍歷圖像中的每個像素。
    • 對于每個像素,生成一個隨機數 randVal。如果 randVal 小于 noiseDensity,則該像素被選為噪聲點。
    • 如果像素是噪聲點,再生成一個隨機數 saltOrPepper 來決定它是鹽(255)還是椒(0)。
  2. 隨機數生成:

    • srand(static_cast<unsigned int>(time(0))) 用于播種隨機數生成器。這一步通常在程序開始時執行一次,以確保每次運行程序時都能得到不同的隨機序列。在示例中,為了獨立性,它被注釋在了函數內部,并在 main 函數中調用。
    • rand() 生成一個偽隨機整數,static_cast<double>(rand()) / RAND_MAX 將其歸一化到 [0.0, 1.0] 范圍內。
  3. main 函數示例:

    • 創建了一個簡單的 5x5 圖像,并用中間灰度值 (128) 初始化。
    • 調用 addSaltAndPepperNoise 函數添加噪聲。
    • 打印原始圖像和處理后的圖像以供比較。

注意事項與改進

  • 彩色圖像: 對于彩色圖像(如RGB),可以獨立地對每個顏色通道應用椒鹽噪聲,或者只對亮度/強度通道應用噪聲。
  • 隨機數生成器: C++11 及更高版本提供了更高級的隨機數生成工具(在 <random> 頭文件中),如 std::mt19937std::uniform_real_distribution,它們通常能提供比 rand() 更好的隨機性。
  • 性能: 對于非常大的圖像,直接遍歷所有像素并為每個像素生成隨機數可能不是最高效的方法。但對于大多數情況,這種方法的簡單性和清晰度是足夠的。
  • 圖像庫: 如果你正在進行更復雜的圖像處理任務,建議使用像 OpenCV 這樣的成熟圖像處理庫。這些庫通常內置了添加各種類型噪聲的函數,并且處理圖像的加載、保存和操作更為便捷。

總結

椒鹽噪聲是一種簡單的圖像噪聲模型,通過在C/C++中利用隨機數生成器,我們可以有效地模擬這種噪聲。理解其原理并能夠手動實現它,對于學習圖像處理和計算機視覺的基礎非常有幫助。

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

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

相關文章

LIEDNet: A Lightweight Network for Low-light Enhancement and Deblurring論文閱讀

摘要 夜間拍攝的圖像常常面臨諸如低光和模糊等挑戰&#xff0c;這些問題主要是由于昏暗環境和長時間曝光的頻繁使用所導致。現有方法要么獨立處理這兩種退化問題&#xff0c;要么依賴于通過復雜機制生成的精心設計的先驗知識&#xff0c;這導致了較差的泛化能力和較高的模型復…

談談worldquant中設置的幾個意思

Decay 是一個設置&#xff0c;用于確定要反映多少過去的位置。正如我們之前詳細介紹的那樣&#xff0c;Decay 值越高&#xff0c;Alpha 周轉率越低。但是&#xff0c;請注意&#xff0c;Alpha 的夏普比率可能會隨著信息延遲而降低。 創建 Alpha 時&#xff0c;頭寸可能會集中在…

大模型和AI工具匯總(一)

一、國內可免費使用的大模型&#xff08;持續更新&#xff09; DeepSeek 模型介紹&#xff1a;DeepSeek 系列包括 DeepSeek V3&#xff08;通用場景&#xff09;、DeepSeek R1&#xff08;推理模型&#xff09;&#xff0c;支持高達 64K 上下文長度&#xff0c;中文場景表現優…

HarmonyOS NEXT 技術特性:分布式軟總線技術架構

HarmonyOS NEXT 技術特性&#xff1a;分布式軟總線技術架構 隨著物聯網發展&#xff0c;2030 預計全球聯網設備達 2000 億&#xff0c;異構設備互聯難題凸顯&#xff0c;分布式軟總線作為 HarmonyOS 生態核心&#xff0c;以軟件虛擬總線打破物理局限&#xff0c;讓跨品牌設備即…

什么是VR展館?VR展館的實用價值有哪些?

VR展館&#xff0c;重塑展覽體驗。在數字化時代浪潮的推動下&#xff0c;傳統的實體展館經歷前所未有的變革。作為變革的先鋒&#xff0c;VR展館以無限的潛力&#xff0c;成為展覽行業的新寵。 VR展館&#xff0c;即虛擬現實展館&#xff0c;是基于VR&#xff08;Virtual Real…

VLA模型:自動駕駛與機器人行業的革命性躍遷,端到端智能如何重塑未來?

當AI開始操控方向盤和機械臂&#xff0c;人類正在見證一場靜默的產業革命。 2023年7月&#xff0c;谷歌DeepMind拋出一枚技術核彈——全球首個視覺語言動作模型&#xff08;VLA&#xff09;RT-2橫空出世。這個能將“把咖啡遞給穿紅衣服的阿姨”這類自然語言指令直接轉化為機器人…

華為OD機試真題——出租車計費/靠譜的車 (2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

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

40 歲 Windows 開啟 AI 轉型:從系統到生態的智能重構

在科技快速發展的當下&#xff0c;人工智能成為驅動各領域變革的核心力量&#xff0c;擁有 40 年歷史的 Windows 也開啟了向 AI 的全面轉型。2025 年 5 月 19-22 日西雅圖 Build 2025 開發者大會上&#xff0c;微軟展示了 Windows 11 向 AI 智能體核心平臺轉型的戰略&#xff0…

Python實例題:Python3實現可控制肉雞的反向Shell

目錄 Python實例題 題目 代碼實現 reverse_shell_client.py reverse_shell_server.py 實現原理 反向連接機制&#xff1a; 命令執行與傳輸&#xff1a; 功能特點&#xff1a; 關鍵代碼解析 服務端命令處理 客戶端命令執行 客戶端持久化連接 使用說明 啟動服務端…

AWS EC2 使用Splunk DB connect 連接 RDS mysql

1: 先創建 RDS mysql: 我們選擇free: 選擇free 過后,自動生成single instance, 沒有垮AZ 的db 設置。 選擇密碼登入: 注意:上面設置密碼的時候,特別提示:不能有特殊字符,我就設置了: mypassword 下面可以選擇通過EC2 連接,當然也可以不選:

SAP重塑云ERP應用套件

在2025年Sapphire大會上&#xff0c;SAP正式發布了其云ERP產品的重塑計劃&#xff0c;推出全新“Business Suite”應用套件&#xff0c;并對供應鏈相關應用進行AI增強升級。這一變革旨在簡化新客戶進入SAP生態系統的流程&#xff0c;同時為現有客戶提供更加統一、智能和高效的業…

初識 RocketMQ 知識總結:基礎概念、架構解析、核心特性與應用場景

Apache RocketMQ 是一款由阿里巴巴開源的分布式消息中間件&#xff0c;具有高吞吐量、低延遲、高可靠性等特點&#xff0c;廣泛應用于互聯網、金融、電商等領域。以下從多個維度對 RocketMQ 進行全面解析&#xff1a; 一、RocketMQ 基礎概念 1. 定義與定位 分布式消息中間件…

[特殊字符] UI-Trans:字節跳動發布的多模態 UI 轉換大模型工具,重塑界面智能化未來

2025 年&#xff0c;字節跳動&#xff08;ByteDance&#xff09;發布了革命性的多模態 UI 轉換模型 —— UI-Trans&#xff0c;引發了業界廣泛關注。作為一款融合視覺理解、語義分析與用戶交互意圖解析的 AI 工具&#xff0c;UI-Trans 在多個領域展現出強大能力&#xff0c;正在…

這個方法關閉PowerBI賬戶的安全默認值

這個方法關閉PowerBI賬戶的安全默認值 如果PowerBI賬戶是在 2019 年 10 月 22 日當天或之后創建的&#xff0c;則可能會自動啟用安全默認值&#xff0c;登錄賬戶會彈出彈框&#xff0c;如圖&#xff1a; 使用四步就可以關閉此彈框的提示&#xff1a; 第一步&#xff1a;轉到 A…

【Linux】磁盤空間不足

錯誤提示: no space left on device 經典版&#xff08;block占用&#xff09; 模擬 dd if/dev/zero of/var/log/nginx.log bs1M count2000排查 #1. df -h 查看哪里空間不足,哪個分區#2. du -sh詳細查看目錄所占空間 du -sh /* 排查占用空間大的目錄 du -sh /var/* du…

計算機視覺---YOLOv2

YOLOv2講解 一、YOLOv2 整體架構與核心特性 YOLOv2&#xff08;You Only Look Once v2&#xff09;于2016年發布&#xff0c;全稱為 YOLO9000&#xff08;因支持9000類目標檢測&#xff09;&#xff0c;在YOLOv1基礎上進行了多項關鍵改進&#xff0c;顯著提升了檢測精度和速度…

【深度學習】1. 感知器,MLP, 梯度下降,激活函數,反向傳播,鏈式法則

一、感知機 對于分類問題&#xff0c;我們設定一個映射&#xff0c;將x通過函數f(x)映射到y 1. 感知機的基本結構 感知機&#xff08;Perceptron&#xff09;是最早期的神經網絡模型&#xff0c;由 Rosenblatt 在 1958 年提出&#xff0c;是現代神經網絡和深度學習模型的雛形…

IP、子網掩碼、默認網關、DNS

IP、子網掩碼、默認網關、DNS 1. 概述1.1 windows配置處 2.IP 地址&#xff08;Internet Protocol Address&#xff09;2.1 公網ip2.2 內網ip2.3 &#x1f310; 公網 IP 與內網 IP 的關系&#xff08;NAT&#xff09; 3. 子網掩碼&#xff08;Subnet Mask&#xff09;4. 默認網…

Azure 公有云基礎架構與核心服務:從基礎到實踐指南

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、基礎概念 Azure 的基礎架構由多個核心組件構成&#xff0c;理解這些概念是掌握其技術框架的第一步&#xff1a; 地理區域&#xff08;Geographic R…

Ajax01-基礎

一、AJAX 1.AJAX概念 使瀏覽器的XMLHttpRequest對象與服務器通信 瀏覽器網頁中&#xff0c;使用 AJAX技術&#xff08;XHR對象&#xff09;發起獲取省份列表數據的請求&#xff0c;服務器代碼響應準備好的省份列表數據給前端&#xff0c;前端拿到數據數組以后&#xff0c;展…