【圖像處理】直方圖均衡化c++實現

直方圖均衡化是一種通過調整圖像像素灰度值分布,來增強圖像對比度的經典數字圖像處理技術。其核心在于將原始圖像的灰度直方圖從集中的某個區間“拉伸”或“均衡”到更廣泛的區間,讓圖像的明暗細節更清晰關鍵在于利用累積分布函數實現灰度值的映射

為什么需要直方圖均衡化?

原始圖像可能因光照不足、設備限制等原因,灰度值集中在狹窄區間,導致對比度低——比如過暗的圖像灰度集中在低亮度區域,過亮的則集中在高亮度區域,細節被掩蓋。
直方圖均衡化的目標就是打破這種集中分布,讓灰度值在整個0~255(8位圖像)區間內更均勻地分布,從而使暗部更暗、亮部更亮,凸顯細節

請添加圖片描述請添加圖片描述

直方圖均衡化的核心原理是什么?

  1. 灰度直方圖:統計圖像中每個灰度值(0~255)出現的像素數量,橫軸為灰度值,縱軸為像素數,反映灰度分布特征。
  2. 累積分布函數(CDF):計算灰度值從0到當前值的像素數量累計占比,公式為:
    CDF(k)=∑i=0kniN CDF(k) = \sum_{i=0}^{k} \frac{n_i}{N} CDF(k)=i=0k?Nni??
    其中,nin_ini?是灰度值iii的像素數,NNN是圖像總像素數,CDF(k)CDF(k)CDF(k)表示灰度≤kkk的像素占比(0~1之間)。
  3. 灰度映射:將原始灰度值kkk通過CDF映射到新的灰度值k′k'k,公式為:
    k′=round[(L?1)×CDF(k)] k' = \text{round}[(L-1) \times CDF(k)] k=round[(L?1)×CDF(k)]
    其中,L=256L=256L=256(8位圖像),round為四舍五入。通過此映射,原始集中的灰度會被“拉伸”到更寬的范圍。
    在這里插入圖片描述
    在這里插入圖片描述

直方圖均衡化的步驟(以8位圖像為例)

步驟具體操作
1. 計算原始直方圖統計每個灰度值(0~255)的像素數量nin_ini?
2. 計算累積分布函數(CDF)按公式計算CDF(k)CDF(k)CDF(k),得到每個灰度值對應的累計占比
3. 灰度值映射k′=(255×CDF(k))k' = (255 \times CDF(k))k=(255×CDF(k))四舍五入,得到新灰度值
4. 生成均衡化圖像將原始圖像中每個像素的灰度值替換為映射后的k′k'k

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

直方圖均衡化的效果與局限

  • 優勢

    • 無需人工干預,自動增強對比度適合光照不均、細節模糊的圖像(如醫學影像、監控圖像)。
    • 計算簡單,可實時處理
  • 局限

    • 可能過度增強噪聲:如果原始圖像中某一灰度區間像素少但含噪聲,均衡化后噪聲會被放大。
    • 對自然圖像可能失真:過度均衡化會讓圖像顯得“不自然”,比如人臉可能失去膚色質感。
    • 全局均衡化:對明暗差異大的圖像(如逆光場景)效果有限,因為它對整幅圖像用同一映射規則,可能導致亮部過曝或暗部丟失。

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

改進方法:局部直方圖均衡化

