图像进行直方图均衡化(代码)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我这里有一个源程序也共享出来大家探讨一下!
I = imread('pout.tif');
subplot(3,2,1);imshow(I);
subplot(3,2,2);imhist(I);
[m,n] = size(I);
hf = zeros(1,256);
pa = zeros(1,256);
for i = 1:m
for j = 1:n
hf(I(i,j))=hf(I(i,j))+1;%统计各灰度像素个数
end
end
pa(1)= 0;
for k = 2:256
pf(k) =hf(k)/(m*n);%算灰度分布概率
pa(k) =pa(k-1)+pf(k);%灰度累计分布概率
end
G = zeros(size(I));
for i = 1:m
for j = 1:n
G(i,j)=255*pa(I(i,j)); %将原来f的灰度值映射到新的灰度值g(i,j) = 255*pa(f(i,j))
end
end
H = mat2gray(G)
K = uint8(G);
subplot(3,2,3);imshow(K);
subplot(3,2,4);imhist(K);
subplot(3,2,5);imshow(histeq(I));
subplot(3,2,6);imhist(histeq(I));







%对一幅图像进行直方图均衡化
A=imread('Fig3.08(a).jpg');
[m,n]=size(A);
B=zeros(size(A));
l=m*n;
r=zeros(1,256);
y=zeros(1,256);
A=double(A);
for i=1:m
for j=1:n
r(A(i,j)+1)=r(A(i,j)+1)+1;
end
end
r=r./l;%得到原图像各灰度级所占的比例
for k=1:256
for j=1:k
y(k)=y(k)+r(j);
end
end %直方图累加
for k=1:256
y(k)=floor(255*y(k)+0.5); %确定映射关系
end
for i=1:m
for j=1:n
B(i,j)=y(A(i,j)+1);
end
end
A=uint8(A);
B=uint8(B);
subplot(2,2,1)
imshow(A)
title('原图像')
subplot(2,2,2)
imhist(A)
title('原图像的直方图')
subplot(2,2,3)
imshow(B)
title('经过均衡处理的图像')
subplot(2,2,4)
imhist(B)
title('经过均衡处理后该图像的直方图')
至于所参与运算的图像,你们自己随便找一幅










clear all%一,图像的预处理,读入彩色图像将其灰度化PS=imread('1.jpg'); %读入JPG彩色图像文件imshow(PS) %显示出来 title('输入的彩色JPG图像')imwrite(rgb2gray(PS),'PicSampleGray.bmp'); %将彩色图片灰度化并保存PS=rgb2gray(PS); %灰度化后的数据存入数组%二,绘制直方图[m,n]=size(PS); %测量图像尺寸参数GP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255 GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置endfigure,bar(0:255,GP,'g') %绘制直方图title('原图像直方图')xlabel('灰度值')ylabel('出现概率')%三,直方图均衡化S1=zeros(1,256);for i=1:256 for j=1:i S1(i)=GP(j)+S1(i); %计算Sk endendS2=round((S1*256)+0.5); %将Sk归到相近级的灰度for i=1:256 GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率endfigure,bar(0:255,GPeq,'b') %显示均衡化后的直方图title('均衡化后的直方图')xlabel('灰度值')ylabel('出现概率')%四,图像均衡化PA=PS;for i=0:255 PA(find(PS==i))=S2(i+1);

%将各个像素归一化后的灰度值赋给这个像素endfigure,imshow(PA) %显示均衡化后的图像 title('均衡化后图像')imwrite(PA,'PicEqual.bmp');














直方图均衡化并在窗口中显示的VC源代码2008-06-03 18:42编译环境:VC6.0;工程:Win32 Application

#include
#include

#define WIDTH 64 //图像宽度
#define HEIGHT 64 //图像高度
#define NGRAY 16 //量化级数

int OriginGray[NGRAY] = {800, 650, 600, 430, 300, 230, 200, 170, 150, 130, 110, 96, 80, 70, 50, 30};
int NewGray[NGRAY] = {0};
float a, b;

