C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)BMP圖像直方圖均衡化處理的具體代碼,供大家參考,具體內(nèi)容如下
計(jì)算步驟:
1)統(tǒng)計(jì)各灰度值的概率;
2)計(jì)算了累積概率直方圖(CDF);
3)取整擴(kuò)展:Tk = int[ (L-1)*Tk];
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int main(int* argc, char** argv)
{
FILE* fp = fopen("./01.bmp", "rb");
if (fp == 0)
return 0;
BITMAPFILEHEADER fileHead;
fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);
BITMAPINFOHEADER infoHead;
fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp);
int width = infoHead.biWidth;
int height = infoHead.biHeight;
int biCount = infoHead.biBitCount;
int lineByte = (biCount*width / 8 + 3) / 4 * 4;
RGBQUAD* pColorTable;
pColorTable = new RGBQUAD[256];
fread(pColorTable, sizeof(RGBQUAD), 256, fp);
unsigned char* pBmpBuf;
pBmpBuf = new unsigned char[lineByte*height];
fread(pBmpBuf, lineByte*height, 1, fp);
fclose(fp);
// 統(tǒng)計(jì)概率
double st[256] = { 0 };
int st1[256] = { 0 };
int t;
for (int i = 0; i < height; ++i){
for (int j = 0; j < width; ++j){
t = *(pBmpBuf + i*lineByte + j);
st[t]++;
}
}
// 計(jì)算累加直方圖并完成映射
st[0] = st[0] / (width*height);
st1[0] = round(double((256 - 1)*st[0]));
for (int i = 1; i < 256; ++i){
st[i] = st[i] / (width*height);
st[i] = st[i] + st[i - 1];
st1[i] = int(round(double((256 - 1)*st[i])));
printf("st[i] = %d, st1[t] = %d\n", st[i], st1[i]);
}
// 新圖像的像素填充
unsigned char* pBmpBuf1;
pBmpBuf1 = new unsigned char[lineByte*height];
for (int i = 0; i < height; ++i){
for (int j = 0; j < width; ++j){
t = *(pBmpBuf + i*lineByte + j);
*(pBmpBuf1 + i*lineByte + j) = st1[t];
}
}
FILE* fop = fopen("./imhist.bmp", "wb");
if (fop == 0)
return 0;
fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fop);
fwrite(&infoHead, sizeof(BITMAPINFOHEADER), 1, fop);
fwrite(pColorTable, sizeof(RGBQUAD), 256, fop);
fwrite(pBmpBuf1, lineByte*height, 1, fop);
fclose(fop);
system("pause");
return 0;
}
實(shí)驗(yàn)結(jié)果:

實(shí)驗(yàn)結(jié)果分析:對(duì)比原圖與實(shí)驗(yàn)結(jié)果圖,原圖中,頭發(fā)和衣領(lǐng)處灰度值較低的地方在結(jié)果圖中灰度值更低,而原圖中,額頭中間偏右處較亮,在結(jié)果圖中更亮,灰度值更大。整體上直方圖均衡化拉伸了全局對(duì)比度。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c++實(shí)現(xiàn)跳躍表(Skip List)的方法示例
跳表(skiplist)是一個(gè)非常優(yōu)秀的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)簡(jiǎn)單,插入、刪除、查找的復(fù)雜度均為O(logN),下面這篇文章主要介紹了c++實(shí)現(xiàn)跳躍表(Skip List)的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
C語(yǔ)言經(jīng)典例程100例(經(jīng)典c程序100例)
這篇文章主要介紹了C語(yǔ)言經(jīng)典例程100例,經(jīng)典c程序100例,學(xué)習(xí)c語(yǔ)言的朋友可以參考一下2018-03-03
OpenCV實(shí)現(xiàn)拼接圖像的簡(jiǎn)單方法
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)拼接圖像的簡(jiǎn)單方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Cocos2d-x UI開(kāi)發(fā)之CCControlColourPicker控件類(lèi)使用實(shí)例
這篇文章主要介紹了Cocos2d-x UI開(kāi)發(fā)之CCControlColourPicker控件類(lèi)使用實(shí)例,本文代碼中包含大量注釋來(lái)講解CCControlColourPicker控件類(lèi)的使用,需要的朋友可以參考下2014-09-09
基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
C++內(nèi)存池的簡(jiǎn)單實(shí)現(xiàn)
內(nèi)存池是一種動(dòng)態(tài)內(nèi)存分配與管理技術(shù)。本文主要介紹了C++內(nèi)存池的簡(jiǎn)單實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
vs2022啟動(dòng)一個(gè)CmakeLists.txt項(xiàng)目的實(shí)踐
本文主要介紹了vs2022啟動(dòng)一個(gè)CmakeLists.txt項(xiàng)目的實(shí)踐,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
C語(yǔ)言中scanf與scanf_s函數(shù)的使用詳解
本文主要介紹了C語(yǔ)言中scanf與scanf_s函數(shù)的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10

