#endif
//DBI.H:header file //
//////////////////////// //CDIB class
class CDIB:public CObject{
public: int m_nImType; void close(); void UpdateData(); void InvalidateData(); BYTE *m_pdata; BYTE *m_pR,*m_pG,*m_pB; void ShowDIB(CDC *,int,int,int,int,BYTE*,BITMAPINFO*); bool m_bLoaded; CDIB(); virtual ~CDIB(); BITMAPINFO* m_pBMI; //BITMAPINFO pointer BYTE* m_pDIBData; //DIB data pointer BYTE* m_pDumpDIBData; BITMAPFILEHEADER bfh; BITMAPINFOHEADER bih; CPalette *m_pPalette;
DWORD dataBytes; bool SaveFile(LPCTSTR lpszFileName); virtual bool LoadFromFile(LPCTSTR lpszFileName); int GetDIBWidth() { return m_pBMI->bmiHeader.biWidth; } int GetDIBHeight() { return m_pBMI->bmiHeader.biHeight; } };
////////////////////////
#endif // !defined (__DIB_H__)
MATLAB程序;
RGB = imread('1.png'); % 读取彩色图 subplot(131); imshow(RGB); title('彩色图');
I=rgb2gray(RGB); % 将彩色图转化为灰度图 subplot(132); imshow(I); title('灰度图');
[R, C] = size(I);
% 统计每个像素值出现次数 cnt = zeros(1, 256); for i = 1 : R for j = 1 : C
cnt(1, I(i, j) + 1) = cnt(1, I(i, j) + 1) + 1; end end
f = zeros(1, 256);
f = double(f); cnt = double(cnt);
% 统计每个像素值出现的概率, 得到概率直方图 for i = 1 : 256
f(1, i) = cnt(1, i) / (R * C); end
% 求累计概率,得到累计直方图 for i = 2 : 256
f(1, i) = f(1, i - 1) + f(1, i); end
% 用f数组实现像素值[0, 255]的映射。 for i = 1 : 256
f(1, i) = f(1, i) * 255; end
% 完成每个像素点的映射
I = double(I); for i = 1 : R for j = 1 : C
I(i, j) = f(1, I(i, j) + 1); end end % 输出
I = uint8(I); subplot(133); imshow(I);
title('直方图均衡化');