//为了把直方图按比例显示在屏幕上,令a*Grayhits+b=CoordinateLenth,
//其中Grayhits为灰度出现的次数,CoordinateLenth为显示的坐标长度,
//假设显示最小长度为10,最大长度为170,则有a*max+b=170,a*min+b=10
//由下面的线性化函数可以解得a,b
void Linearize()
{
int OriginMax, OriginMin;
OriginMax = 0;
OriginMin = WIDTH * HEIGHT;
for (int i=0; i < NGRAY; i++)
{
int temp = OriginGray[i];
if(temp > OriginMax)
OriginMax = temp;
if( (temp < OriginMin) && (temp>0) )
OriginMin = temp;
}
a=(float)(160.0 / (OriginMax - OriginMin) );
b=(float)(170.0 - a* OriginMax);
}

//直方图均衡化
void HistogramEqua()
{
float s[NGRAY]; //用来表示灰度级出现的频率
int i, nIndex[NGRAY];
//计算每个灰度级出现的频率
for(i=0; i{
s[i] = (float)(OriginGray[i] / (float)(WIDTH * HEIGHT));
}
//计算新的灰度级
for(i=0; i<15; i++)
{
s[i+1] += s[i]; //每一项都是前面所有项的累加
nIndex[i] = (int)(s[i] * (NGRAY-1) + 0.5); //新的灰度级
NewGray[nIndex[i]] += OriginGray[i]; //新的频数
}
nIndex[15] = (int)(s[15] * (NGRAY-1) + 0.5);
NewGray[nIndex[15]] += OriginGray[15];
}

//窗口函数
LRESULT CALLBACK WinMyProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int xStart, i;
float temp;
char str[10];
HPEN hPen;
LOGPEN pen = {PS_SOLID, 2, 1, RGB(0,0,255)};

switch (uMsg)
{
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hWnd, &ps);
hPen = CreatePenIndirect(&pen);
SelectObject(hDC, hPen);

//画出原始直方图

//画一条横线作为灰度级坐标
MoveToEx(hDC, 20, 190, NULL);
LineTo(hDC, 330, 190);
xStart = 25;
for(i=0; i{
MoveToEx(hDC, xStart, 190, NULL);
if (OriginGray[i] != 0)
temp = (float)(a*OriginGray[i]+b);
else temp = 0.0f; //如果灰度出现的次数是零,则不画线
LineTo(hDC, xStart, 190 - (int)temp); //画出该灰度的计数值
_itoa(i, str, 10);
TextOut(hDC, xStart-5, 195, str, strlen(str));
xStart += 20;
}
//画出均衡化后的直方图,同上
MoveToEx(hDC, 360, 190, NULL);
LineTo(hDC, 670, 190);
xStart = 365;
for(i=0; i{
MoveToEx(hDC, xStart, 190, NULL);
if (NewGray[i] !

= 0)
temp = (float)(a*NewGray[i]+b);
else temp = 0.0f;
LineTo(hDC, xStart, 190 - (int)temp);
_itoa(i, str, 10);
TextOut(hDC, xStart-5, 195, str, strlen(str));
xStart += 20;
}

TextOut(hDC, 130, 230, "原始直方图", strlen("原始直方图"));
TextOut(hDC, 450, 230, "均衡化后直方图", strlen("均衡化后直方图"));

EndPaint(hWnd, &ps);
DeleteObject(hPen);
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}

//主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//设计并注册窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.hbrBackground = (HBRUSH)COLOR_WINDOW;
wndcls.hCursor = LoadCursor(NULL, IDC_ARROW);
wndcls.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WinMyProc;
wndcls.lpszClassName = "MyWinClass";
wndcls.lpszMenuName = NULL;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);

//创建窗口
HWND hWnd;
hWnd = CreateWindow("MyWinClass", "直方图均衡化", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,
150, 150, 700, 300, NULL, NULL, hInstance, NULL);

Linearize(); //线性化函数
HistogramEqua(); //直方图均衡化
//显示窗口
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
//消息循环
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}



相关文档
最新文档