Browse Source

Add color blindness filters

Former-commit-id: 584e0dbc90cb5fbdc8d7d103dfc4c1d6716a726d
Former-commit-id: 15bb157c19f09ee87889512a686b2b92deca44e7
Former-commit-id: ac3d596ab00ba5f1184edda33db8ec616f6797f9
pull/1/head
James Jackson-South 10 years ago
parent
commit
eb06f8d6b4
  1. 32
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Achromatomaly.cs
  2. 32
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Achromatopsia.cs
  3. 53
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/ColorBlindness.cs
  4. 29
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Deuteranomaly.cs
  5. 29
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Deuteranopia.cs
  6. 29
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Protanomaly.cs
  7. 29
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Protanopia.cs
  8. 4
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/README.md
  9. 29
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Tritanomaly.cs
  10. 29
      src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Tritanopia.cs
  11. 73
      src/ImageProcessorCore/Filters/ImageFilterExtensions.cs
  12. 11
      tests/ImageProcessorCore.Tests/Processors/Filters/FilterTests.cs

32
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Achromatomaly.cs

@ -0,0 +1,32 @@
// <copyright file="Achromatomaly.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Filters
{
using System.Numerics;
/// <summary>
/// Converts the colors of the image recreating Achromatomaly (Color desensitivity) color blindness.
/// </summary>
public class Achromatomaly : ColorMatrixFilter
{
/// <inheritdoc/>
public override Matrix4x4 Matrix => new Matrix4x4()
{
M11 = .618f,
M12 = .163f,
M13 = .163f,
M21 = .320f,
M22 = .775f,
M23 = .320f,
M31 = .062f,
M32 = .062f,
M33 = .516f
};
/// <inheritdoc/>
public override bool Compand => false;
}
}

32
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Achromatopsia.cs

@ -0,0 +1,32 @@
// <copyright file="Achromatopsia.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Filters
{
using System.Numerics;
/// <summary>
/// Converts the colors of the image recreating Achromatopsia (Monochrome) color blindness.
/// </summary>
public class Achromatopsia : ColorMatrixFilter
{
/// <inheritdoc/>
public override Matrix4x4 Matrix => new Matrix4x4()
{
M11 = .299f,
M12 = .299f,
M13 = .299f,
M21 = .587f,
M22 = .587f,
M23 = .587f,
M31 = .114f,
M32 = .114f,
M33 = .114f
};
/// <inheritdoc/>
public override bool Compand => false;
}
}

53
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/ColorBlindness.cs

@ -0,0 +1,53 @@
// <copyright file="ColorBlindness.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Filters
{
/// <summary>
/// Enumerates the various types of color blindness.
/// </summary>
public enum ColorBlindness
{
/// <summary>
/// Partial color desensitivity.
/// </summary>
Achromatomaly,
/// <summary>
/// Complete color desensitivity (Monochrome)
/// </summary>
Achromatopsia,
/// <summary>
/// Green weak
/// </summary>
Deuteranomaly,
/// <summary>
/// Green blind
/// </summary>
Deuteranopia,
/// <summary>
/// Red weak
/// </summary>
Protanomaly,
/// <summary>
/// Red blind
/// </summary>
Protanopia,
/// <summary>
/// Blue weak
/// </summary>
Tritanomaly,
/// <summary>
/// Blue blind
/// </summary>
Tritanopia
}
}

29
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Deuteranomaly.cs

@ -0,0 +1,29 @@
// <copyright file="Deuteranomaly.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Filters
{
using System.Numerics;
/// <summary>
/// Converts the colors of the image recreating Deuteranomaly (Green-Weak) color blindness.
/// </summary>
public class Deuteranomaly : ColorMatrixFilter
{
/// <inheritdoc/>
public override Matrix4x4 Matrix => new Matrix4x4()
{
M11 = 0.8f,
M12 = 0.258f,
M21 = 0.2f,
M22 = 0.742f,
M23 = 0.142f,
M33 = 0.858f
};
/// <inheritdoc/>
public override bool Compand => false;
}
}

29
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Deuteranopia.cs

@ -0,0 +1,29 @@
// <copyright file="Deuteranopia.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Filters
{
using System.Numerics;
/// <summary>
/// Converts the colors of the image recreating Deuteranopia (Green-Blind) color blindness.
/// </summary>
public class Deuteranopia : ColorMatrixFilter
{
/// <inheritdoc/>
public override Matrix4x4 Matrix => new Matrix4x4()
{
M11 = 0.625f,
M12 = 0.7f,
M21 = 0.375f,
M22 = 0.3f,
M23 = 0.3f,
M33 = 0.7f
};
/// <inheritdoc/>
public override bool Compand => false;
}
}

29
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Protanomaly.cs

@ -0,0 +1,29 @@
// <copyright file="Protanomaly.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Filters
{
using System.Numerics;
/// <summary>
/// Converts the colors of the image recreating Protanopia (Red-Weak) color blindness.
/// </summary>
public class Protanomaly : ColorMatrixFilter
{
/// <inheritdoc/>
public override Matrix4x4 Matrix => new Matrix4x4()
{
M11 = 0.817f,
M12 = 0.333f,
M21 = 0.183f,
M22 = 0.667f,
M23 = 0.125f,
M33 = 0.875f
};
/// <inheritdoc/>
public override bool Compand => false;
}
}

29
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Protanopia.cs

