这篇文章是关于DIPAX图像处理的一个框架,有关这个图像处理框架的更多信息请参考:http://www.fubo-tech.com/2-34.htm

一直想实现DIPAX的那个很酷的直方图的功能,不过前一阵子一直忙着考试,这件事也就搁置了。昨晚coding了一晚上,终于把DIPAX的直方图功能搞定:) 希望早日摆脱VC++的菜鸟状态~~

具体的代码稍后上传,代码95%基本都是黑魔方书中的内容,大家照抄就行了。下面说下几个需要注意的地方吧。

1、黑魔方书中少了一个函数!

万恶的陈兵旗少给了我们一个重要的函数定义

void CalHistPercent(long hist[256], float hist_radio[256], float &max_percent)

这个函数只在BaseList.h头文件中给出了声明,却没给我们具体的函数代码。所以,如果你不动脑子,就把黑魔方的书的内容抄上去的话,那么无论怎么编译,都是会在Linking这个过程中出错的。

BTW:顺便提一句,Link过程中出错的话,很有可能是因为你的函数未定义造成的。具体来说,就是你写的函数名字和BaseList.h头文件中声明的不吻合造成的。

不过仔细分析下后,我发现这个函数还不是很难。于是我自己写了一个山寨版的CalHistPercent函数。估计不是很严谨,不过能用就好~

2、XXX::OnPaint()

我看黑魔方的书时,弄不清楚OnPaint这个函数到底对应的是什么。其实答案很简单,OnPaint就是一个按钮,那个按钮叫Paint 囧...  所以你可以改为OnButton OnSex OnFUCK 随便你了 哈哈。

原谅我之前的无知,OnPaint 不是个按钮 。

3、印刷错误

黑魔方书中有几处印刷错误。比如short ret 给印成shortret,还有的是把注释印到了语句中间.....害的我第一次build时出了31处错误...真是很考验人的耐心啊..

不过好在顽强的我,终于把所有错误一一排除掉了。后面的代码是没有问题的。

4、画在哪里?

要新建一个静态文本框,ID和CWnd * pWnd = GetDlgItem(IDC_HIST_STATIC); 这里的ID对应就行了

我用的就是上面写的IDC_HIST_STATIC

5、能否一进入对话框就显示直方图呢?

可以,把显示语句放到对话框的初始化函数就行。

最后,我的直方图的类名叫做Czft 

所有相关代码:https://github.com/quake0day/undergraduate-CAU/tree/master/zft

 附:函数定义:

void CalHistPercent(long hist[256], float hist_radio[256], float &max_percent)


#include "StdAfx.h"
#include "BaseList.h"
#include <math.h>


float cc(float a,float b)
{
return a/b;
}

 

void CalHistPercent(long hist[256], float hist_radio[256], float &max_percent)
{
int i,j;
long max_per = hist[0];	//计算最大值,以扫描的第一点为初值
long all = 0;	//hist数组中所有的像素个数
float a=0;
for( i =0 ; i< 256; i++)
{
all = hist[i]+ all;	//循环计算hist数组中所有的像素个数
}
for( j= 0; j<256; j++)
{
if(all > 0)	//如果像素数目大于0
{
hist_radio[j] = cc(hist[j],(float)all) * (float)100;	//计算每个像素点对应所占的百分比,用另外数组保存
}
if (max_per < hist[j])
{
max_per = hist[j];	//计算最大值
}
}

if( all != 0)
{
a = cc(max_per,all);  //计算最大的百分比
}
else a = 0;
max_percent = a * (float)100;
}