gpt4 book ai didi

c# - 检测图像中的正方形

转载 作者:行者123 更新时间:2023-12-02 16:17:52 25 4
gpt4 key购买 nike

在学校,我们正在准备已扫描的艺术品,并希望将其自动裁剪为正确的尺寸。 children (尝试)在矩形内绘制:
enter image description here
我想检测内部矩形边框,因此我对Accord.net应用了一些过滤器:

var newImage = new Bitmap(@"C:\Temp\temp.jpg");
var g = Graphics.FromImage(newImage);
var pen = new Pen(Color.Purple, 10);

var grayScaleFilter = new Grayscale(1, 0, 0);
var image = grayScaleFilter.Apply(newImage);
image.Save(@"C:\temp\grey.jpg");

var skewChecker = new DocumentSkewChecker();
var angle = skewChecker.GetSkewAngle(image);
var rotationFilter = new RotateBilinear(-angle);
rotationFilter.FillColor = Color.White;
var rotatedImage = rotationFilter.Apply(image);
rotatedImage.Save(@"C:\Temp\rotated.jpg");

var thresholdFilter = new IterativeThreshold(10, 128);
thresholdFilter.ApplyInPlace(rotatedImage);
rotatedImage.Save(@"C:\temp\threshold.jpg");

var invertFilter = new Invert();
invertFilter.ApplyInPlace(rotatedImage);
rotatedImage.Save(@"C:\temp\inverted.jpg");

var bc = new BlobCounter
{
BackgroundThreshold = Color.Black,
FilterBlobs = true,
MinWidth = 1000,
MinHeight = 1000
};

bc.ProcessImage(rotatedImage);
foreach (var rect in bc.GetObjectsRectangles())
{
g.DrawRectangle(pen, rect);
}

newImage.Save(@"C:\Temp\test.jpg");
这将产生以下反转图像,BlobCounter将其用作输入:
enter image description here
但是,blobcounter的结果并不是非常准确,紫色线表示BC已检测到的内容。
enter image description here
在Accord.net中,是否有更好的替代 BlobCounter的替代方法,还是有其他C#库更适合这种计算机视觉?

最佳答案

这是一个让我无聊的午休时间的简单解决方案。
基本上,它只是从外部到内部扫描所有尺寸以获得给定的颜色阈值(黑色),然后得到最突出的结果。
给定

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe bool IsValid(int* scan0Ptr, int x, int y,int stride, double thresh)
{
var c = *(scan0Ptr + x + y * stride);
var r = ((c >> 16) & 255);
var g = ((c >> 8) & 255);
var b = ((c >> 0) & 255);

// compare it against the threshold
return r * r + g * g + b * b < thresh;
}

private static int GetBest(IEnumerable<int> array)
=> array.Where(x => x != 0)
.GroupBy(i => i)
.OrderByDescending(grp => grp.Count())
.Select(grp => grp.Key)
.First();
示例
private static unsafe Rectangle ConvertImage(string path, Color source,  double threshold)
{

var thresh = threshold * threshold;

using var bmp = new Bitmap(path);

// lock the array for direct access
var bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
int left, top, bottom, right;

try
{
// get the pointer
var scan0Ptr = (int*)bitmapData.Scan0;
// get the stride
var stride = bitmapData.Stride / 4;

var array = new int[bmp.Height];

for (var y = 0; y < bmp.Height; y++)
for (var x = 0; x < bmp.Width; x++)
if (IsValid(scan0Ptr, x, y, stride, thresh))
{
array[y] = x;
break;
}

left = GetBest(array);

array = new int[bmp.Height];

for (var y = 0; y < bmp.Height; y++)
for (var x = bmp.Width-1; x > 0; x--)
if (IsValid(scan0Ptr, x, y, stride, thresh))
{
array[y] = x;
break;
}

right = GetBest(array);

array = new int[bmp.Width];

for (var x = 0; x < bmp.Width; x++)
for (var y = 0; y < bmp.Height; y++)
if (IsValid(scan0Ptr, x, y, stride, thresh))
{
array[x] = y;
break;
}

top = GetBest(array);

array = new int[bmp.Width];

for (var x = 0; x < bmp.Width; x++)
for (var y = bmp.Height-1; y > 0; y--)
if (IsValid(scan0Ptr, x, y, stride, thresh))
{
array[x] = y;
break;
}

bottom = GetBest(array);


}
finally
{
// unlock the bitmap
bmp.UnlockBits(bitmapData);
}

return new Rectangle(left,top,right-left,bottom-top);

}
用法
var fileName = @"D:\7548p.jpg";

var rect = ConvertImage(fileName, Color.Black, 50);

using var src = new Bitmap(fileName);
using var target = new Bitmap(rect.Width, rect.Height);
using var g = Graphics.FromImage(target);

g.DrawImage(src, new Rectangle(0, 0, target.Width, target.Height), rect, GraphicsUnit.Pixel);

target.Save(@"D:\Test.Bmp");
输出
enter image description here

注意事项:
  • 这并不是防弹或最佳解决方案。只是一种快速简单的方法。
  • 有许多方法可以做到这一点,即使是机器学习的方法也可能更好,更强大。
  • 这里有很多代码重复,基本上我只是为每一面
  • 复制,粘贴和调整
  • 我刚刚选择了一个似乎有效的任意阈值。玩
  • 让侧面最常见的情况可能不是最好的方法,也许您想对结果进行分类。
  • 您可能会理智地限制一侧需要扫描的数量。
  • 关于c# - 检测图像中的正方形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64311268/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com