@ -0,0 +1,29 @@
// <copyright file="Protanopia.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Filters
{
using System.Numerics;
/// <summary>
/// Converts the colors of the image recreating Protanopia (Red-Blind) color blindness.
/// </summary>
public class Protanopia : ColorMatrixFilter
{
/// <inheritdoc/>
public override Matrix4x4 Matrix => new Matrix4x4()
{
M11 = 0.567f,
M12 = 0.558f,
M21 = 0.433f,
M22 = 0.442f,
M23 = 0.242f,
M33 = 0.758f
};
/// <inheritdoc/>
public override bool Compand => false;
}
}

4
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/README.md

@ -0,0 +1,4 @@
Color blindness matrices adapted from and tested against:
http://web.archive.org/web/20090413045433/http://nofunc.org/Color_Matrix_Library
http://www.color-blindness.com/coblis-color-blindness-simulator/

29
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Tritanomaly.cs

@ -0,0 +1,29 @@
// <copyright file="Tritanomaly.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Filters
{
using System.Numerics;
/// <summary>
/// Converts the colors of the image recreating Tritanomaly (Blue-Weak) color blindness.
/// </summary>
public class Tritanomaly : ColorMatrixFilter
{
/// <inheritdoc/>
public override Matrix4x4 Matrix => new Matrix4x4()
{
M11 = 0.967f,
M21 = 0.33f,
M22 = 0.733f,
M23 = 0.183f,
M32 = 0.267f,
M33 = 0.817f
};
/// <inheritdoc/>
public override bool Compand => false;
}
}

29
src/ImageProcessorCore/Filters/ColorMatrix/ColorBlindness/Tritanopia.cs

@ -0,0 +1,29 @@
// <copyright file="Tritanopia.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageProcessorCore.Filters
{
using System.Numerics;
/// <summary>
/// Converts the colors of the image recreating Tritanopia (Blue-Blind) color blindness.
/// </summary>
public class Tritanopia : ColorMatrixFilter
{
/// <inheritdoc/>
public override Matrix4x4 Matrix => new Matrix4x4()
{
M11 = 0.95f,
M21 = 0.05f,
M22 = 0.433f,
M23 = 0.475f,
M32 = 0.567f,
M33 = 0.525f
};
/// <inheritdoc/>
public override bool Compand => false;
}
}

73
src/ImageProcessorCore/Filters/ImageFilterExtensions.cs

@ -217,6 +217,79 @@ namespace ImageProcessorCore.Filters
}
}
/// <summary>
/// Applies the given colorblindness simulator to the image.
/// </summary>
/// <param name="source">The image this method extends.</param>
/// <param name="colorBlindness">The type of color blindness simulator to apply.</param>
/// <param name="progressHandler">A delegate which is called as progress is made processing the image.</param>
/// <returns>The <see cref="Image"/>.</returns>
public static Image ColorBlindness(this Image source, ColorBlindness colorBlindness, ProgressEventHandler progressHandler = null)
{
return ColorBlindness(source, colorBlindness, source.Bounds, progressHandler);
}
/// <summary>
/// Applies the given colorblindness simulator to the image.
/// </summary>
/// <param name="source">The image this method extends.</param>
/// <param name="colorBlindness">The type of color blindness simulator to apply.</param>
/// <param name="rectangle">
/// The <see cref="Rectangle"/> structure that specifies the portion of the image object to alter.
/// </param>
/// <param name="progressHandler">A delegate which is called as progress is made processing the image.</param>
/// <returns>The <see cref="Image"/>.</returns>
public static Image ColorBlindness(this Image source, ColorBlindness colorBlindness, Rectangle rectangle, ProgressEventHandler progressHandler = null)
{
IImageProcessor processor;
switch (colorBlindness)
{
case Filters.ColorBlindness.Achromatomaly:
processor = new Achromatomaly();
break;
case Filters.ColorBlindness.Achromatopsia:
processor = new Achromatopsia();
break;
case Filters.ColorBlindness.Deuteranomaly:
processor = new Deuteranomaly();
break;
case Filters.ColorBlindness.Deuteranopia:
processor = new Deuteranopia();
break;
case Filters.ColorBlindness.Protanomaly:
processor = new Protanomaly();
break;
case Filters.ColorBlindness.Protanopia:
processor = new Protanopia();
break;
case Filters.ColorBlindness.Tritanomaly:
processor = new Tritanomaly();
break;
default:
processor = new Tritanopia();
break;
}
processor.OnProgress += progressHandler;
try
{
return source.Process(rectangle, processor);
}
finally
{
processor.OnProgress -= progressHandler;
}
}
/// <summary>
/// Alters the contrast component of the image.
/// </summary>

11
tests/ImageProcessorCore.Tests/Processors/Filters/FilterTests.cs

@ -44,7 +44,16 @@ namespace ImageProcessorCore.Tests
{ "Hue-180", new Hue(180) },
{ "Hue--180", new Hue(-180) },
{ "BoxBlur", new BoxBlur(10) },
{ "Vignette", new Vignette()}
{ "Vignette", new Vignette() },
{ "Protanopia", new Protanopia() },
{ "Protanomaly", new Protanomaly() },
{ "Deuteranopia", new Deuteranopia() },
{ "Deuteranomaly", new Deuteranomaly() },
{ "Tritanopia", new Tritanopia() },
{ "Tritanomaly", new Tritanomaly() },
{ "Achromatopsia", new Achromatopsia() },
{ "Achromatomaly", new Achromatomaly() }
};
[Theory]

Loading…
Cancel
Save