消除另一个斑点内的斑点
Eliminating blob inside another blob
我目前正在开发一个使用 C# 和 AForge.NET 进行字符识别的程序,现在我正在努力处理 blob。
这就是我创建 blob 的方式:
BlobCounter bcb = new BlobCounter();
bcb.FilterBlobs = true;
bcb.MinHeight = 30;
bcb.MinWidth = 5;
bcb.ObjectsOrder = ObjectsOrder.XY;
bcb.ProcessImage(image);
我还用矩形标记了它们:
Rectangle[] rects;
rects = bcb.GetObjectsRectangles();
Pen pen = new Pen(Color.Red, 1);
Graphics g = Graphics.FromImage(image);
foreach (Rectangle rect in rects)
{
g.DrawRectangle(pen, rect);
}
执行后我的参考图像如下所示:
BlobImage
如你所见,几乎所有的字符都被识别了。不幸的是,某些字符在 blob 中包含 blob,例如"g"、"o" 或 "d"。
我想消除另一个 blob 中的 blob。
我尝试调整矩形的绘制以实现我的 objective:
foreach (Rectangle rect in rects)
{
for (int i = 0; i < (rects.Length - 1); i++)
{
if (rects[i].Contains(rects[i + 1]))
rects[i] = Rectangle.Union(rects[i], rects[i + 1]);
}
g.DrawRectangle(pen, rect);
}
...但是一点都不成功
也许你们中的一些人可以帮助我?
您可以尝试通过检查角索引来检测矩形内的矩形,
我为此编写了一个 MATLAB 代码来解决类似问题:
这里是代码片段:
function varargout = isBoxMerg(ReferenceBox,TestBox,isNewBox)
X = ReferenceBox; Y = TestBox;
X1 = X(1);Y1 = X(2);W1 = X(3);H1 = X(4);
X2 = Y(1);Y2 = Y(2);W2 = Y(3);H2 = Y(4);
if ((X1+W1)>=X2 && (Y2+H2)>=Y1 && (Y1+H1)>=Y2 && (X1+W1)>=X2 && (X2+W2)>=X1)
Intersection = true;
else
`Intersection = false;`
end
- 其中X和Y是边界矩形的左上角索引; W 和 H 分别是宽度和高度。
在上面,如果 Intersection 变量为真,则表示框有交集。您可以使用此代码进行进一步的自定义。
谢谢
我目前正在开发一个使用 C# 和 AForge.NET 进行字符识别的程序,现在我正在努力处理 blob。
这就是我创建 blob 的方式:
BlobCounter bcb = new BlobCounter();
bcb.FilterBlobs = true;
bcb.MinHeight = 30;
bcb.MinWidth = 5;
bcb.ObjectsOrder = ObjectsOrder.XY;
bcb.ProcessImage(image);
我还用矩形标记了它们:
Rectangle[] rects;
rects = bcb.GetObjectsRectangles();
Pen pen = new Pen(Color.Red, 1);
Graphics g = Graphics.FromImage(image);
foreach (Rectangle rect in rects)
{
g.DrawRectangle(pen, rect);
}
执行后我的参考图像如下所示:
如你所见,几乎所有的字符都被识别了。不幸的是,某些字符在 blob 中包含 blob,例如"g"、"o" 或 "d"。
我想消除另一个 blob 中的 blob。
我尝试调整矩形的绘制以实现我的 objective:
foreach (Rectangle rect in rects)
{
for (int i = 0; i < (rects.Length - 1); i++)
{
if (rects[i].Contains(rects[i + 1]))
rects[i] = Rectangle.Union(rects[i], rects[i + 1]);
}
g.DrawRectangle(pen, rect);
}
...但是一点都不成功
也许你们中的一些人可以帮助我?
您可以尝试通过检查角索引来检测矩形内的矩形, 我为此编写了一个 MATLAB 代码来解决类似问题:
这里是代码片段:
function varargout = isBoxMerg(ReferenceBox,TestBox,isNewBox)
X = ReferenceBox; Y = TestBox;
X1 = X(1);Y1 = X(2);W1 = X(3);H1 = X(4);
X2 = Y(1);Y2 = Y(2);W2 = Y(3);H2 = Y(4);
if ((X1+W1)>=X2 && (Y2+H2)>=Y1 && (Y1+H1)>=Y2 && (X1+W1)>=X2 && (X2+W2)>=X1)
Intersection = true;
else
`Intersection = false;`
end
- 其中X和Y是边界矩形的左上角索引; W 和 H 分别是宽度和高度。
在上面,如果 Intersection 变量为真,则表示框有交集。您可以使用此代码进行进一步的自定义。
谢谢