我有一个看起来像这样的图像:
我想像这样找到黑暗部分的边缘(红线是我要找的):
我尝试了一些方法,但都没有奏效,所以我希望那里有一位 emgu 大师愿意帮助我......
方法一
- 将图像转换为灰度
- 去除噪音并反转
- 删除任何不是很亮的东西
- 获取精明和多边形
代码(我知道我应该正确处理东西,但我保持代码简短):
var orig = new Image<Bgr, byte>(inFile);
var contours = orig
.Convert<Gray, byte>()
.PyrDown()
.PyrUp()
.Not()
.InRange(new Gray(190), new Gray(255))
.Canny(new Gray(190), new Gray(255))
.FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
RETR_TYPE.CV_RETR_TREE);
var output = new Image<Gray, byte>(orig.Size);
for (; contours != null; contours = contours.HNext)
{
var poly = contours.ApproxPoly(contours.Perimeter*0.05,
contours.Storage);
output.Draw(poly, new Gray(255), 1);
}
output.Save(outFile);
这是结果:
方法二
- 将图像转换为灰度
- 去除噪音并反转
- 删除任何不是很亮的东西
- 得到精明,然后线条
代码:
var orig = new Image<Bgr, byte>(inFile);
var linesegs = orig
.Convert<Gray, byte>()
.PyrDown()
.PyrUp()
.Not()
.InRange(new Gray(190), new Gray(255))
.Canny(new Gray(190), new Gray(255))
.HoughLinesBinary(
1,
Math.PI/45.0,
20,
30,
10
)[0];
var output = new Image<Gray, byte>(orig.Size);
foreach (var l in linesegs)
{
output.Draw(l, new Gray(255), 1);
}
output.Save(outFile);
这是结果:
笔记
我已经尝试调整这两种方法的所有参数并添加平滑,但我永远无法获得我需要的简单边缘,因为我想,较暗的区域不是纯色。
我也尝试过膨胀和腐蚀,但我必须为它们输入的参数太高才能获得单一颜色,以至于我最终会在右侧包含一些灰色的东西并失去准确性。