VS2005图像平滑速度好慢

Liekkas 2011-10-17 01:46:37
今天用VS2005的CImage读取图像,并用它进行图像平滑,选用了Sobel算子,一幅600*800的图像竟然花了约30s的时间,我以前用VC6.0做速度很快,用不了5s,当时没有用CImage类,而是自己读取的。我想问造成这种现象的原因是CImage类的使用吗?
...全文
124 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
laviewpbt 2011-10-17
  • 打赏
  • 举报
回复
SetPixel,GetPixel的问题,你的600*800的图,SOBEL算子的执行时间80MS足够了。
向立天 2011-10-17
  • 打赏
  • 举报
回复
速度快慢和IDE没有关系
可以肯定是CImage的问题
百事烟 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fengbingchun 的回复:]
用OpenCV的cvSmooth函数试试
[/Quote]
+1

试试

Liekkas 2011-10-17
  • 打赏
  • 举报
回复
Liekkas 2011-10-17
  • 打赏
  • 举报
回复
我把平滑处理放在doc.cpp中,是想用doc类将窗口分割得到的leftview类和ctreeview类联系起来,这样就可以在ctreeview类中进行图像读取操作,在leftview类中显示
Liekkas 2011-10-17
  • 打赏
  • 举报
回复
贴上部分代码,看看是不是由于代码的原因

//doc.cpp中

void C窗口分割Doc::FilterImage(CImage *image, int* smooth, float aver)
{
if(image->IsNull())
return;

int Temp[9];
memcpy(Temp,smooth,9*sizeof(int));

int i,j;
int Width=image->GetWidth();
int Height=image->GetHeight();

for(j=1;j<Height-1;j++)
for(i=1;i<Width-1;i++)
{
int r=0,g=0,b=0;
int index=0;

for(int col=-1;col<=1;col++)
for(int row=-1;row<=1;row++)
{
COLORREF clr=image->GetPixel(i+row,j+col);
r+=GetRValue(clr)*Temp[index];
g+=GetGValue(clr)*Temp[index];
b+=GetBValue(clr)*Temp[index];

}
r=int(r*aver);
g=int(g*aver);
b=int(b*aver);

if(r>255) r=255;
else if(r<0) r=-r;

if(g>255) g=255;
else if(g<0) g=-g;

if(b>255) b=255;
else if(b<0) b=-b;

image->SetPixel(i-1,j-1,RGB(r,g,b));//错位重写以避免前一个像素被覆盖
}
}



void C窗口分割Doc::On32777()
{
// TODO: 在此添加命令处理程序代码
if(!m_Image1.IsNull())
{


int smoothSobel[9]={-3,0,3,-10,0,10,-3,0,3};

CMainFrame* pMainWnd = (CMainFrame*) AfxGetMainWnd();
CLeftView * pView=(CLeftView * )pMainWnd->GetActiveView();

FilterImage(&m_Image1,smoothSobel,float(1.0/16.0));

UpdateAllViews(pView);
}


}



//LeftView.cpp中

void CLeftView::OnDraw(CDC* pDC)
{
C窗口分割Doc* pDoc =(C窗口分割Doc*) GetDocument();
// TODO: 在此添加绘制代码
CSize sizeTotal;

if(!pDoc->m_Image1.IsNull())
{

sizeTotal.cx = pDoc->m_Image1.GetWidth();
sizeTotal.cy = pDoc->m_Image1.GetHeight();
SetScrollSizes(MM_TEXT, sizeTotal);
pDoc->m_Image1.Draw(pDC->m_hDC,0,0);

}


}

fengbingchun 2011-10-17
  • 打赏
  • 举报
回复
用OpenCV的cvSmooth函数试试

19,468

社区成员

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

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