首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

分水岭算法中计算输入图像的梯度这段代码是什么意思解决思路

2013-01-06 
分水岭算法中计算输入图像的梯度这段代码是什么意思先上代码,代码是我从网上下的void CMyImageDBDoc::GetG

分水岭算法中计算输入图像的梯度这段代码是什么意思
先上代码,代码是我从网上下的


void CMyImageDBDoc::GetGradient(BYTE* image, INT width, INT height
, FLOAT* deltar, FLOAT* deltasita)
//得到输入图像的梯度;
{
//下面计算各像素在水平和垂直方向上的梯度,边缘点梯度计为0;
INT* deltaxarr;
INT* deltayarr;
INT grawidth = width;
INT graheight = height;
INT deltacount = grawidth * graheight;
deltaxarr = new INT[deltacount];
deltayarr = new INT[deltacount];

    //暂不计算边缘点;
for (INT y=1; y<graheight-1; y++)
{
for (INT x=1; x<grawidth-1; x++)
{
INT inarrpos = ((y)*width + (x))*3 + 1;//在输入块中的位置;
INT deltaarrpos = y*grawidth + x;//在梯度数组中的位置;
//卷积计算;
deltaxarr[deltaarrpos] = (INT) ( ( 
image[((y-1)*width + (x+1))*3 + 1] //右上
+ image[((y)*width + (x+1))*3 + 1] //右
+ image[((y+1)*width + (x+1))*3 + 1] //右下
- image[((y-1)*width + (x-1))*3 + 1] //左上
- image[((y)*width + (x-1))*3 + 1] //左
- image[((y+1)*width + (x-1))*3 + 1] ) / 3 );//左下
deltayarr[deltaarrpos] = (INT) ( ( 
image[((y-1)*width + (x+1))*3 + 1] //右上
+ image[((y-1)*width + (x))*3 + 1] //上
+ image[((y-1)*width + (x-1))*3 + 1] //左上
- image[((y+1)*width + (x-1))*3 + 1] //左下
- image[((y+1)*width + (x))*3 + 1] //下
- image[((y+1)*width + (x+1))*3 + 1]) / 3 );//右下
}
}

//边缘赋为其内侧点的值;
for (y=0; y<graheight; y++)
{
INT x1 = 0;
INT pos1 = y*grawidth + x1;
deltaxarr[pos1] = deltaxarr[pos1+1];
deltayarr[pos1] = deltayarr[pos1+1];
INT x2 = grawidth-1;
INT pos2 = y*grawidth + x2;
deltaxarr[pos2] = deltaxarr[pos2-1];
deltayarr[pos2] = deltayarr[pos2-1];
}
for (INT x=0; x<grawidth; x++)
{
INT y1 = 0;
INT pos1 = x;
INT inner = x + grawidth;//下一行;
deltaxarr[pos1] = deltaxarr[inner];
deltayarr[pos1] = deltayarr[inner];
INT y2 = graheight-1;
INT pos2 = y2*grawidth + x;
inner = pos2 - grawidth;//上一行;
deltaxarr[pos2] = deltaxarr[inner];
deltayarr[pos2] = deltayarr[inner];
}


for (y=0; y<graheight; y++)
{
for (x=0; x<grawidth; x++)
{
INT temppos = y*grawidth + x;
if ( (deltaxarr[temppos])==0 )
{
if (deltayarr[temppos]!=0)
{
deltasita[temppos] = 0;//水平方向;
deltar[temppos] = (FLOAT) abs(deltayarr[temppos]);
}
else
{
deltasita[temppos] = -1;//无确定方向;
deltar[temppos] = (FLOAT) abs(deltayarr[temppos]);
}
continue;
}
deltasita[temppos] = (FLOAT) ( atan( 
(FLOAT)deltayarr[temppos]
/ (FLOAT)deltaxarr[temppos] ) + PI/2. );


deltar[temppos] = (FLOAT) sqrt((DOUBLE) 
( deltayarr[temppos]*deltayarr[temppos]
+ deltaxarr[temppos]*deltaxarr[temppos] ) );
}
}

delete [] deltaxarr; deltaxarr = NULL; //删除水平和垂直梯度数组;
delete [] deltayarr; deltayarr = NULL;
}
我想问的是,
INT inarrpos = ((y)*width + (x))*3 + 1;//在输入块中的位置;
这段代码是什么意思呢,为什么要乘以3再加1,然后还有下面这整个循环啥意思,我也不明白,请懂的人详细给我说说这段代码
for (y=0; y<graheight; y++)
{
for (x=0; x<grawidth; x++)
{
INT temppos = y*grawidth + x;
if ( (deltaxarr[temppos])==0 )
{
if (deltayarr[temppos]!=0)
{
deltasita[temppos] = 0;//水平方向;
deltar[temppos] = (FLOAT) abs(deltayarr[temppos]);
}
else
{
deltasita[temppos] = -1;//无确定方向;
deltar[temppos] = (FLOAT) abs(deltayarr[temppos]);
}
continue;
}
deltasita[temppos] = (FLOAT) ( atan( 
(FLOAT)deltayarr[temppos]
/ (FLOAT)deltaxarr[temppos] ) + PI/2. );
deltar[temppos] = (FLOAT) sqrt((DOUBLE) 
( deltayarr[temppos]*deltayarr[temppos]
+ deltaxarr[temppos]*deltaxarr[temppos] ) );
}
}
[解决办法]
可以看看opencv的cvWatershed函数及其源代码
[解决办法]
梯度一般计算就是灰度图中直接作差,可以看做上下,左右平移一个像素后的图像与原图作差(边界可以扩展0,复制边界,或者不计算)

热点排行