请问通过以下代码可以计算出一幅图片的灰度平均值和灰度方差嘛(图像是8位图片)

oxygen1 2009-03-19 10:05:44
m_pDibImage->ReadImage(file);//读取位图
int temp;
long p[256];
for (i=0;i<256;i++)
{
p[i]=0;
}
for (int y=0;y<m_pDibImage->Height;y++)
{
for (int x=0;x<m_pDibImage->Width;x++)
{
//p[Data[y*width+x]]++
temp=m_pDibImage->lpBits[y*m_pDibImage->Width+x];
((p[temp])++);
//temp=p[temp];
}
}
m_jicha=max-min;//求极差
double temp2=0;
for( int i=min; i<=max; i++ )
{
temp2 = (double)i*p[i];
m_pingjunzhi += temp2;
m_fangcha += (temp2*i);
}
long lPixels = m_pDibImage->Width*m_pDibImage->Height;
m_pingjunzhi /= lPixels;//求平均值
m_fangcha /= lPixels;
m_fangcha -= (m_pingjunzhi*m_pingjunzhi);//求方差
...全文
922 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
oxygen1 2009-03-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 eblis88 的回复:]
C/C++ code
// 平均
double average = 0;

for (int y=0;y <m_pDibImage->Height;y++)
{
for (int x=0;x <m_pDibImage->Width;x++)
{
average += m_pDibImage->lpBits[y*m_pDibImage->Width+x];
}
}
average /= (m_pDibImage->Width*m_pDibImage->Height);


// 方差
double variance = 0;
for (int y=0;y <m_pDibImage->Height;y++)
{
for (int x=0;x <m_pDibImage->Width;x++)

[/Quote]

其实我也是这么做的。但是接下来问题就来了;
我用这样一个数组来存放采集的数据:
BYTE* Data[1280*1024]//采集的图像是1280*1024的8位灰度图
但是,通过这样一段代码来计算图像灰度均值的时候,统计的结果却不对,请问这是为什么呢?
for (i = 0; i < 1024; i ++)// 各灰度值的计数
{
for (j = 0; j < 1280; j ++)
{
lpDibSrc = (unsigned char *)Data+ 1280* i + j;
m_lDibCount[*(lpDibSrc)]++;
}
}
long lpixels=1280*1024;
for ( i=0;i<256;i++)//求取平均值
{
//temp2 +=p[i]*1.0/width/height;
m_pingjunzhi +=i*m_lDibCount[i]*1.0/lPixels;
}
oxygen1 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mxw0922 的回复:]
可以尝试一下opencv,里面有你需要的算法。
[/Quote]


我是在我的程序中要用到这样一段代码。再说,我也不会OPENCV啊
oxygen1 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaoxin_ling 的回复:]
既然不能肯定,就严格按照灰度平均和灰度方差的定义来写代码,不就ok了?
[/Quote]

我是按照定义来的。可是就是会出错啊
eblis88 2009-03-26
  • 打赏
  • 举报
回复

// 平均
double average = 0;

for (int y=0;y <m_pDibImage->Height;y++)
{
for (int x=0;x <m_pDibImage->Width;x++)
{
average += m_pDibImage->lpBits[y*m_pDibImage->Width+x];
}
}
average /= (m_pDibImage->Width*m_pDibImage->Height);


// 方差
double variance = 0;
for (int y=0;y <m_pDibImage->Height;y++)
{
for (int x=0;x <m_pDibImage->Width;x++)
{
int temp = m_pDibImage->lpBits[y*m_pDibImage->Width+x];
variance += (temp - average)*(temp - average);
}
}
variance /= (m_pDibImage->Width*m_pDibImage->Height);


mxw0922 2009-03-20
  • 打赏
  • 举报
回复
可以尝试一下opencv,里面有你需要的算法。
xiaoxin_ling 2009-03-20
  • 打赏
  • 举报
回复
既然不能肯定,就严格按照灰度平均和灰度方差的定义来写代码,不就ok了?

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