為解決全局均衡化的局限,局部直方圖均衡化(如CLAHE,限制對比度自適應直方圖均衡化)應運而生:

  • 將圖像分成多個小區域(稱為“塊”),對每個塊單獨做均衡化,再通過插值拼接,避免全局映射的弊端。
  • 加入對比度限制:當某塊的CDF增長過快(可能因噪聲或局部過亮),限制其最大斜率,防止噪聲放大。 ![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/6d23b2c2aca747b184fe6c6c9694d8d6.png

在這里插入圖片描述

在這里插入圖片描述

CLAHE代碼實現

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>using namespace cv;
using namespace std;// 優化的CLAHE均衡化
Mat applyCLAHE(const Mat& src) {Mat ycrcb;cvtColor(src, ycrcb, COLOR_BGR2YCrCb);  // 轉換到YCrCb顏色空間vector<Mat> channels;split(ycrcb, channels);  // 分離通道,[0]為亮度通道Y// 關鍵參數優化:// clipLimit=3.0:控制對比度增強程度,平衡增強效果與噪聲放大// tileSize=8x8:較小的塊尺寸減少塊效應,同時保持局部對比度Ptr<CLAHE> clahe = createCLAHE(3.0, Size(8, 8));clahe->apply(channels[0], channels[0]);  // 僅對亮度通道應用CLAHEmerge(channels, ycrcb);  // 合并通道cvtColor(ycrcb, ycrcb, COLOR_YCrCb2BGR);  // 轉換回BGR顏色空間return ycrcb;
}int main(int argc, char**argv) {// 檢查輸入參數if (argc < 2) {cout << "用法: " << argv[0] << " 圖像路徑 [輸出文件名]" << endl;return -1;}// 讀取圖像Mat image = imread(argv[1]);if (image.empty()) {cout << "無法讀取圖像: " << argv[1] << endl;return -1;}// 應用優化的CLAHE均衡化Mat clahe_result = applyCLAHE(image);// 顯示結果namedWindow("原始圖像", WINDOW_NORMAL);namedWindow("優化的CLAHE均衡化", WINDOW_NORMAL);imshow("原始圖像", image);imshow("優化的CLAHE均衡化", clahe_result);// 保存結果string output_filename = (argc > 2) ? argv[2] : "clahe_result.jpg";imwrite(output_filename, clahe_result);cout << "處理結果已保存至: " << output_filename << endl;waitKey(0);destroyAllWindows();return 0;
}

實際應用場景

  • 醫學影像:增強X光、CT圖像中的病灶細節。
  • 監控安防:在低光環境下讓人臉、車牌更清晰。
  • 遙感圖像:突出地表紋理(如植被、水體的邊界)。
    在這里插入圖片描述
    在這里插入圖片描述

總結

直方圖均衡化通過灰度映射實現對比度增強,核心是利用累積分布函數打破灰度集中分布。它操作簡單、效果直觀,但存在過度增強噪聲和全局適配性差的問題。實際應用中,常結合局部均衡化(如CLAHE)優化效果,是圖像處理中提升圖像質量的基礎工具。

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

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

相關文章

Web前端實戰:Vue工程化+ElementPlus

1.Vue工程化 1.1介紹 模塊化&#xff1a;將js和css等&#xff0c;做成一個個可復用模塊組件化&#xff1a;我們將UI組件&#xff0c;css樣式&#xff0c;js行為封裝成一個個的組件&#xff0c;便于管理規范化&#xff1a;我們提供一套標準的規范的目錄接口和編碼規范&#xff0…

ECMAScript2021(ES12)新特性

概述 ECMAScript2021于2021年6月正式發布&#xff0c; 本文會介紹ECMAScript2021(ES12)&#xff0c;即ECMAScript的第12個版本的新特性。 以下摘自官網&#xff1a;ecma-262 ECMAScript 2021, the 12th edition, introduced the replaceAll method for Strings; Promise.any,…

Tlias 案例-整體布局(前端)

開發流程前端開發和后端開發是一樣的&#xff0c;都需要閱讀接口文檔。 準備工作&#xff1a; 1&#xff1a;導入項目中準備的基礎過程到 VsCode。2&#xff1a;啟動前端項目&#xff0c;訪問該項目3&#xff1a;熟悉一下基本的布局<script setup></script><tem…

三十二、【Linux網站服務器】搭建httpd服務器演示虛擬主機配置、網頁重定向功能

httpd服務器功能演示一、虛擬主機配置虛擬主機技術全景虛擬主機目錄規范1. 基于端口的虛擬主機&#xff08;8080/8081&#xff09;2. 基于IP的虛擬主機&#xff08;192.168.1.100/192.168.1.101&#xff09;3. 基于域名的虛擬主機&#xff08;site1.com/site2.com&#xff09;二…

串行化:MYSQL事務隔離級別中的終極防護

在現代應用程序中&#xff0c;數據的一致性和可靠性至關重要。想象一下&#xff0c;如果在一個銀行系統中&#xff0c;兩個用戶同時試圖轉賬到同一個賬戶&#xff0c;最終的數據結果可能會出乎意料。為了避免這種情況&#xff0c;MYSQL提供了不同的事務隔離級別&#xff0c;其中…

RAG:檢索增強生成的范式演進、技術突破與前沿挑戰

1 核心定義與原始論文 RAG&#xff08;Retrieval-Augmented Generation&#xff09;由Facebook AI Research團隊于2020年提出&#xff0c;核心思想是將參數化記憶&#xff08;預訓練語言模型&#xff09;與非參數化記憶&#xff08;外部知識庫檢索&#xff09;結合&#xff0c…

2024年藍橋杯Scratch10月圖形化stema選拔賽真題——旋轉的圖形

旋轉的圖形編程實現旋轉的圖形。具體要求1&#xff09;點擊綠旗&#xff0c;在舞臺上出現滑桿形式的變量 r&#xff0c;取值范圍為-1、0、1&#xff0c;默認值為 0&#xff0c;如圖所示&#xff1b;2&#xff09;1秒后&#xff0c;在舞臺上繪制出一個紅色正方形&#xff08;邊長…

【音視頻】WebRTC 開發環境搭建-Web端

一、開發環境搭建 1.1 安裝vscode 下載VSCode&#xff1a;https://code.visualstudio.com/&#xff0c;下載后主要用于開發Web前端頁面&#xff0c;編寫前端代碼 安裝完成后下載Live Server插件&#xff0c;用于本地開發&#xff0c;實時加載前端頁面 1.1.1 前端代碼測試 下…

力扣54:螺旋矩陣

力扣54:螺旋矩陣題目思路代碼題目 給你一個 m 行 n 列的矩陣 matrix &#xff0c;請按照 順時針螺旋順序 &#xff0c;返回矩陣中的所有元素。 思路 思路很簡單創建一個二維數組然后按照箭頭所示的順序一層一層的給二維數組相應的位置賦值即可。難點是我們是一層一層的賦值…

【CSS】設置表格表頭固定

1.設置thead樣式在thead元素中增加樣式&#xff1a;position: sticky;top: 0;2.設置table樣式在table元素中增加樣式&#xff1a;border-collapse: separate; /* 分離邊框模式 */ border-spacing: 0;3.設置表頭偽元素樣式增加樣式&#xff1a;th::after {content: ;position: a…

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現標簽條碼一維碼的檢測(C#代碼,UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現標簽條碼一維碼的檢測&#xff08;C#代碼&#xff0c;UI界面版&#xff09;&#xff09;工業相機使用YoloV8模型實現標簽條碼一維碼的檢測工業相機通過YoloV8模型實現標簽條碼的檢測的技術背景在相機SDK中獲取圖像轉換…

如何編寫好的測試用例?

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快對于軟件測試工程師來說&#xff0c;設計測試用例和提交缺陷報告是最基本的職業技能。是非常重要的部分。一個好的測試用例能夠指示測試人員如何對軟件進行測試。在…

《Java 程序設計》第 12 章 - 異常處理

大家好&#xff01;今天我們來學習《Java 程序設計》中的第 12 章 —— 異常處理。在編程過程中&#xff0c;錯誤和異常是不可避免的。一個健壯的程序必須能夠妥善處理各種異常情況。本章將詳細介紹 Java 中的異常處理機制&#xff0c;幫助大家編寫出更穩定、更可靠的 Java 程序…

STM32CubeIDE新建項目過程記錄備忘(二) GPIO輸出demo:LED閃爍

利用前面創建好的基礎模板項目文件&#xff0c;創建第一個應用項目&#xff0c;單片機的hello world&#xff1a;LED閃爍。打開模板文件文件--從文件系統中打開項目&#xff1a;在彈出的窗口中選擇之前創建的模板項目文件并打開。復制粘貼新項目 在項目管理器&#xff0c;復制之…

HTML基礎P2 | JS基礎講解

什么是JS JS是一個網頁的腳本語言&#xff0c;你可以理解為在HTML中寫類似于JAVA等高級編程語言的代碼&#xff0c;使得網頁可以實現一些包含邏輯處理的交互操作 簡單上手例子 接下來&#xff0c;給大家一個簡單的小例子來感受一下 <!DOCTYPE html> <html lang&qu…

QT筆記(2)——vscode + CMAKE + qtcreate的操作方式

1.vscode 下載cmake&#xff0c;clangd&#xff0c;qtConfigure&#xff0c;cmake tool的相關插件支持 2. qtConfigure插件配置 根據自己下載的qt目錄下尋找如圖的相關工具 3. qt環境變量配置 在系統變量的path中添加qt編譯需要的環境變量。 4.下載Cmake支持 CMake下…

sed編程入門

一.sed是啥sed&#xff08;流編輯器&#xff0c;Stream Editor&#xff09;是 Unix/Linux 系統中強大的文本處理工具&#xff0c;常用于對文本進行替換、刪除、插入、追加等操作。它逐行處理輸入文本&#xff0c;并根據提供的腳本命令修改文本&#xff0c;最后輸出結果。二.基本…

知識速查大全:python面向對象基礎

目錄 一、面向對象的基本概念 二、類和對象 1.類 2.對象 三、屬性&#xff08;數據&#xff09;和方法 1.數據 1.1.實例數據 1.2.類數據 2.方法 2.1.實例方法 2.2.類方法 3.數據和方法的綜合使用 四、面向對象三大特性 1.封裝 2.繼承 2.1.單繼承 2.2.多繼承 2.3.混合類 2.4.方法…

Linux系統編程Day1-- 免費云服務器獲取以及登錄操作

一、 學生黨如何“白嫖”或免費使用云服務器&#xff1f; 作為學生黨&#xff0c;資金有限的情況下確實不容易長期負擔服務器費用。但好消息是&#xff0c;有多種方式可以“白嫖”或低成本使用云服務器&#xff0c;尤其是針對學生身份、學習用途和開發者計劃。 1、使用各大云平…

15.11 單卡訓練770M參數模型!DeepSpeed ZeRO-3實戰:RTX 4090顯存直降6.8GB

單卡訓練770M參數模型!DeepSpeed ZeRO-3實戰:RTX 4090顯存直降6.8GB 實戰 DeepSpeed ZeRO-2 和 ZeRO-3 單機單卡訓練 為什么需要單機單卡訓練場景? 雖然 DeepSpeed 的 ZeRO 技術主要面向分布式訓練場景,但單機單卡訓練仍然具有重要實踐價值: 開發調試:在資源有限情況下…