This is an old revision of the document!


7. Working with matrices and images using higher-order functions

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.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.

unionp :: Image -> Image -> Image
unionp = 

$ 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, unionp mask, rotate90r]

7.3.1. Write a function that computes the scalar product with an integer:

$ \displaystyle 2 * \left(\begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{array}\right) = \left(\begin{array}{ccc} 2 & 4 & 6 \\ 8 & 10 & 12 \\ 14 & 16 & 18 \\ \end{array}\right)$

vprod :: Integer -> Matrix -> Matrix
vprod v = 

7.3.2. Write a function which adjoins two matrices by extending rows:

$ \displaystyle \left(\begin{array}{cc} 1 & 2 \\ 3 & 4\\\end{array}\right) hjoin \left(\begin{array}{cc} 5 & 6 \\ 7 & 8\\\end{array}\right) = \left(\begin{array}{cc} 1 & 2 & 5 & 6 \\ 3 & 4 & 7 & 8\\\end{array}\right) $

hjoin :: Matrix -> Matrix -> Matrix
hjoin = 

7.3.3. Write a function which adjoins two matrices by adding new rows:

$ \displaystyle \left(\begin{array}{cc} 1 & 2 \\ 3 & 4\\\end{array}\right) vjoin \left(\begin{array}{cc} 5 & 6 \\ 7 & 8\\\end{array}\right) = \left(\begin{array}{cc} 1 & 2 \\ 3 & 4 \\ 5 & 6\\ 7 & 8\\ \end{array}\right) $

vjoin :: Matrix -> Matrix -> Matrix
vjoin = 

7.3.4. Write a function which adds two matrices.

msum :: Matrix -> Matrix -> Matrix
msum = 
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="                       *****************"