我自己尝试写了下,但是老是错,所以希望有人能给一个能用的参考一下VC++图像处理Sobel边缘提取
解决方案 »
- 在对话框中手动定义一个编辑框,报错说ES_HSCROLL未定义
- VS2003或VS2005下用MFC调用webservice的方法(非托管)
- 常用字符串函数,希望对常问这些问题的人有用
- 画图程序中 色调 饱和度 亮度 和RGB中 的R G B 是什么关系呢?
- ado问题
- 如何确定Send中的缓冲区的长度呀?send 和sendto有什么区别?
- 在DLL中,如何将用PB获得的窗口句柄传给VC呢
- struct member align 16个字节何时起作用
- 先安装98后安装2000,如何在启动时使机器自动进98系统??
- 怎么完全去掉VC向导生成的 菜单 ?
- CToolTipCtrl重绘问题
- 求好人给一个用Sobel进行边缘提取的完整代码,O(∩_∩)O谢谢
Sobel边缘检测算法
Sobel边缘检测和边缘细化
/**************************************************
* Sobel算子边缘检测
* parameter: srcData - 原始图像数据指针
* dstData - 存储处理后的图像
* lWidth,lHeight - 图像的宽和高
* dLineBites - 单行图像的字节数(4的倍数)
**************************************************/
void WINAPI SobelEdgeDetect(LPBYTE srcData,LPBYTE dstData,LONG lWidth,LONG lHeight,DWORD 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;
unsigned char* pTmpSrcData = NULL;
unsigned char* pTmpDstData = NULL;
for (i = 1;i < lHeight - 1;i++)
{
pTmpSrcData = srcData + dLineBites * i;
pTmpDstData = dstData + 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 + j) = (unsigned char)nMax;
}
}
}