diff --git a/tests/InferenceTestImage.hpp b/tests/InferenceTestImage.hpp
new file mode 100644
index 0000000..45dd8bf
--- /dev/null
+++ b/tests/InferenceTestImage.hpp
@@ -0,0 +1,121 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// See LICENSE file in the project root for full license information.
+//
+#pragma once
+
+#include <armnn/Exceptions.hpp>
+
+#include <array>
+#include <cstdint>
+#include <vector>
+#include <utility>
+
+class InferenceTestImageException : public armnn::Exception
+{
+public:
+    using Exception::Exception;
+};
+
+class InferenceTestImageLoadFailed : public InferenceTestImageException
+{
+public:
+    using InferenceTestImageException::InferenceTestImageException;
+};
+
+class InferenceTestImageOutOfBoundsAccess : public InferenceTestImageException
+{
+public:
+    using InferenceTestImageException::InferenceTestImageException;
+};
+
+class InferenceTestImageResizeFailed : public InferenceTestImageException
+{
+public:
+    using InferenceTestImageException::InferenceTestImageException;
+};
+
+class InferenceTestImageWriteFailed : public InferenceTestImageException
+{
+public:
+    using InferenceTestImageException::InferenceTestImageException;
+};
+
+class UnknownImageChannelLayout : public InferenceTestImageException
+{
+public:
+    using InferenceTestImageException::InferenceTestImageException;
+};
+
+class InferenceTestImage
+{
+public:
+    enum class WriteFormat
+    {
+        Png,
+        Bmp,
+        Tga
+    };
+
+    explicit InferenceTestImage(const char* filePath);
+
+    InferenceTestImage(InferenceTestImage&&) = delete;
+    InferenceTestImage(const InferenceTestImage&) = delete;
+    InferenceTestImage& operator=(const InferenceTestImage&) = delete;
+    InferenceTestImage& operator=(InferenceTestImage&&) = delete;
+
+    unsigned int GetWidth() const { return m_Width; }
+    unsigned int GetHeight() const { return m_Height; }
+    unsigned int GetNumChannels() const { return m_NumChannels; }
+    unsigned int GetNumElements() const { return GetWidth() * GetHeight() * GetNumChannels(); }
+    unsigned int GetSizeInBytes() const { return GetNumElements() * GetSingleElementSizeInBytes(); }
+
+    // Returns the pixel identified by the given coordinates as a 3-channel value.
+    // Channels beyond the third are dropped. If the image provides less than 3 channels, the non-existent
+    // channels of the pixel will be filled with 0. Channels are returned in RGB order (that is, the first element
+    // of the tuple corresponds to the Red channel, whereas the last element is the Blue channel).
+    std::tuple<uint8_t, uint8_t, uint8_t> GetPixelAs3Channels(unsigned int x, unsigned int y) const;
+
+    void Resize(unsigned int newWidth, unsigned int newHeight);
+    void Write(WriteFormat format, const char* filePath) const;
+
+private:
+    static unsigned int GetSingleElementSizeInBytes()
+    {
+        return sizeof(decltype(std::declval<InferenceTestImage>().m_Data[0]));
+    }
+
+    std::vector<uint8_t> m_Data;
+    unsigned int m_Width;
+    unsigned int m_Height;
+    unsigned int m_NumChannels;
+};
+
+// Common names used to identify a channel in a pixel
+enum class ImageChannel
+{
+    R,
+    G,
+    B
+};
+
+// Channel layouts handled by the test framework
+enum class ImageChannelLayout
+{
+    Rgb,
+    Bgr
+};
+
+// Reads the contents of an inference test image as 3-channel pixels whose channel values have been normalized (scaled)
+// and now lie in the range [0,1]. Channel data is stored according to the ArmNN layout (CHW). The order in which
+// channels appear in the resulting vector is defined by the provided layout.
+std::vector<float> GetImageDataInArmNnLayoutAsNormalizedFloats(ImageChannelLayout layout,
+    const InferenceTestImage& image);
+
+// Reads the contents of an inference test image as 3-channel pixels whose value is the result of subtracting the mean
+// from the values in the original image. Channel data is stored according to the ArmNN layout (CHW). The order in
+// which channels appear in the resulting vector is defined by the provided layout. The order of the channels of the
+// provided mean should also match the given layout.
+std::vector<float> GetImageDataInArmNnLayoutAsFloatsSubtractingMean(ImageChannelLayout layout,
+    const InferenceTestImage& image,
+    const std::array<float, 3>& mean);
