1。显示图片的直方图
这个是把任意彩色图转换成黑白图片,再求其直方图。这些算法都是基于RGB颜色空间的,不过对其他颜色空间操作一样,只是首先得进行空间转换。语言用c++实现;
//彩色图片转换成黑白
void convertColortoGray(image a,image r,image g,image b
{
UINT i,j;
for(i=0;i
for(j=0;j a[i][j]=(r[i][j]+g[i][j]+b[i][j])/3.0;
}
//求任意图片的直方图,但是之前必须转换成黑白图片。image d就是显示的直方图
void calculateHistogram(image d, image s)
{
UINT i,j;
UINT arr[256];
UINT maxVal=0;
for(i=0;i<256;i++){
arr[i]=0;
for(j=0;j<256;j++){
d[i][j]=255.0;
}
}
for(i=0;i
for(j=0;j arr[(s[i][j])]++;
}
for(i=0;i<256;i++){
if(arr[i]>maxVal)
maxVal=arr[i];
}
for(i=0;i<256;i++){
for(j=(255-(256*arr[i]/maxVal));j<256;j++)
d[j][i]=0.0;
}
}
结果图为:
2 实现图片的反色,传的参数为源R G B三个分量图,和目标 R G B分量图,显示目标图即为显示了结果图
void negative(image rd, image gd,image bd, image rs,image gs, image bs)
{
UINT i,j;
for(i=0;i<256;i++)
for(j=0;j<256;j++)
{
rd[i][j]=255-rs[i][j];
gd[i][j]=255-gs[i][j];
bd[i][j]=255-bs[i][j];
}
}
Result:
3.直方图均衡化代码。参数为源和结果图。可以对三个分量图分别处理,我这里的结果是对RBG都均衡化。
void showHequalization(image r,image temp1)
{
int gr[256],gx;
float fr[256],t1[256],normal[256],tempr,rindex,rmin;
//initialize array
for(int h=0;h<256;h++)
{
gr[h]=0;
t1[h]=0;
}
//statistic pixls of each gray level in the pic
for(int i=0;i
for(int j=0;j
{
//red
gx=r[i][j];
gr[gx]++;
}
//get p(r)
for(int h=0;h<256;h++)
{
fr[h]=(float)gr[h]/(256.0*256.0);
//get normalized gray level
normal[h]=h/255.0;
}
//get accuminated value for each grey level
for(int h=1;h<256;h++)
{
fr[h]=fr[h-1]+fr[h];
}
//get mapping between normalized gray level and sk.
for(int h=0;h<256;h++)
{
tempr=fr[h];
rmin=1.0;
for(int k=0;k<256;k++)
{
if(fabs(tempr-normal[k]) {
rmin=fabs(tempr-normal[k]);
rindex=k;
}
}
//scan picture and implement mapping
for(int i=0;i
for(int j=0;j {
if(r[i][j]==h) temp1[i][j]=rindex;
}
}
}
结果图:
原图 结果图