This is an old revision of the document!
7. Working with matrices and images using higher-order functions
7.1. Bitmaps as matrices
We can represent images as matrices of pixels. In our example a pixel will be represented as a Char
, which can take the values: '*' (signifying that the respective pixel is on) and ' ' (the pixel is off).
type Image = [String]
For instance, a rectangle could be represented as:
******** * * ********
more precisely, as the string:
m = "********\n* *\n********\n"
7.1.1. Implement an image-displaying function. Use the image from the Appendix as a test.
toStringImg :: Image -> String toStringImg =
Add the following function in order to view images in a nicer format:
displayImg = putStrLn . toStringImg
7.1.2. Implement a function which flips an image horizontally:
flipH :: Image -> Image flipH =
7.1.3. Implement a function which flips an image vertically:
flipV :: Image -> Image flipV =
7.1.4. Implement a function which rotates an image 90grd clockwise
rotate90r :: Image -> Image rotate90r =
7.1.5. Implement a function which rotates an image -90grd clockwise
rotate90l :: Image -> Image rotate90l =
7.1.6. Implement a function which inverts an image: ' ' becomes * and * becomes ' ':
invert :: Image -> Image invert =
7.2. Combining images
7.2.1. Implement a function maskKeep
which takes a mask and some image and only keeps the part of image which overlays the mask. Use the mask and the logo from Appendix to test it.
maskKeep :: Image -> Image -> Image maskKeep =
$ maskKeep \left(\begin{array}{ccc} & & * \\ & & * \\ & & * \\ \end{array}\right) \left(\begin{array}{ccc} * & & * \\ * & & \\ * & & * \\ \end{array}\right) = \left(\begin{array}{ccc} & & * \\ & & \\ & & * \\ \end{array}\right) $
7.2.2. Implement a function maskDiscard
which takes a mask and some image and discards the part of the mask which overlays the image.
$ maskDiscard\left(\begin{array}{ccc} & & * \\ & & * \\ & & * \\ \end{array}\right) \left(\begin{array}{ccc} * & & * \\ * & & \\ * & & * \\ \end{array}\right) = \left(\begin{array}{ccc} & & \\ & & * \\ & & \\ \end{array}\right) $
7.2.3. Implement the union
' of two images.
union' :: Image -> Image -> Image union' =
$ union \left(\begin{array}{ccc} & & * \\ & & * \\ & & * \\ \end{array}\right) \left(\begin{array}{ccc} * & & * \\ * & & \\ * & & * \\ \end{array}\right) = \left(\begin{array}{ccc} * & & * \\ * & & * \\ * & & * \\ \end{array}\right) $
7.2.4. Implement a function which takes a list of transformations and an image and applies all those transformations.
transformationSequence :: [Image -> Image] -> Image -> Image
Test it with the following sequence
seq1 = transformationSequence [invert, union' mask, rotate90r]
Appendix
logo = [l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15,l16,l17,l18,l19] where l1 =" ***** ** ***** ** " l2 =" ****** **** ****** **** " l3 =" ** * * *** ** * * *** " l4 =" * * * *** * * * *** " l5 =" * * ** * * ** " l6 =" ** ** ** ** ** ** " l7 =" ** ** ** ** ** ** " l8 =" **** ** * **** ** * " l9 =" * *** ** * * *** ** * " l10=" ** ******* ** ******* " l11=" ** ****** ** ****** " l12=" ** ** ** ** " l13=" ** ** ** ** " l14=" ** ** ** ** " l15=" ** ** ** ** ** ** " l16="*** * * *** * * " l17=" *** * *** * " l18=" ****** ****** " l19=" *** *** "
mask = [l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15,l16,l17,l18,l19] where l1 =" *****************" l2 =" *****************" l3 =" *****************" l4 =" *****************" l5 =" *****************" l6 =" *****************" l7 =" *****************" l8 =" *****************" l9 =" *****************" l10=" *****************" l11=" *****************" l12=" *****************" l13=" *****************" l14=" *****************" l15=" *****************" l16=" *****************" l17=" *****************" l18=" *****************" l19=" *****************"