
5个回答
展开全部
。。轮廓?计算机图形学~~
我现在搞的项目就涉及轮廓查找
我用的是OpenCV,是一个开源的算法,基于VC,里面有大量的算法,当然包括了
轮廓的查找算法~~有好几个
可以搜索OpenCV关键字~~
我现在搞的项目就涉及轮廓查找
我用的是OpenCV,是一个开源的算法,基于VC,里面有大量的算法,当然包括了
轮廓的查找算法~~有好几个
可以搜索OpenCV关键字~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?

2025-02-27 广告
几何智造191-2953-3665(深圳市几何智造技术有限公司)是一家高新科技创新型企业,专注于国际物流行业货物高精度测量、自动化分拣、高性能输送线、智能仓储服务以及控制系统研发,专为国际货代行业提供全自动化高效率的物流解决方案。旗下主要产...
点击进入详情页
本回答由几何智造提供
展开全部
抄来一段:
SUSAN算子是一种基于图像局部灰度特征的算法,利用一个圆形的模板对图像进行扫描,比较模板内部的点与模板中心点的灰度值,如果灰度差值小于一定的阈值,就认为该点与中心点的灰度相同。统计模板内部与中心点灰度相同的点的个数,与一个阈值进行比较,判断该点是否属于某个区域的边缘点,从而实现对图像的分割。
//———————————————————————–
//c/c++描述
/**************************************************
SUSAN边缘检测
parameter: HDIB
return: HDIB
**************************************************/
HDIB SUSANEdgeDetectDIB(HDIB hDib){
SetCursor(LoadCursor(NULL, IDC_WAIT));
DWORD dwDataLength = GlobalSize(hDib);
HDIB hNewDib = GlobalAlloc(GHND,dwDataLength);
if(!hNewDib){
SetCursor(LoadCursor(NULL, IDC_ARROW));
return NULL;
}
LPBYTE lpDIB = (LPBYTE)GlobalLock(hNewDib);
if(lpDIB == NULL){
SetCursor(LoadCursor(NULL, IDC_ARROW));
return NULL;
}
LPBYTE lpDIBSrc = (LPBYTE)GlobalLock(hDib);
memcpy(lpDIB, lpDIBSrc,
sizeof(BITMAPINFOHEADER)+PaletteSize(lpDIBSrc));
DWORD lSrcWidth = DIBWidth(lpDIBSrc);
DWORD lSrcHeight = DIBHeight(lpDIBSrc);
WORD wBitCount = ((LPBITMAPINFOHEADER)lpDIBSrc)->biBitCount;
DWORD lSrcRowBytes = WIDTHBYTES(lSrcWidth*((DWORD)wBitCount));
LPBYTE lpOldBits = FindDIBBits(lpDIBSrc);
LPBYTE lpData = FindDIBBits(lpDIB);
//图像变换开始//////////////////////////////////////////
DWORD i, j, h, k, offset;
int NearPoint[37];
int OffSetX[37] = { -1, 0, 1,
-2,-1, 0, 1, 2,
-3,-2,-1, 0, 1, 2, 3,
-3,-2,-1, 0, 1, 2, 3,
-3,-2,-1, 0, 1, 2, 3,
-2,-1, 0, 1, 2,
-1, 0, 1 };
int OffSetY[37] = { -3,-3,-3,
-2,-2,-2,-2,-2,
-1,-1,-1,-1,-1,-1,-1,
0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2,
3, 3, 3 };
if(wBitCount == 8){
int thre, same, max, min;
//统计象素亮度最大值和最小值
max = min = 0;
for(i=0;i for(j=0;j offset = lSrcRowBytes*i+j;
if(max < (int)(*(lpOldBits+offset)))
max = (int)(*(lpOldBits+offset));
if(min > (int)(*(lpOldBits+offset)))
min = (int)(*(lpOldBits+offset));
}
//相似度阈值为最大值和最小值差的1/10
thre = (max-min)/10;
for(i=3;i for(j=3;j //统计圆形邻域内相似的点的个数
same = 0;
for(h=0;h<37;h++)
NearPoint[h] = (int)(*(lpOldBits+lSrcRowBytes*(i+OffSetY[h])+(j+OffSetX[h])));
for(h=0;h<37;h++)
if(((int)abs(NearPoint[h]-NearPoint[18])) <= thre) same ++;
if(same > 27)
*(lpData+lSrcRowBytes*i+j) = 255;
else *(lpData+lSrcRowBytes*i+j) = 0;
}
}
if(wBitCount == 24){
int theSame[3], theMax[3], theMin[3], theThre[3];
memset(theMax, 0, sizeof(int)*3);
memset(theMin, 0, sizeof(int)*3);
for(i=0;i for(j=0;j offset = lSrcRowBytes*i+j*3;
for(k=0;k<3;k++){
if(theMax[k] < (int)(*(lpOldBits+offset+k)))
theMax[k] = (int)(*(lpOldBits+offset+k));
if(theMin[k] > (int)(*(lpOldBits+offset+k)))
theMin[k] = (int)(*(lpOldBits+offset+k));
}
}
for(k=0;k<3;k++)
theThre[k] = (theMax[k]-theMin[k])/10;
for(i=3;i for(j=3;j memset(theSame, 0, sizeof(int)*3);
for(k=0;k<3;k++){
for(h=0;h<37;h++)
NearPoint[h] = (int)(*(lpOldBits+lSrcRowBytes*(i+OffSetY[h])+(j+OffSetX[h])*3+k));
for(h=0;h<37;h++)
if(((int)abs(NearPoint[h]-NearPoint[18])) <= theThre[k]) theSame[k] ++;
}
if((theSame[0] > 27) && (theSame[1] > 27) && (theSame[2] > 27))
memset(lpData+lSrcRowBytes*i+j*3, 255, 3);
else
memset(lpData+lSrcRowBytes*i+j*3, 0, 3);
}
}
GlobalUnlock(hDib);
GlobalUnlock(hNewDib);
SetCursor(LoadCursor(NULL, IDC_ARROW));
return hNewDib;
}
2.canny算子
Canny边缘检测基本原理
(1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。
(3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
算法比较内容比较多,有需要的朋友可以到这儿看(http://www.pcdog.com/edu/develop-tools/2005/08/f067918.html).
3.sobel算子
。。。
见参考
SUSAN算子是一种基于图像局部灰度特征的算法,利用一个圆形的模板对图像进行扫描,比较模板内部的点与模板中心点的灰度值,如果灰度差值小于一定的阈值,就认为该点与中心点的灰度相同。统计模板内部与中心点灰度相同的点的个数,与一个阈值进行比较,判断该点是否属于某个区域的边缘点,从而实现对图像的分割。
//———————————————————————–
//c/c++描述
/**************************************************
SUSAN边缘检测
parameter: HDIB
return: HDIB
**************************************************/
HDIB SUSANEdgeDetectDIB(HDIB hDib){
SetCursor(LoadCursor(NULL, IDC_WAIT));
DWORD dwDataLength = GlobalSize(hDib);
HDIB hNewDib = GlobalAlloc(GHND,dwDataLength);
if(!hNewDib){
SetCursor(LoadCursor(NULL, IDC_ARROW));
return NULL;
}
LPBYTE lpDIB = (LPBYTE)GlobalLock(hNewDib);
if(lpDIB == NULL){
SetCursor(LoadCursor(NULL, IDC_ARROW));
return NULL;
}
LPBYTE lpDIBSrc = (LPBYTE)GlobalLock(hDib);
memcpy(lpDIB, lpDIBSrc,
sizeof(BITMAPINFOHEADER)+PaletteSize(lpDIBSrc));
DWORD lSrcWidth = DIBWidth(lpDIBSrc);
DWORD lSrcHeight = DIBHeight(lpDIBSrc);
WORD wBitCount = ((LPBITMAPINFOHEADER)lpDIBSrc)->biBitCount;
DWORD lSrcRowBytes = WIDTHBYTES(lSrcWidth*((DWORD)wBitCount));
LPBYTE lpOldBits = FindDIBBits(lpDIBSrc);
LPBYTE lpData = FindDIBBits(lpDIB);
//图像变换开始//////////////////////////////////////////
DWORD i, j, h, k, offset;
int NearPoint[37];
int OffSetX[37] = { -1, 0, 1,
-2,-1, 0, 1, 2,
-3,-2,-1, 0, 1, 2, 3,
-3,-2,-1, 0, 1, 2, 3,
-3,-2,-1, 0, 1, 2, 3,
-2,-1, 0, 1, 2,
-1, 0, 1 };
int OffSetY[37] = { -3,-3,-3,
-2,-2,-2,-2,-2,
-1,-1,-1,-1,-1,-1,-1,
0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2,
3, 3, 3 };
if(wBitCount == 8){
int thre, same, max, min;
//统计象素亮度最大值和最小值
max = min = 0;
for(i=0;i for(j=0;j offset = lSrcRowBytes*i+j;
if(max < (int)(*(lpOldBits+offset)))
max = (int)(*(lpOldBits+offset));
if(min > (int)(*(lpOldBits+offset)))
min = (int)(*(lpOldBits+offset));
}
//相似度阈值为最大值和最小值差的1/10
thre = (max-min)/10;
for(i=3;i for(j=3;j //统计圆形邻域内相似的点的个数
same = 0;
for(h=0;h<37;h++)
NearPoint[h] = (int)(*(lpOldBits+lSrcRowBytes*(i+OffSetY[h])+(j+OffSetX[h])));
for(h=0;h<37;h++)
if(((int)abs(NearPoint[h]-NearPoint[18])) <= thre) same ++;
if(same > 27)
*(lpData+lSrcRowBytes*i+j) = 255;
else *(lpData+lSrcRowBytes*i+j) = 0;
}
}
if(wBitCount == 24){
int theSame[3], theMax[3], theMin[3], theThre[3];
memset(theMax, 0, sizeof(int)*3);
memset(theMin, 0, sizeof(int)*3);
for(i=0;i for(j=0;j offset = lSrcRowBytes*i+j*3;
for(k=0;k<3;k++){
if(theMax[k] < (int)(*(lpOldBits+offset+k)))
theMax[k] = (int)(*(lpOldBits+offset+k));
if(theMin[k] > (int)(*(lpOldBits+offset+k)))
theMin[k] = (int)(*(lpOldBits+offset+k));
}
}
for(k=0;k<3;k++)
theThre[k] = (theMax[k]-theMin[k])/10;
for(i=3;i for(j=3;j memset(theSame, 0, sizeof(int)*3);
for(k=0;k<3;k++){
for(h=0;h<37;h++)
NearPoint[h] = (int)(*(lpOldBits+lSrcRowBytes*(i+OffSetY[h])+(j+OffSetX[h])*3+k));
for(h=0;h<37;h++)
if(((int)abs(NearPoint[h]-NearPoint[18])) <= theThre[k]) theSame[k] ++;
}
if((theSame[0] > 27) && (theSame[1] > 27) && (theSame[2] > 27))
memset(lpData+lSrcRowBytes*i+j*3, 255, 3);
else
memset(lpData+lSrcRowBytes*i+j*3, 0, 3);
}
}
GlobalUnlock(hDib);
GlobalUnlock(hNewDib);
SetCursor(LoadCursor(NULL, IDC_ARROW));
return hNewDib;
}
2.canny算子
Canny边缘检测基本原理
(1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。
(3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
算法比较内容比较多,有需要的朋友可以到这儿看(http://www.pcdog.com/edu/develop-tools/2005/08/f067918.html).
3.sobel算子
。。。
见参考
参考资料: http://www.roading.net/blog/?cat=11
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2009-01-06
展开全部
没建议
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2009-01-25
展开全部
问题不够详细,外加忒专业了点~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询