Skip to content

Commit

Permalink
Merge pull request #685 from jwbruce93/Issue_675
Browse files Browse the repository at this point in the history
Issue #675 - GetMinMax
  • Loading branch information
gofal committed Sep 12, 2018
2 parents 3cb7c6f + 39afa91 commit 335f3ce
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 50 deletions.
1 change: 1 addition & 0 deletions Contributors.md
Expand Up @@ -32,4 +32,5 @@
* [Niall O'Donnell] (https://github.com/nodonnell)
* [Bob Woods](https://github.com/BobSter3000)
* [Joost van Griethuysen](https://github.com/JoostJM)
* [Jamie Bruce](https://github.com/jwbruce93)
* [Cregganbane](https://github.com/Cregganbane)
13 changes: 13 additions & 0 deletions DICOM/DicomRange.cs
Expand Up @@ -22,5 +22,18 @@ public bool Contains(T value)
{
return Minimum.CompareTo(value) <= 0 && Maximum.CompareTo(value) >= 0;
}

public void Join(T value)
{
if (Minimum.CompareTo(value) > 0)
{
Minimum = value;
}
if (Maximum.CompareTo(value) < 0)
{
Maximum = value;
}
}

}
}
150 changes: 100 additions & 50 deletions DICOM/Imaging/Render/PixelData.cs
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections;
using System.Linq;

#if !NET35
using System.Threading.Tasks;
Expand Down Expand Up @@ -38,11 +39,18 @@ public interface IPixelData

/// <summary>
/// Return the minimum and maximum pixel values from pixel data.
/// The padding value is taken into account.
/// </summary>
/// <param name="padding">Padding value to ignore in min-max determination.</param>
/// <returns>Range of calculated minimum and maximum values.</returns>
DicomRange<double> GetMinMax(int padding);

/// <summary>
/// Return the minimum and maximum pixel values from pixel data.
/// </summary>
/// <returns>Range of calculated minimum and maximum values.</returns>
DicomRange<double> GetMinMax();

/// <summary>
/// Gets the value of the pixel at the specified coordinates.
/// </summary>
Expand Down Expand Up @@ -262,20 +270,27 @@ protected internal GrayscalePixelDataU8(int width, int height, byte[] data)
/// <inheritdoc />
public DicomRange<double> GetMinMax(int padding)
{
var min = double.MaxValue;
var max = double.MinValue;
if (Data == null || Data.Length == 0)
{
return default(DicomRange<double>);
}

var data = Data;
var length = data.Length;
for (var i = 0; i < length; i++)
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Where(v => v != padding).Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
public DicomRange<double> GetMinMax()
{
if (Data == null || Data.Length == 0)
{
var value = data[i];
if (value == padding) continue;
if (value > max) max = value;
else if (value < min) min = value;
return default(DicomRange<double>);
}

return new DicomRange<double>(min, max);
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
Expand Down Expand Up @@ -516,20 +531,27 @@ private GrayscalePixelDataS16(int width, int height, short[] data)
/// <inheritdoc />
public DicomRange<double> GetMinMax(int padding)
{
var min = double.MaxValue;
var max = double.MinValue;
if (Data == null || Data.Length == 0)
{
return default(DicomRange<double>);
}

var data = Data;
var length = data.Length;
for (var i = 0; i < length; i++)
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Where(v => v != padding).Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
public DicomRange<double> GetMinMax()
{
if (Data == null || Data.Length == 0)
{
var value = data[i];
if (value == padding) continue;
if (value > max) max = value;
else if (value < min) min = value;
return default(DicomRange<double>);
}

return new DicomRange<double>(min, max);
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
Expand Down Expand Up @@ -703,20 +725,27 @@ private GrayscalePixelDataU16(int width, int height, ushort[] data)
/// <inheritdoc />
public DicomRange<double> GetMinMax(int padding)
{
var min = double.MaxValue;
var max = double.MinValue;
if (Data == null || Data.Length == 0)
{
return default(DicomRange<double>);
}

var data = Data;
var length = data.Length;
for (var i = 0; i < length; i++)
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Where(v => v != padding).Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
public DicomRange<double> GetMinMax()
{
if (Data == null || Data.Length == 0)
{
var value = data[i];
if (value == padding) continue;
if (value > max) max = value;
else if (value < min) min = value;
return default(DicomRange<double>);
}

return new DicomRange<double>(min, max);
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
Expand Down Expand Up @@ -883,20 +912,27 @@ private GrayscalePixelDataS32(int width, int height, int[] data)
/// <inheritdoc />
public DicomRange<double> GetMinMax(int padding)
{
var min = double.MaxValue;
var max = double.MinValue;
if (Data == null || Data.Length == 0)
{
return default(DicomRange<double>);
}

var data = Data;
var length = data.Length;
for (var i = 0; i < length; i++)
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Where(v => v != padding).Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
public DicomRange<double> GetMinMax()
{
if (Data == null || Data.Length == 0)
{
var value = data[i];
if (value == padding) continue;
if (value > max) max = value;
else if (value < min) min = value;
return default(DicomRange<double>);
}

return new DicomRange<double>(min, max);
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
Expand Down Expand Up @@ -1059,20 +1095,27 @@ private GrayscalePixelDataU32(int width, int height, uint[] data)
/// <inheritdoc />
public DicomRange<double> GetMinMax(int padding)
{
var min = double.MaxValue;
var max = double.MinValue;
if (Data == null || Data.Length == 0)
{
return default(DicomRange<double>);
}

var data = Data;
var length = data.Length;
for (var i = 0; i < length; i++)
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Where(v => v != padding).Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
public DicomRange<double> GetMinMax()
{
if (Data == null || Data.Length == 0)
{
var value = data[i];
if (value == padding) continue;
if (value > max) max = value;
else if (value < min) min = value;
return default(DicomRange<double>);
}

return new DicomRange<double>(min, max);
var range = new DicomRange<double>(double.MaxValue, double.MinValue);
Data.Each(v => range.Join(v));
return range;
}

/// <inheritdoc />
Expand Down Expand Up @@ -1207,6 +1250,13 @@ public DicomRange<double> GetMinMax(int padding)
"Calculation of min/max pixel values is not supported for 24-bit color pixel data.");
}

/// <inheritdoc />
public DicomRange<double> GetMinMax()
{
throw new InvalidOperationException(
"Calculation of min/max pixel values is not supported for 24-bit color pixel data.");
}

/// <inheritdoc />
public double GetPixel(int x, int y)
{
Expand Down
14 changes: 14 additions & 0 deletions DICOM/StringExtensions.cs
Expand Up @@ -2,6 +2,7 @@
// Licensed under the Microsoft Public License (MS-PL).

using System;
using System.Collections.Generic;

namespace Dicom
{
Expand Down Expand Up @@ -112,4 +113,17 @@ public static bool Wildcard(this string s, string pattern, bool caseSensitive)
return j >= pattern.Length;
}
}

public static class EnumerableExtensions
{

public static void Each<T>(this IEnumerable<T> source, Action<T> action)
{
foreach(T item in source)
{
action(item);
}
}

}
}

0 comments on commit 335f3ce

Please sign in to comment.