/**************************************************
* Sobel算子边缘检测
* parameter: srcData - 原始图像数据指针
* dstData - 存储处理后的图像
* lWidth,lHeight - 图像的宽和高
* dLineBites - 单行图像的字节数(4的倍数)
**************************************************/
Void TEncSearch::SobelEdgeDetect(Pel * srcData,Pel * dstData,int lWidth,int lHeight,int dLineBites)
{
int KERNEL[4][9] = {{-1,0,1,-2,0,2,-1,0,1},
{-1,-2,-1,0,0,0,1,2,1},
{-2,-1,0,-1,0,1,0,1,2},
{0,-1,-2,1,0,-1,2,1,0}};
int i,j,k,kernel_sum,total_sum = 0,nMax = 0;
Pel * pTmpSrcData = new Pel[lHeight*lWidth];
Pel * pTmpDstData = new Pel[lHeight*lWidth];
memcpy(pTmpDstData,srcData,lHeight*lWidth*2);
//for(int j=0;j<lHeight;j++)
//{
// for(int i=0;i<lWidth;i++)
// cout<<pTmpDstData[j*lWidth+i]<<"\t";
// cout<<endl;
//}
for (i = 1;i < lHeight - 1;i++)
{
pTmpSrcData = srcData + dLineBites * i;
//pTmpDstData = dstData + dLineBites * i;
//pTmpDstData = pTmpDstData + dLineBites * i;
for (j = 1;j < lWidth - 1; ++j)
{
total_sum = 0;
nMax = 0;
for (k = 0;k < 4;k++)
{
kernel_sum = *(pTmpSrcData + j - dLineBites - 1) * KERNEL[k][0]+
*(pTmpSrcData + j - dLineBites ) * KERNEL[k][1]+
*(pTmpSrcData + j - dLineBites + 1) * KERNEL[k][2]+
*(pTmpSrcData + j - 1) * KERNEL[k][3]+
*(pTmpSrcData + j ) * KERNEL[k][4]+
*(pTmpSrcData + j + 1) * KERNEL[k][5]+
*(pTmpSrcData + j + dLineBites - 1) * KERNEL[k][6]+
*(pTmpSrcData + j + dLineBites ) * KERNEL[k][7]+
*(pTmpSrcData + j + dLineBites + 1) * KERNEL[k][8];
kernel_sum = abs(kernel_sum);
//total_sum += abs(kernel_sum);
if(nMax < kernel_sum)
nMax = kernel_sum;
}
if(nMax > 255)
nMax = 255;
*(pTmpDstData + dLineBites * i + j) = (Pel)nMax;
//*(pTmpDstData + j) = (Pel)nMax;
}
}
for(int j=0;j<lHeight;j++)
{
for(int i=0;i<lWidth;i++)
cout<<pTmpDstData[j*lWidth+i]<<"\t";
cout<<endl;
}
memcpy(dstData,pTmpDstData,lHeight*lWidth*2);
pTmpDstData = NULL;
pTmpSrcData = NULL;
delete pTmpDstData;
delete pTmpSrcData;
}
sobel
最新推荐文章于 2024-07-30 20:25:10 发布