原理是:根据周围点与当前点的颜色差是否大于阈值,确定它是否为边缘点
之前我就用了这个函数,这次单独提取出来
http://huidong.xyz/?mode=2&id=375
http://huidong.xyz/?mode=2&id=374
http://huidong.xyz/?mode=2&id=395
适用性最强的:
// 是否为边缘点
// b 灰度差阈值
bool isEdgePoint(DWORD* pBuf, int w, int h, int x, int y, int b)
{
POINT t[4] = { {0,1}, {0,-1}, {1,0}, {-1,0} };
int r = GetRValue(pBuf[y * w + x]);
for (int i = 0; i < 4; i++)
{
int x2 = x + t[i].x, y2 = y + t[i].y;
if (x2 >= 0 && x2 < w && y2 >= 0 && y2 < h && GetRValue(pBuf[y2 * w + x2]) - r > b)
{
return true;
}
}
return false;
}
其次:
// 是否为边缘点
// b 灰度差阈值
bool isEdgePoint(int x, int y, int b)
{
POINT t[4] = { {0,1}, {0,-1}, {1,0}, {-1,0} };
int r = GetRValue(getpixel(x, y));
for (int i=0; i<4; i++)
{
if (GetRValue(getpixel(x+t[i].x, y+t[i].y)) - r > b)
{
return true;
}
}
return false;
}
再次:
// 是否为边缘点
bool isEdgePoint(int x, int y)
{
POINT t[4] = { {0,1}, {0,-1}, {1,0}, {-1,0} };
//POINT t[4] = { {0,2}, {0,-2}, {2,0}, {-2,0} };
if (getpixel(x, y) != WHITE)
{
return false;
}
for (int i=0; i<4; i++)
{
if (getpixel(x+t[i].x, y+t[i].y) != WHITE)
{
return true;
}
}
return false;
}
根据自己的需要改来用吧。
改变筛选网格,可以获得更多的效果。