Skip to content

Commit dfba7c7

Browse files
committed
Implement scaling (WIP)
1 parent b0230f2 commit dfba7c7

File tree

9 files changed

+429
-14
lines changed

9 files changed

+429
-14
lines changed

paket.dependencies

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ group Test
1414
storage: none
1515
source https://api.nuget.org/v3/index.json
1616

17-
nuget NUnit ~> 3.14.0
18-
nuget NUnit3TestAdapter ~> 4.5.0
19-
nuget Microsoft.NET.Test.Sdk ~> 17.9.0
17+
nuget Aardvark.PixImage.ImageSharp ~> 2.0.1
18+
19+
nuget NUnit ~> 3.14.0
20+
nuget NUnit3TestAdapter ~> 4.5.0
21+
nuget Microsoft.NET.Test.Sdk ~> 17.9.0
22+
23+
nuget BenchmarkDotNet ~> 0.14.0

paket.lock

Lines changed: 267 additions & 10 deletions
Large diffs are not rendered by default.

src/Aardvark.OpenCV.Tests/Aardvark.OpenCV.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
55
<TargetFramework>net8.0</TargetFramework>
6+
<GenerateProgramFile>false</GenerateProgramFile>
67
</PropertyGroup>
78
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
89
<OutputPath>..\..\bin\Debug</OutputPath>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Reflection;
2+
using BenchmarkDotNet.Jobs;
3+
using BenchmarkDotNet.Running;
4+
using BenchmarkDotNet.Configs;
5+
6+
namespace Aardvark.OpenCV.Tests
7+
{
8+
public class Program
9+
{
10+
public static void Main(string[] args)
11+
{
12+
var job = Job.ShortRun.WithToolchain(BenchmarkDotNet.Toolchains.InProcess.Emit.InProcessEmitToolchain.Instance);
13+
var cfg = ManualConfig.Create(DefaultConfig.Instance).WithOptions(ConfigOptions.DisableOptimizationsValidator).AddJob(job);
14+
BenchmarkSwitcher.FromAssembly(Assembly.GetExecutingAssembly()).Run(args, cfg);
15+
}
16+
}
17+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using Aardvark.Base;
2+
using BenchmarkDotNet.Attributes;
3+
4+
namespace Aardvark.OpenCV.Tests
5+
{
6+
public class Scaling
7+
{
8+
[Params(128, 1024, 2048, 4096)]
9+
public int Size;
10+
11+
[Params(ImageInterpolation.Linear, ImageInterpolation.Cubic)]
12+
public ImageInterpolation Interpolation;
13+
14+
private PixImage<float> _image;
15+
16+
private readonly V2d _scaleFactor = new (0.234, 0.894);
17+
18+
[GlobalSetup]
19+
public void Init()
20+
{
21+
Aardvark.Base.Aardvark.Init();
22+
var rnd = new RandomSystem(0);
23+
_image = new PixImage<float>(Col.Format.RGBA, new V2i(Size, Size));
24+
_image.Volume.SetByIndex((_) => rnd.UniformFloat());
25+
}
26+
27+
[Benchmark(Description = "Aardvark (Tensors)", Baseline = true)]
28+
public PixImage<float> AardvarkTensors()
29+
{
30+
var volume = Aardvark.Base.TensorExtensions.Scaled(_image.Volume, _scaleFactor, Interpolation);
31+
return new PixImage<float>(_image.Format, volume);
32+
}
33+
34+
[Benchmark]
35+
public PixImage<float> OpenCV()
36+
=> TensorExtensions.ScaledOpenCV(_image, _scaleFactor, Interpolation);
37+
}
38+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using Aardvark.Base;
2+
using Aardvark.OpenCV;
3+
using NUnit.Framework;
4+
5+
namespace Aardvark.OpenCV.Tests
6+
{
7+
[TestFixture]
8+
internal class TensorExtensionsTests
9+
{
10+
[OneTimeSetUp]
11+
public void Init()
12+
{
13+
Aardvark.Base.Aardvark.Init();
14+
}
15+
16+
[Test]
17+
public void Scaled()
18+
{
19+
var pi = PixImage.Load(@"D:\Users\Martin\Pictures\bg\2kYW3Tz.jpg").AsPixImage<byte>();
20+
pi = pi.ScaledOpenCV(V2d.Half, ImageInterpolation.Linear);
21+
pi.Save(@"D:\Users\Martin\Desktop\bla.png");
22+
}
23+
}
24+
}
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
group Test
22

3+
Aardvark.PixImage.ImageSharp
4+
35
NUnit
46
NUnit3TestAdapter
5-
Microsoft.NET.Test.Sdk
7+
Microsoft.NET.Test.Sdk
8+
9+
BenchmarkDotNet

src/Aardvark.OpenCV/Aardvark.OpenCV.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<Project Sdk="Microsoft.NET.Sdk">
33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5+
<LangVersion>9.0</LangVersion>
56
<GenerateDocumentationFile>true</GenerateDocumentationFile>
67
<NoWarn>1701;1702;1705;1591</NoWarn>
78
</PropertyGroup>
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Aardvark.Base;
4+
using OpenCvSharp;
5+
using CvMat = OpenCvSharp.Mat;
6+
7+
namespace Aardvark.OpenCV
8+
{
9+
public static class TensorExtensions
10+
{
11+
[OnAardvarkInit]
12+
public static void Init()
13+
{
14+
}
15+
16+
private static readonly Dictionary<Type, Func<int, MatType>> matTypes = new()
17+
{
18+
{ typeof(byte), MatType.CV_8UC },
19+
{ typeof(sbyte), MatType.CV_8SC },
20+
{ typeof(short), MatType.CV_16UC },
21+
{ typeof(ushort), MatType.CV_16SC },
22+
{ typeof(int), MatType.CV_32SC },
23+
{ typeof(float), MatType.CV_32FC },
24+
{ typeof(double), MatType.CV_64FC },
25+
};
26+
27+
private static MatType ToMatType(this Type type, int channels)
28+
{
29+
if (matTypes.TryGetValue(type, out var toMatType)) return toMatType(channels);
30+
else throw new NotSupportedException();
31+
}
32+
33+
private static readonly Dictionary<ImageInterpolation, InterpolationFlags> interpolationFlags = new()
34+
{
35+
{ ImageInterpolation.Near, InterpolationFlags.Nearest },
36+
{ ImageInterpolation.Linear, InterpolationFlags.Linear },
37+
{ ImageInterpolation.Cubic, InterpolationFlags.Cubic },
38+
{ ImageInterpolation.Lanczos, InterpolationFlags.Lanczos4 },
39+
};
40+
41+
private static InterpolationFlags ToInterpolationFlags(this ImageInterpolation interpolation)
42+
{
43+
if (interpolationFlags.TryGetValue(interpolation, out InterpolationFlags flags)) return flags;
44+
else throw new NotSupportedException($"Interpolation {interpolation} is not supported.");
45+
}
46+
47+
public static Volume<T> ScaledOpenCV<T>(this Volume<T> src, V2d scaleFactor, ImageInterpolation interpolation)
48+
{
49+
if (!src.HasImageLayout())
50+
{
51+
throw new ArgumentException($"Volume must be in image layout (Origin = {src.Origin}, First = {src.First}, Delta = {src.Delta}).");
52+
}
53+
54+
var dstSize = new V3l((V2l)(V2d.Half + scaleFactor * (V2d)src.Size.XY), src.Size.Z);
55+
var dst = dstSize.CreateImageVolume<T>();
56+
57+
var matType = typeof(T).ToMatType((int)src.SZ);
58+
59+
var mSrc = CvMat.FromPixelData((int)src.SY, (int)src.SX, matType, src.Array);
60+
var mDst = CvMat.FromPixelData((int)dst.SY, (int)dst.SX, matType, dst.Array);
61+
Cv2.Resize(mSrc, mDst, new Size((int)dst.SX, (int)dst.SY), interpolation: interpolation.ToInterpolationFlags());
62+
63+
return dst;
64+
}
65+
66+
public static PixImage<T> ScaledOpenCV<T>(this PixImage<T> src, V2d scaleFactor, ImageInterpolation interpolation)
67+
=> new (src.Format, src.Volume.ScaledOpenCV(scaleFactor, interpolation));
68+
}
69+
}

0 commit comments

Comments
 (0)