平均值灰度的问题

eddyxu 2005-04-23 11:50:31
这是我的代码,可是执行起来就基本上失去响应了,而且无法生成灰度图,为什么?

int GraphProc::ToAverage(Bitmap *bitmap)
{
pDlg.STOP = false;
int i,j,r,g,b,rr,rx,gx,bx;
Color clrCurrent; // 当前像素颜色
int blocksize = 3; // 取平均值的区域
int count = 0;

// 得到长&宽
int row = bitmap->GetWidth();
int col = bitmap->GetHeight();

Color *M = new Color[row * col]; // 分配整张图像大小

//while(!::IsWindow(pDlg.GetSafeHwnd()));
//while(!::IsWindow(pDlg.pProg->GetSafeHwnd()));
//pDlg.pProg->SetRange(0,row-1);
//pDlg.pProg->SetPos(0);
//pDlg.pProg->SetStep(1);
//pDlg.DoModal();
// 根据平均值灰度处理算法进行处理
for(i=0; i<col-1; i++)
{
for(j = 0; j <= row-1 ; j++)
{
rx=0; gx=0; bx=0; // 初始化
for( int k1= -int(blocksize / 2); k1<= int(blocksize / 2); k1++) // row
for(int k2=-int(blocksize / 2); k2 <= int(blocksize / 2); k2++) // col
{
if(j+k1>0 && j+k1<row && i+k2>0 && i+k2 <col)
bitmap->GetPixel(j+k1,i+k2,&clrCurrent);
r = clrCurrent.GetR();
g = clrCurrent.GetG();
b = clrCurrent.GetB();
rx += r;
gx += g;
bx += b;
}// for k1&k2

rx=(rx + gx + bx)/3;
rr=rx / (blocksize * blocksize);

M[count++].SetValue(Color::MakeARGB( clrCurrent.GetA(),rr,rr,rr)); // 给内存中镜像辅值
/*
if(::IsWindow(pDlg.GetSafeHwnd()))
if(pDlg.STOP)
{
if(::IsWindow(pDlg.GetSafeHwnd()))
pDlg.EndDialog(IDOK);
return 0;
} */

}// for j

//if(::IsWindow(pDlg.GetSafeHwnd()))
//pDlg.pProg->StepIt();
}//for i
//if(::IsWindow(pDlg.GetSafeHwnd()))
//pDlg.EndDialog(IDOK);

for (int m=0; m<row; m++)
for(int n=0; n<col; n++)
bitmap->SetPixel(m,n, M[n*row+m]);

delete []M;

return 1;
}

用的是GDI+, 试验的样本是一张jpeg
...全文
145 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
konriuen 2005-04-24
  • 打赏
  • 举报
回复
你的blocksize好像是3,用blocksize为长宽的矩形内进行平均,然后算灰度值?算法能不能说详细点?你这样算灰度图有什么好处么?
eddyxu 2005-04-23
  • 打赏
  • 举报
回复
这个是以一个blocksize为长宽的矩形内进行平均...
konriuen 2005-04-23
  • 打赏
  • 举报
回复
平均灰度的算法无外乎是将彩色图片的一个画素的R,G,B加起来除以3来计算灰度图像对应该画素的灰度值。你的算法是不是有点问题啊

4,447

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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