Skip to content

Commit 5fb6dfe

Browse files
committed
Implemented FindZeroSegments with tests
1 parent fe67b03 commit 5fb6dfe

3 files changed

Lines changed: 180 additions & 1 deletion

File tree

Src/ScreenGrid.Models.Tests/FlatImageTests.cs

Lines changed: 110 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
namespace ScreenGrid.Models.Tests
22
{
3-
using NUnit.Framework;
3+
using System;
4+
using System.Collections.Generic;
45
using System.Drawing;
56

7+
using NUnit.Framework;
8+
69
[TestFixture]
710
public class FlatImageTests
811
{
@@ -24,6 +27,112 @@ public void GetHorizontalStripeTest()
2427
Assert.AreEqual(width, stripeMiddle.Length);
2528
}
2629

30+
[Test]
31+
public void GetDerivativeTest()
32+
{
33+
var flatImage = LoadFlatImageFromResource("ScreenGrid.Models.Tests.Resources.ImageSimple.png");
34+
var stripeMiddle = flatImage.GetHorizontalStripe(flatImage.Height / 2);
35+
36+
var dMiddle = FlatImage.GetDerivative(stripeMiddle);
37+
Assert.AreEqual(stripeMiddle.Length, dMiddle.Length);
38+
39+
// Border detection
40+
Assert.AreEqual(0, dMiddle[11]);
41+
Assert.Greater(dMiddle[12], 0);
42+
}
43+
44+
45+
[Test]
46+
public void FindBordersTest()
47+
{
48+
var flatImage = LoadFlatImageFromResource("ScreenGrid.Models.Tests.Resources.ImageSimple.png");
49+
50+
const int minimalSegmentLength = 8;
51+
var step = flatImage.Height / 8;
52+
53+
var list = new List<Tuple<int, int>>();
54+
for (var iy = minimalSegmentLength + step; iy < flatImage.Height - (minimalSegmentLength + step); iy += step)
55+
{
56+
var stripe = flatImage.GetHorizontalStripe(iy);
57+
var derivative = FlatImage.GetDerivative(stripe);
58+
var segments = FlatImage.FindZeroSegments(derivative, minimalSegmentLength);
59+
60+
Assert.AreEqual(2, segments.Count, String.Format("iy={0}", iy));
61+
}
62+
}
63+
64+
[Test]
65+
public void FindZeroSegmentsTest1()
66+
{
67+
var array = new UInt32[] { 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 3, 4, 0, 3, 5 };
68+
var result = FlatImage.FindZeroSegments(array, 4);
69+
Assert.AreEqual(1, result.Count);
70+
Assert.AreEqual(1, result[0].Item1);
71+
Assert.AreEqual(5, result[0].Item2);
72+
}
73+
74+
[Test]
75+
public void FindZeroSegmentsTestThreeSegments()
76+
{
77+
var array = new UInt32[] { 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 3, 4, 0, 0, 3, 0, 5 };
78+
var result = FlatImage.FindZeroSegments(array, 2);
79+
Assert.AreEqual(3, result.Count);
80+
Assert.AreEqual(1, result[0].Item1);
81+
Assert.AreEqual(5, result[0].Item2);
82+
Assert.AreEqual(9, result[1].Item1);
83+
Assert.AreEqual(10, result[1].Item2);
84+
Assert.AreEqual(13, result[2].Item1);
85+
Assert.AreEqual(14, result[2].Item2);
86+
}
87+
88+
[Test]
89+
public void FindZeroSegmentsTestNoSegments()
90+
{
91+
var array = new UInt32[] { 1, 0, 0, 1, 2, 3 };
92+
var result = FlatImage.FindZeroSegments(array, 3);
93+
Assert.AreEqual(0, result.Count);
94+
}
95+
96+
[Test]
97+
public void FindZeroSegmentsTestShortAllZeroSegment()
98+
{
99+
var array = new UInt32[] { 0, 0, 0, 0, };
100+
var result = FlatImage.FindZeroSegments(array, 4);
101+
Assert.AreEqual(1, result.Count);
102+
Assert.AreEqual(0, result[0].Item1);
103+
Assert.AreEqual(3, result[0].Item2);
104+
}
105+
106+
[Test]
107+
public void FindZeroSegmentsTestAllZeroSegment()
108+
{
109+
var array = new UInt32[] { 0, 0, 0, 0, 0, 0 };
110+
var result = FlatImage.FindZeroSegments(array, 3);
111+
Assert.AreEqual(1, result.Count);
112+
Assert.AreEqual(0, result[0].Item1);
113+
Assert.AreEqual(5, result[0].Item2);
114+
}
115+
116+
[Test]
117+
public void FindZeroSegmentsTestSimpleSegment1()
118+
{
119+
var array = new UInt32[] { 1, 0, 0, 0, 0, 0 };
120+
var result = FlatImage.FindZeroSegments(array, 3);
121+
Assert.AreEqual(1, result.Count);
122+
Assert.AreEqual(1, result[0].Item1);
123+
Assert.AreEqual(5, result[0].Item2);
124+
}
125+
126+
[Test]
127+
public void FindZeroSegmentsTestSimpleSegment2()
128+
{
129+
var array = new UInt32[] { 0, 0, 0, 0, 0, 1 };
130+
var result = FlatImage.FindZeroSegments(array, 3);
131+
Assert.AreEqual(1, result.Count);
132+
Assert.AreEqual(0, result[0].Item1);
133+
Assert.AreEqual(4, result[0].Item2);
134+
}
135+
27136
private static FlatImage LoadFlatImageFromResource(string resourceName)
28137
{
29138
FlatImage flatImage;
1.29 KB
Loading

Src/ScreenGrid.Models/FlatImage.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace ScreenGrid.Models
22
{
33
using System;
4+
using System.Collections.Generic;
45

56
/// <summary>
67
/// 'Flattened' image representation for fast processing
@@ -54,6 +55,75 @@ public UInt32[] GetHorizontalStripe(int iy)
5455
return result;
5556
}
5657

58+
public static UInt32[] GetDerivative(UInt32[] stripe)
59+
{
60+
var result = new UInt32[stripe.Length];
61+
62+
result[0] = stripe[0];
63+
for (var i = 1; i < stripe.Length; i++)
64+
{
65+
result[i] = stripe[i] - stripe[i - 1];
66+
}
67+
68+
return result;
69+
}
70+
71+
/// <summary>
72+
/// Search for all-zero segments of array with given minimal length
73+
/// </summary>
74+
/// <param name="array">Input array</param>
75+
/// <param name="minimalSegmentLength">Minimal length of segment</param>
76+
/// <returns>List of segments (startIndex, endIndex) which contains only zeros</returns>
77+
public static IList<Tuple<int, int>> FindZeroSegments(UInt32[] array, int minimalSegmentLength)
78+
{
79+
var result = new List<Tuple<int, int>>();
80+
81+
if (array.Length < minimalSegmentLength)
82+
{
83+
return result;
84+
}
85+
86+
int lastZero = -1;
87+
for (var i = 0; i < array.Length; i++)
88+
{
89+
if (array[i] == 0)
90+
{
91+
if (lastZero == -1)
92+
{
93+
lastZero = i;
94+
}
95+
96+
if (i == (array.Length - 1))
97+
{
98+
var segment = new Tuple<int, int>(lastZero, i);
99+
if (CheckSegmentLength(segment, minimalSegmentLength))
100+
{
101+
result.Add(segment);
102+
}
103+
}
104+
}
105+
else
106+
{
107+
if (lastZero != -1)
108+
{
109+
var segment = new Tuple<int, int>(lastZero, i - 1);
110+
lastZero = -1;
111+
if (CheckSegmentLength(segment, minimalSegmentLength))
112+
{
113+
result.Add(segment);
114+
}
115+
}
116+
}
117+
}
118+
119+
return result;
120+
}
121+
122+
private static bool CheckSegmentLength(Tuple<int, int> segment, int minimalSegmentLength)
123+
{
124+
return ((segment.Item2 - segment.Item1 + 1) >= minimalSegmentLength);
125+
}
126+
57127
public bool CompareWithFragment(FlatImage fragment, int startX, int startY)
58128
{
59129
for (var x = 0; x < fragment.Width; x++)

0 commit comments

Comments
 (0)