chain-codes- Library decoding chain codes from images

Safe HaskellNone



Decoding of chain codes embedded in images.



type Colour = PixelRGB8Source

Friendly alias for PixelRGB8

type PixelPos = (Int, Int, Int)Source

Position of a pixel along with the clock direction used by chainCode.

type Position = (Int, Int)Source

Simple alias for Int pair

type ChainCode = [PixelPos]Source

In a chain code, we'll keep the original pixel positions as well as the direction which we can use for signal processing.

readRGB8 :: FilePath -> IO (Either String (Image PixelRGB8))Source

Reads in an Image that uses PixelRGB8 as its base. Rejects any other format.

findSpot :: Image PixelRGB8 -> Colour -> Maybe PositionSource

Given an Image parametrised by PixelRGB8 and given a background Colour, we try to find the first pixel that doesn't match the Colour.

We start checking at the top left corner of the image, checking each row fully before progressing a column: we check (height, width) then (height, width + 1) and so on where top left corner of the image is (0, 0) and positive height is towards the bottom. Uses colour average for comparison with a small leeway of 1.

intensity :: PixelRGB8 -> DoubleSource

Averages each colour value and sees how close it is too fully-white.

average :: PixelRGB8 -> IntegerSource

Takes the average of RGB values

chainCode :: Image PixelRGB8 -> Colour -> Maybe ChainCodeSource

Specialised version of chainCodeWith which uses a comparison function which simply asserts that the shape colour is not the same as the background.

chainCodeWith :: Image PixelRGB8 -> Colour -> (Colour -> Bool) -> Maybe ChainCodeSource

Given an Image parametrised by PixelRGB8 and given a Colour and a comparison function, we try to find the chain code in the binary image which has the passed in colour. The comparison function's purpose is to tell whether something is part of the shape.

Note that only a single shape is accepted inside of the image. The starting positing is determined using findSpot.

The output list contains unique positions only: the beginning and end position are not treated the same. If findSpot fails, we return Nothing.