我用单文档下,菜单驱动的方式,编写了sobel边缘检测的 程序,执行时大约到i=60处,程序显示出现问题需要关闭,我把数据读出后,做了变换,然后把负值变为绝对值,把大于255的变为255,是不是需要特殊规定。源代码如下:
CDC *pDC=(this)->GetDC( );
int width=m_dib.GetWidth( );
int height=m_dib.GetHeight( );
m_Data1=new int[width*height*sizeof(int)];
m_Data2=new int[width*height*sizeof(int)];
m_Data3=new int[width*height*sizeof(int)];
m_rData1=new int[width*height*sizeof(int)];
m_rData2=new int[width*height*sizeof(int)];
m_rData3=new int[width*height*sizeof(int)];
if(!m_Data1||!m_Data2||!m_Data3)
{
AfxMessageBox("内存不够");
return;
}
if(!m_rData1||!m_rData2||!m_rData3)
{
AfxMessageBox("内存不够");
return;
}
int i,j;
for(i=0;i<width;i++)
{
for(j=0;j<height;j++)
{
COLORREF color=pDC->GetPixel(i,j);
int r=GetRValue(color);
int g=GetGValue(color);
int b=GetBValue(color);
*(m_Data1+i*height+j)=r;
*(m_Data2+i*height+j)=g;
*(m_Data3+i*height+j)=b;
}
}
int laplace[9]={-1,-1,-1,-1,8,-1,-1,-1,-1,};
for(i=1;i<width-1;i++)
for(j=1;j<height-1;j++)
{
int value1=0;
int value2=0;
int value3=0; value1=(*(m_Data1+(i-1)*height+(j-1)))*(-1)
+(*(m_Data1+(i)*height+j-1))*(-2)+
(*(m_Data1+(i+1)*height+(j-1)))*(-1)
+(*(m_Data1+(i-1)*height+(j+1)))*(1)+
(*(m_Data1+(i)*height+j+1))*(2)+
(*(m_Data1+(i+1)*height+(j+1)))*(1);
value2=(*(m_Data2+(i-1)*height+(j-1)))*(-1)
+(*(m_Data2+(i)*height+j-1))*(-2)+
(*(m_Data2+(i+1)*height+(j-1)))*(-1)+
(*(m_Data2+(i-1)*height+(j+1)))*(1)+
(*(m_Data2+(i)*height+j+1))*(2)+
(*(m_Data2+(i+1)*height+(j+1)))*(1);
value3=(*(m_Data3+(i-1)*height+(j-1)))*(-1)
+(*(m_Data3+(i)*height+j-1))*(-2)+
(*(m_Data3+(i+1)*height+(j-1)))*(-1)+
(*(m_Data3+(i-1)*height+(j+1)))*(1)+
(*(m_Data3+(i)*height+j+1))*(2)+
(*(m_Data3+(i+1)*height+(j+1)))*(1);
*(m_rData1+i*width+j)= abs(value1);
*(m_rData2+i*width+j)=abs(value2);
*(m_rData3+i*width+j)=abs(value3);
/* CString str;
str.Format("%d,%d,%d",*(m_rData1+i*width+j),*(m_rData2+i*width+j),*(m_rData3+i*width+j));
AfxMessageBox(str);*/
} for(i=1;i<width-1;i++)
for(j=1;j<height-1;j++)
{
int r,g,b;
r=*(m_rData1+i*width+j);
g=*(m_rData2+i*width+j);
b=*(m_rData3+i*width+j);
CDC *pDC=(this)->GetDC();
if(r>255) r=255; if(g>255) g=255; if(b>255) b=255;
/* CString str;
str.Format("%d,%d,%d",r,g,b);
AfxMessageBox(str);*/
pDC->SetPixel(i,j,RGB(r,g,b));
}
CDC *pDC=(this)->GetDC( );
int width=m_dib.GetWidth( );
int height=m_dib.GetHeight( );
m_Data1=new int[width*height*sizeof(int)];
m_Data2=new int[width*height*sizeof(int)];
m_Data3=new int[width*height*sizeof(int)];
m_rData1=new int[width*height*sizeof(int)];
m_rData2=new int[width*height*sizeof(int)];
m_rData3=new int[width*height*sizeof(int)];
if(!m_Data1||!m_Data2||!m_Data3)
{
AfxMessageBox("内存不够");
return;
}
if(!m_rData1||!m_rData2||!m_rData3)
{
AfxMessageBox("内存不够");
return;
}
int i,j;
for(i=0;i<width;i++)
{
for(j=0;j<height;j++)
{
COLORREF color=pDC->GetPixel(i,j);
int r=GetRValue(color);
int g=GetGValue(color);
int b=GetBValue(color);
*(m_Data1+i*height+j)=r;
*(m_Data2+i*height+j)=g;
*(m_Data3+i*height+j)=b;
}
}
int laplace[9]={-1,-1,-1,-1,8,-1,-1,-1,-1,};
for(i=1;i<width-1;i++)
for(j=1;j<height-1;j++)
{
int value1=0;
int value2=0;
int value3=0; value1=(*(m_Data1+(i-1)*height+(j-1)))*(-1)
+(*(m_Data1+(i)*height+j-1))*(-2)+
(*(m_Data1+(i+1)*height+(j-1)))*(-1)
+(*(m_Data1+(i-1)*height+(j+1)))*(1)+
(*(m_Data1+(i)*height+j+1))*(2)+
(*(m_Data1+(i+1)*height+(j+1)))*(1);
value2=(*(m_Data2+(i-1)*height+(j-1)))*(-1)
+(*(m_Data2+(i)*height+j-1))*(-2)+
(*(m_Data2+(i+1)*height+(j-1)))*(-1)+
(*(m_Data2+(i-1)*height+(j+1)))*(1)+
(*(m_Data2+(i)*height+j+1))*(2)+
(*(m_Data2+(i+1)*height+(j+1)))*(1);
value3=(*(m_Data3+(i-1)*height+(j-1)))*(-1)
+(*(m_Data3+(i)*height+j-1))*(-2)+
(*(m_Data3+(i+1)*height+(j-1)))*(-1)+
(*(m_Data3+(i-1)*height+(j+1)))*(1)+
(*(m_Data3+(i)*height+j+1))*(2)+
(*(m_Data3+(i+1)*height+(j+1)))*(1);
*(m_rData1+i*width+j)= abs(value1);
*(m_rData2+i*width+j)=abs(value2);
*(m_rData3+i*width+j)=abs(value3);
/* CString str;
str.Format("%d,%d,%d",*(m_rData1+i*width+j),*(m_rData2+i*width+j),*(m_rData3+i*width+j));
AfxMessageBox(str);*/
} for(i=1;i<width-1;i++)
for(j=1;j<height-1;j++)
{
int r,g,b;
r=*(m_rData1+i*width+j);
g=*(m_rData2+i*width+j);
b=*(m_rData3+i*width+j);
CDC *pDC=(this)->GetDC();
if(r>255) r=255; if(g>255) g=255; if(b>255) b=255;
/* CString str;
str.Format("%d,%d,%d",r,g,b);
AfxMessageBox(str);*/
pDC->SetPixel(i,j,RGB(r,g,b));
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货