D      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+ , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C   Safe-Inferred2346=K  !"#$%&DE  !"#$%&DE !"#$%&DENone &2346=KM,'Approach to be used near the border during transformations, which, besides a pixel of interest, also use it's neighbors, consequently going out of bounds at the edges of an image.(BAlso mirror like reflection, but without repeating the edge pixel. ' outside | Image | outside ( : 1 4 3 2 | 1 2 3 4 | 3 2 1 4 )Mirror like reflection. ' outside | Image | outside ) : 4 3 2 1 | 1 2 3 4 | 4 3 2 1 * Replicate the pixel at the edge. ' outside | Image | outside *# : 1 1 1 1 | 1 2 3 4 | 4 4 4 4 +2Wrap around from the opposite border of the image. ' outside | Image | outside +# : 1 2 3 4 | 1 2 3 4 | 1 2 3 4 ,Fill in a constant pixel. ( outside | Image | outside (," 0) : 0 0 0 0 | 1 2 3 4 | 0 0 0 0 .9Exchange the underlying array representation of an image.@Get a pixel at i-th and j -th location.dlet grad_gray = computeS $ makeImage (200, 200) (\(i, j) -> PixelY $ fromIntegral (i*j)) / (200*200)8index grad_gray (20, 30) == PixelY ((20*30) / (200*200))TrueA+Make sure that an image is fully evaluated.BIPerform matrix multiplication on two images. Inner dimensions must agree.C!Undirected reduction of an image.DPixelwise equality function of two images. Images are considered distinct if either images' dimensions or at least one pair of corresponding pixels are not the same. Used in defining an in instance for the F typeclass.HMCreate an Image by supplying it's dimensions and a pixel genrating function.ISCreate a singleton image, required for various operations on images with a scalar.JGet dimensions of an image.&frog <- readImageRGB "images/frog.jpg"frog <Image RepaDelayed RGB: 200x320> dims frog (200,320)KMap a function over a an image.L8Map an index aware function over each pixel in an image.MZip two images with a functionN+Zip two images with an index aware functionOTraverse an imagePTraverse two images.QTranspose an imageR#Backwards permutation of an image. SmConstruct an image from a nested rectangular shaped list of pixels. Length of an outer list will constitute m* rows, while the length of inner lists - nJ columns. All of the inner lists must be the same length and greater than 0.ffromLists [[PixelY (fromIntegral (i*j) / 60000) | j <- [1..300]] | i <- [1..200]] :: Image VU Y Double#<Image VectorUnboxed Luma: 200x300> images/grad_fromLists.pngTA class with a set of convenient functions that allow for changing precision of channels within pixels, while scaling the values to keep them in an appropriate range.2let rgb = PixelRGB 0.0 0.5 1.0 :: Pixel RGB Double toWord8 rgb<RGB:(0|128|255)>]&An opaque version of this color space.^-Get an alpha channel of a transparant pixel. _(Add an alpha channel of an opaque pixel. 1 addAlpha 0 (PixelHSI 1 2 3) == PixelHSIA 1 2 3 0`LConvert a transparent pixel to an opaque one by dropping the alpha channel. 0 dropAlpha (PixelRGBA 1 2 3 4) == PixelRGB 1 2 3aThis class has all included color spaces installed into it and is also intended for implementing any other possible custom color spaces. Every instance of this class automatically installs an associated c into G, H, I, J,  and KH, which in turn make it possible to be used by the rest of the library.bRepresentation of a pixel, such that it can be an element of any Array. Which is usally a tuple of channels or a channel itself for single channel color spaces.c=A concrete Pixel representation for a particular color space.dGConstrut a pixel by replicating a same value among all of the channels.emConvert a Pixel to a representation suitable for storage as an unboxed element, usually a tuple of channels.f6Convert from an elemnt representation back to a Pixel.gRetrieve Pixel's channel valueh7Map a channel aware function over all Pixel's channels.i)Map a function over all Pixel's channels.j Function application to a Pixel.kA pixel eqiuvalent of L.lBorder handling function. If (i, j) location is within bounds, then supplied lookup function will be used, otherwise it will be handled according to a supplied border strategy.mOImage indexing function that returns a default pixel if index is out of bounds.n%Image indexing function that returns M if index is out of bounds, N pixel otherwise.ODChanging to the same array representation as before is disabled and changeTo/ will behave simply as an identitity function.V'()*+,-.New representation of an image. Source image./0123456789:;<=>?@ABC An associative folding function.FInitial element, that is neutral with respect to the folding function. Source image.DEFGH(m rows, n& columns) - dimensions of a new image.A function that takes (i -th row, and jB-th column) as an argument and returns a pixel for that location.IJKnA function that takes a pixel of a source image and returns a pixel for the result image a the same location. Source image. Result image.LA function that takes an index (i, j)^, a pixel at that location and returns a new pixel at the same location for the result image. Source image. Result image.MNO Source image.XFunction that takes dimensions of a source image and returns dimensions of a new image.SFunction that receives a pixel getter (a source image index function), a location (i, j)7 in a new image and returns a pixel for that location.PFirst source image.Second source image.4Function that produces dimensions for the new image.0Function that produces pixels for the new image.QRDimensions of a result image.MFunction that maps an index of a source image to an index of a result image. Source image. Result image.STUVWXYZ[\]^_`abcdefghijklBorder handling strategy.Image dimensionsImage's indexing function.(i, j) location of a pixel lookup.mnPQRSTUVWXYZ[\OH'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnHabcdefghijk\]^_`TUVWXYZ[EFGHIJKLMNOPQRS?@ABCD89:;<=>/01234567-.mn',+*)(l',+*)(-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghijklmnPQRSTUVWXYZ[\O None +234=KuLuma with Alpha channel.x/Luma or brightness, that is usually denoted as Y'.opqrstuvwxy]^_`abcdefgcopqrstuvwxy]^ opqrstuwvxy_`abced]gf^ None +234=Kz{|}~hijklmnopqrcz{|}~hi z{|}~jklmnpohrqiNone +234=Kstuvwxyz{|}cst uvwxy{zs}|tNone +234=K Alpha  Key (Black)YellowMahentaCyan Key (Black)YellowMahentaCyan~c~ ~None +234=Kc None +234=KMThis is a signgle channel colorspace, that is designed to hold any channel from any other colorspace, hence it is not convertible to and from, but rather is here to allow separation of channels from other multichannel colorspaces. If you are looking for a true grayscale colorspace   should be used instead.-Separate an image into a list of images with 8 pixels containing every channel from the source image.&frog <- readImageRGB "images/frog.jpg"9let [frog_red, frog_green, frog_blue] = toGrayImages frog4writeImage "images/frog_red.png" $ toImageY frog_red8writeImage "images/frog_green.jpg" $ toImageY frog_green6writeImage "images/frog_blue.jpg" $ toImageY frog_blue images/frog_red.jpg  images/frog_green.jpg images/frog_blue.jpgCombine a list of images with Y pixels into an image of any color space, by supplying an order of color space channels.(For example here is a frog with swapped BlueRGB and GreenRGB channels.owriteImage "images/frog_rbg.jpg" $ fromGrayImages [frog_red, frog_green, frog_blue] [RedRGB, BlueRGB, GreenRGB] images/frog.jpg images/frog_rbg.jpgIt is worth noting though, that separating image channels can be sometimes pretty useful, the same effect as above can be achieved in a much simpler and more efficient way: . map ((PixelRGB r g b) -> PixelRGB r b g) frogcNone PConstrcut a complex pixel from two pixels representing real and imaginary parts.  PixelRGB 4 8 6  PixelRGB 7 1 1 == PixelRGB (4  7) (8  1) (6  1)*Extracts the real part of a complex pixel./Extracts the imaginary part of a complex pixel.BForm a complex pixel from polar components of magnitude and phase. t9 is a complex pixel with magnitude 1 and phase t (modulo 2*). The function  takes a complex pixel and returns a (magnitude, phase) pair of pixels in canonical form: the magnitude is nonnegative, and the phase in the range (-, ]1; if the magnitude is zero, then so is the phase.-The nonnegative magnitude of a complex pixel.+The phase of a complex pixel, in the range (-, ]2. If the magnitude is zero, then so is the phase.!The conjugate of a complex pixel.  None +234=K1Under the hood, Binary pixels are represented as  that can only take values of 0 or 1.JThis is a Binary colorspace, pixel's of which can be created using these  constructors: Represents value 1 or 7. It's a foreground pixel and is displayed in black.Represents value 0 or 7. It's a background pixel and is displayed in white.tNote, that values are inverted before writing to or reading from file, since grayscale images represent black as a 0 value and white as 1 on a [0,1] scale.OBinary pixels also behave as binary numbers with a size of 1-bit, for instance:!on + on -- equivalent to: 1 .|. 1 <Binary:(1)>1(on + on) * off -- equivalent to: (1 .|. 1) .&. 0 <Binary:(0)>(on + on) - on <Binary:(0)>Represents value  or 1? in binary. Often also called a foreground pixel of an object.Represents value  or 02 in binary. Often also called a background pixel. Convert a  to a PixelBin pixel.isOn (fromBool True)TrueTest if Pixel's value is .Test if Pixel's value is .'Invert value of a pixel. Equivalent of  for Bool's.  None  &2346=KUnboxed  representation.(Convert an image to a flattened Unboxed  . It is a O(1) opeartion.KtoUnboxedVector $ makeImage (3, 2) (\(i, j) -> PixelY $ fromIntegral (i+j))XfromList [<Luma:(0.0)>,<Luma:(1.0)>,<Luma:(1.0)>,<Luma:(2.0)>,<Luma:(2.0)>,<Luma:(3.0)>]'Construct a two dimensional image with m rows and n columns from a flat Unboxed  of length k . It is a O(1) opeartion. Make sure that  m * n = k.UfromUnboxedVector (200, 300) $ generate 60000 (\i -> PixelY $ fromIntegral i / 60000)#<Image VectorUnboxed Luma: 200x300> images/grad_fromVector.png G None &2346=KMRepa =nboxed Array representation, which is computed sequentially. Repa ;nboxed Array representation, which is computed in parallel.Repa Delayed Array representation, which allows for fusion of computation.JComputes an image in parallel and ensures that all elements are evaluated.KComputes an image sequentially and ensures that all elements are evaluated.=Delays an image, so further operations can be fused together.(O(1) - Changes to Vector representation.(O(1) - Changes to Vector representation.&O(1) - Changes to Repa representation.&O(1) - Changes to Repa representation.$O(1) - Changes computation strategy.#Computes delayed array in parallel.$O(1) - Changes computation strategy.$Computes delayed array sequentially.O(1) - Delays manifest array.O(1) - Delays manifest array.0 #None Bilinear interpolation method.&Nearest Neighbor interpolation method.Interpolation methodImage dimensions m rows and n columns.(Lookup function that returns a pixel at ith and j th location.real values of i and j indexNone 0Downsample an image by discarding every odd row.3Downsample an image by discarding every odd column.;Downsample an image by discarding every odd row and column.VUpsample an image by inserting a row of back pixels after each row of a source image.\Upsample an image by inserting a column of back pixels after each column of a source image.pUpsample an image by inserting a row and a column of back pixels after each row and a column of a source image._Concatenate two images together into one. Both input images must have the same number of rows.bConcatenate two images together into one. Both input images must have the same number of columns.5Crop an image, i.e. retrieves a sub-image image with m rows and n columns. Make sure (m + i, n + j)3 is not greater than dimensions of a source image.Flip an image vertically.&frog <- readImageRGB "images/frog.jpg":writeImage "images/frog_flipV.jpg" (computeS $ flipV frog) images/frog.jpg images/frog_flipV.jpgFlip an image horizontally.&frog <- readImageRGB "images/frog.jpg"/writeImage "images/frog_flipH.jpg" (flipH frog) images/frog.jpg images/frog_flipH.jpg!Rotate an image clockwise by 90.&frog <- readImageRGB "images/frog.jpg"5writeImage "images/frog_rotate90.jpg" (rotate90 frog) images/frog.jpg images/frog_rotate90.jpgRotate an image by 180.&frog <- readImageRGB "images/frog.jpg"7writeImage "images/frog_rotate180.jpg" (rotate180 frog) images/frog.jpg images/frog_rotate180.jpg"Rotate an image clockwise by 270.&frog <- readImageRGB "images/frog.jpg"7writeImage "images/frog_rotate270.jpg" (rotate270 frog) images/frog.jpg images/frog_rotate270.jpg.Resize an image using an interpolation method.&frog <- readImageRGB "images/frog.jpg"LwriteImage "images/frog_resize.jpg" (resize (Bilinear Edge) (100, 640) frog) images/frog_resize.jpg_Scale an image. Same as resize, except scaling factors are supplied instead of new dimensions.  scale ( *) (0.5, 2) frog == resize ( *) (100, 640) frog(i, j)+ starting index from within a source image.(m, n) dimensions of a new image. Source image./Interpolation method to be used during scaling.Dimensions of a result image. Source image. Reuslt image./Interpolation method to be used during scaling.Positive scaling factors. Source image.NonePConvolution of an image using a kernel. Border resolution technique is required.KConvolve image's rows with a vector kernel represented by a list of pixels.NConvolve image's columns with a vector kernel represented by a list of pixels.%Approach to be used near the borders. Kernel image. Source image.None This function magnifies an image by a positive factor and draws a grid around the original pixels. It is here simply as useful inspection tool.&frog <- readImageRGB "images/frog.jpg"SwriteImage "images/frog_eye_grid.png" $ pixelGrid 10 $ crop (51, 112) (20, 20) frog images/frog.jpg images/frog_eye_grid.pngMagnification factor. Source image. '()*+, ',+*)(None&3Fast Fourier TransformInverse Fast Fourier Transform Check if  is a power of two.ICompute the DFT of a matrix. Array dimensions must be powers of two else . None 3 PConstrcut a complex image from two images representing real and imaginary parts.&frog <- readImageRGB "images/frog.jpg" frog !+! 03<Image VectorUnboxed RGB (Complex Double): 200x320> frog !+! frog3<Image VectorUnboxed RGB (Complex Double): 200x320>*Extracts the real part of a complex image./Extracts the imaginary part of a complex image.BForm a complex image from polar components of magnitude and phase. t9 is a complex image with magnitude 1 and phase t (modulo 2*). The function  takes a complex image and returns a (magnitude, phase) pair of images in canonical form: the magnitude is nonnegative, and the phase in the range (-, ]1; if the magnitude is zero, then so is the phase.-The nonnegative magnitude of a complex image.+The phase of a complex image, in the range (-, ]2. If the magnitude is zero, then so is the phase.!The conjugate of a complex image.>Make a filter by using a function that works around a regular (x, y) coordinate system.&Apply a filter to an image created by . Dimensions of the filter. Both m and n have to be powers of 2, i.e. m == 2^k, where k is some integer. Source image.Filter.   None 2346UValues are scaled to  [0.0, 1.0] range.Values are scaled to  [0.0, 1.0] range.Values are scaled to [0, 18446744073709551615] range.Values are scaled to [0, 4294967295] range.Values are scaled to  [0, 65535] range.Values are scaled to [0, 255] range.Computes Luma: + Y' = 0.299 * R' + 0.587 * G' + 0.114 * B' "     \]^_`abcdefghijkopqrstuvwxy]^z{|}~hist~abcdefghijk\]^_`xyuwvrstopq}~z{|"     None  2346=K$Tagged Image File Format image with .tif or .tiff extension.6Truevision Graphics Adapter image with .tga extension. %Portable Network Graphics image with .png extension. ,Joint Photographic Experts Group image with .jpg or .jpeg extension.High-dynamic-range image with .hdr extension.'Graphics Interchange Format image with .gif extension.Bitmap image with .bmp extension.      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     None2346=K2Netpbm: portable pixmap image with .ppm extension.3Netpbm: portable graymap image with .pgm extension.2Netpbm: portable bitmap image with .pbm extension.H !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU? !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIKJMLONQPSRUTNone 2346=KLA collection of all image formats that can be written from HIP images with V precision pixel channels.IA collection of all image formats that can be read into HIP images with V precision pixel channels.WXYZ[\]^_`abcdefghijk,  !"#$%&     ,         !"#$%&]\[ZYXWedcba`_^fhgikjNone3This function will try to guess an image format from file's extension, then it will attempt to read it as such. It will fall back onto the rest of the supported formats and will try to read them regarless of file's extension. Whenever image cannot be decoded, lH containing all errors for each attempted format will be returned, and mT containing an image otherwise. Image will be read into a type signature specified a (x, u,  and  only) with V2 precision, while doing all necessary conversions.This function allows for reading any supported image in the exact colorspace and precision it is currently encoded in. For instance, frog image can be read into it's  colorspace with 8 precision and into any supported array representation.QreadImageExact JPG "images/frog.jpg" :: IO (Either String (Image RP YCbCr Word8))(Right <Image RepaDelayed YCbCr: 200x320>lThe drawback here is that colorspace and precision has to match exactly, otherwise it will return an error:OreadImageExact JPG "images/frog.jpg" :: IO (Either String (Image RD RGB Word8))Left "JuicyPixel decoding error: Input image is in YCbCr8 (Pixel YCbCr Word8), cannot convert it to RGB8 (Pixel RGB Word8) colorspace."Attempt to read an image in a particular color space that is not supported by the format, will result in a compile error. Refer to  + class for all images that can be decoded. Just like s, this function will guess an output file format from the extension and write to file any image that is in one of x, u,  or  as with V precision. While doing necessary conversions the choice will be given to the most suited color space supported by the format, for instance, in case of a   format, an (G arr  V) would be written as I16, hence preserving transparency and using highest supported precision +. At the same time, writing that image in  format would save it in RGB8, since  is the highest precision > supports and it currently cannot be saved with transparency.;Sets the program to be use when displaying an image, where U specifies if current thread should block until the program is closed when calling   function. GPicView ("gpicview", False)N is set as a default program with a nonblocking flag. Here are some examples:NsetDisplayProgram ("gpicview", True) -- use gpicview and block current thread.MsetDisplayProgram ("gimp", False) -- use gimp and don't block current thread.setDisplayProgram ("xv", False)$setDisplayProgram ("display", False) HMakes a call to the current display program, which can be changed using . An image is written as a .tiff file into an operating system's temporary directory and passed as an argument to the display program. If a blocking flag was set to  using ., then function will return immediately with (N n^), otherwise it will block current thread until external program is terminated, in which case MW is returned. Temporary file is deleted, after a program displaying an image is closed.&frog <- readImageRGB "images/frog.jpg"displayImage frogJust ThreadId 505 setDisplayProgram ("gimp", True);displayImage frog -- will only return after gimp is closed.Nothing o4A file format that an image should be read as. See #g:4Supported Image FormatsLocation of an image.*Location where an image should be written.An image to write. 5A file format that an image should be saved in. See #g:4Supported Image Formats"A list of format specific options.*Location where an image should be written.TAn image to write. Can be a list of images in case of formats supporting animation.p Image to be displayedq2  !"#$%&        op qNone3!Create an image with / (Vector Unboxed) representation and pixels of V precision. Note, that for VD precision pixels it is essential to keep values normalized in the [0, 1]= range in order for an image to be written to file properly.dlet grad_gray = makeImage (200, 200) (\(i, j) -> PixelY (fromIntegral i)/200 * (fromIntegral j)/200) Because all cs and Gs are installed into G, above is equivalent to:Ylet grad_gray = makeImage (200, 200) (\(i, j) -> PixelY $ fromIntegral (i*j)) / (200*200)+writeImage "images/grad_gray.png" grad_gray&Creating color images is just as easy.zlet grad_color = makeImage (200, 200) (\(i, j) -> PixelRGB (fromIntegral i) (fromIntegral j) (fromIntegral (i + j))) / 400-writeImage "images/grad_color.png" grad_color images/grad_gray.png images/grad_color.png" Read image as luma (brightness).#Read image as luma with \ channel.$Read image in RGB colorspace.%"Read image in RGB colorspace with \ channel.!(m rows, n& columns) - dimensions of a new image.A function that takes (i -th row, and jB-th column) as an argument and returns a pixel for that location."#$% !"#$% !"#$%!"#$%None3&,Create a delayed representation of an image.' Read image as luma (brightness).(Read image as luma with \ channel.)Read image in RGB colorspace.*"Read image in RGB colorspace with \ channel.&(m rows, n& columns) - dimensions of a new image.A function that takes (i -th row, and jB-th column) as an argument and returns a pixel for that location.'()*&'()*&'()*&'()* None23468 ++ contains a convenient set of functions for binary image construction, which is done by comparing either a single pixel with every pixel in an image or two same size images pointwise.2 Pixel wise AND operator on binary images. 3 Pixel wise OR operator on binary images.4"Complement each pixel in the image5?Construct a binary image using a predicate from a source image.6BConstruct a binary image using a predicate from two source images.73Threshold a source image with an applicative pixel.(yield <- readImageRGB "images/yield.jpg"dwriteImageExact PNG [] "images/yield_bin.png" $ thresholdWith (PixelRGB (>0.55) (<0.6) (<0.5)) yield images/yield.jpg images/yield_bin.png8?Compare two images with an applicative pixel. Works just like 7, but on two images.9Erosion is defined as: {E = B " S = {m,n|S "B}gwriteImageExact PNG [] "images/figure_erode.png" $ pixelGrid 10 $ fromImageBinary $ erode struct figure images/figure.png eroded with  images/struct.png is images/figure_erode.png:Dialation is defined as: {D = B " S = {m,n|S ")B"`"}kwriteImageExact PNG [] "images/figure_dialate.png" $ pixelGrid 10 $ fromImageBinary $ dialate struct figure images/figure.png dialated with  images/struct.png is images/figure_dialate.png;Opening is defined as: {B % S = (B " S) " S}ewriteImageExact PNG [] "images/figure_open.png" $ pixelGrid 10 $ fromImageBinary $ open struct figure images/figure.png opened with  images/struct.png is images/figure_open.png<Closing is defined as: {B % S = (B " S) " S}gwriteImageExact PNG [] "images/figure_close.png" $ pixelGrid 10 $ fromImageBinary $ close struct figure images/figure.png closed with  images/struct.png is images/figure_close.png+,-./012345 Predicate Source image.6 PredicateFirst source image.Second source image.75Pixel containing a thresholding function per channel. Source image.82Pixel containing a comparing function per channel. First image. second image.9Structuring element.Binary source image.:Structuring element.Binary source image.;Structuring element.Binary source image.<Structuring element.Binary source image.rst+,-./0123456789:;<5678234+,-./019:;<+,-./0123456789:;<rst,-./0123 (c) Alexey Kuleshevich 2016MIT%Alexey Kuleshevich <lehins@yandex.ru> experimental non-portableNone3=#Get the number of rows in an image.&frog <- readImageRGB "images/frog.jpg"frog <Image RepaDelayed RGB: 200x320> rows frog200>&Get the number of columns in an image.&frog <- readImageRGB "images/frog.jpg"frog <Image RepaDelayed RGB: 200x320> cols frog320?Sum all pixels in the image.@!Multiply all pixels in the image.A(Retrieve the biggest pixel from an imageB)Retrieve the smallest pixel from an imageC,Scales all of the pixels to be in the range [0, 1].=>?@ABC.@BCJKLMNOPQRS\]^_`abcdefghijkmnopqrstuvwxy]^z{|}~hist~ !"#$%=>?@ABC(!S"#$% =>J@mnKLMNOPQRBC?@ABC.=>?@ABCu !"#"$"%"&'()'(*'(+'(,'(-'./'.0'.1'.2'.3'.4'.5'.567898:;<=>?@AB C D E F G H I J KLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                         !!""##$$%%&&''(())*+,-./012345623456 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P QRSTUVWXYZA[\]\^_`_abcdefghijklmno p q r s t u v w x y z { | r s } ~     rsrsrsrYRRRRSrR      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\R]^_`abcdefghijklmnopqrstsuvwxyz { | }~ hip-1.0.0.0Graphics.Image.ColorSpaceGraphics.Image.IO.ExternalGraphics.Image.InterfaceGraphics.Image.Interface.VectorGraphics.Image.Interface.RepaGraphics.Image.Processing!Graphics.Image.Processing.ComplexGraphics.Image.IO Graphics.Image.Processing.BinaryGraphics.ImageGraphics.Image.IO.BaseGraphics.Image.ColorSpace.LumaGraphics.Image.ColorSpace.RGBGraphics.Image.ColorSpace.HSIGraphics.Image.ColorSpace.CMYKGraphics.Image.ColorSpace.YCbCrGraphics.Image.ColorSpace.GrayY!Graphics.Image.ColorSpace.Complex Graphics.Image.ColorSpace.Binary'Graphics.Image.Interface.Vector.Unboxed&Graphics.Image.Interface.Repa.Internal'Graphics.Image.Processing.Interpolation#Graphics.Image.Processing.Geometric%Graphics.Image.Processing.Convolution)Graphics.Image.Processing.Complex.Fourier&Graphics.Image.IO.External.JuicyPixels!Graphics.Image.IO.External.NetpbmbaseControl.Applicative<*>pure ApplicativeGHC.WordWord8Word16Word32Word64JuicyPixels-3.2.7Codec.Picture.GifGifDelay LoopingNeverLoopingForever LoopingRepeat GifLoopingCodec.Picture.ColorQuant MedianMeanCutUniformPaletteCreationMethodpaletteColorCountenableImageDitheringpaletteCreationMethodPaletteOptions<**> Data.Complex:+ComplexliftA3liftA2liftA<**> Data.Functor<$>GHC.Base<$WritableencodeReadabledecode ImageFormat SaveOptionextextsisFormatBorderContinueReflectEdgeWrapFill Exchangableexchange MutableArrayMImagemdimsthawfreezenewreadwriteswapSequentialArrayfoldlfoldrmapMmapM_foldMfoldM_ ManifestArrayindex deepSeqImage|*|foldeqArrayEltImagemake singletondimsmapimapzipWithizipWithtraverse traverse2 transpose backpermute fromListsElevatortoWord8toWord16toWord32toWord64toFloattoDouble fromDoubleAlphaOpaquegetAlphaaddAlpha dropAlpha ColorSpacePixelEltPixel fromChanneltoEltfromEltgetPxChchOppxOpchApp pxFoldMap borderIndex defaultIndex maybeIndexToYA toPixelYA toImageYAToYtoPixelYtoImageYYAAlphaYAToRGBA toPixelRGBA toImageRGBAToRGB toPixelRGB toImageRGBRGBA AlphaRGBABlueRGBA GreenRGBARedRGBARGBBlueRGBGreenRGBRedRGBToHSIA toPixelHSIA toImageHSIAToHSI toPixelHSI toImageHSIHSIA AlphaHSIAIntHSIASatHSIAHueHSIAHSIIntHSISatHSIHueHSIToCMYKA toPixelCMYKA toImageCMYKAToCMYK toPixelCMYK toImageCMYKCMYKA AlphaCMYKAKeyCMYKAYelCMYKAMagCMYKA CyanCMYKACMYKKeyCMYKYelCMYKMagCMYKCyanCMYKToYCbCrA toPixelYCbCrA toImageYCbCrAToYCbCr toPixelYCbCr toImageYCbCrYCbCrA AlphaYCbCrA CRedYCbCrA CBlueYCbCrA LumaYCbCrAYCbCr CRedYCbCr CBlueYCbCr LumaYCbCrGray toGrayImagesfromGrayImages+:realPartimagPartmkPolarcispolar magnitudephase conjugateBitBinaryonofffromBoolisOnisOff complementVUtoUnboxedVectorfromUnboxedVectorRSRPRDcomputePcomputeSdelayBilinearNearest Interpolation interpolatedownsampleRowsdownsampleCols downsample upsampleRows upsampleColsupsample leftToRight topToBottomcropflipVflipHrotate90 rotate180 rotate270resizescaleconvolve convolveRows convolveCols pixelGridfftifft!+! realPart' imagPart'mkPolar'cis'polar' magnitude'phase' conjugate' makeFilter applyFilter toPixelBinaryfromPixelBinary toImageBinaryfromImageBinaryTIFTGAPNGJPGHDRGIFBMPPPMPGMPBM OutputFormat InputFormat readImagereadImageExact writeImagewriteImageExactsetDisplayProgram displayImage makeImage readImageY readImageYA readImageRGB readImageRGBA Thresholding.==../=..<..<=..>..>=..&&..||.inverttoImageBinaryUsingtoImageBinaryUsing2 thresholdWith compareWitherodedialateopencloserowscolssumproductmaximumminimum normalize Convertibleconvertghc-prim GHC.ClassesEqGHC.NumNumGHC.Real Fractional GHC.FloatFloatingFunctor Data.FoldableFoldablefoldMap Data.MaybeNothingJust$fExchangablearrarr $fShowMImage $fShowImage $fNFDataImage$fFloatingImage$fFractionalImage $fNumImage $fEqImage$fFloatingPixel$fFractionalPixel $fNumPixel$fFoldablePixel$fApplicativePixel$fFunctorPixelPixelYAPixelY $fShowPixel $fShowPixel0$fShowYA$fShowY $fAlphaYATFCo:R:PixelYAe$fColorSpaceYATFCo:R:PixelYe $fColorSpaceY PixelRGBAPixelRGB $fShowRGBA $fShowRGB $fAlphaRGBATFCo:R:PixelRGBAe$fColorSpaceRGBATFCo:R:PixelRGBe$fColorSpaceRGB PixelHSIAPixelHSI $fShowHSIA $fShowHSI $fAlphaHSIATFCo:R:PixelHSIAe$fColorSpaceHSIATFCo:R:PixelHSIe$fColorSpaceHSI PixelCMYKA PixelCMYK $fShowCMYKA $fShowCMYK $fAlphaCMYKATFCo:R:PixelCMYKAe$fColorSpaceCMYKATFCo:R:PixelCMYKe$fColorSpaceCMYK PixelYCbCrA PixelYCbCr $fShowYCbCrA $fShowYCbCr $fAlphaYCbCrATFCo:R:PixelYCbCrAe$fColorSpaceYCbCrATFCo:R:PixelYCbCre$fColorSpaceYCbCr PixelGrayTFCo:R:PixelGraye$fColorSpaceGraypi GHC.TypesTrueFalseBoolnot PixelBinary$fNumBitTFCo:R:PixelBinarye$fColorSpaceBinaryvector-0.10.12.3Data.Vector.Unboxed.BaseVectorMVScalarMVImageVUImageVScalarfromIxtoIxTFCo:R:MImagestVUcse$fMutableArrayVUcse$fSequentialArrayVUcse$fManifestArrayVUcseTFCo:R:ImageVUcse $fArrayVUcse$fShowVUV_BitMV_BitTFCo:R:VectorBitV_PixelMV_PixelTFCo:R:VectorPixel repa-3.3.1.2Data.Array.Repa.Repr.UnboxedUData.Array.Repa.Repr.DelayedD$fExchangableRPVU$fExchangableRSVU$fExchangableVURP$fExchangableVURS$fExchangableRSRP$fExchangableRDRP$fExchangableRPRS$fExchangableRDRS$fExchangableRPRD$fExchangableRSRDMRSImageRPImageRSImageRDImageRUImageRScalarmultshT2tSh2suspendedComputeP getDelayed_error_compute_error_scalar_op $fEltPixel$fEltBitTFCo:R:MImagestRScse$fMutableArrayRScse$fSequentialArrayRScse$fManifestArrayRPcse$fManifestArrayRScseTFCo:R:ImageRPcse $fArrayRPcseTFCo:R:ImageRScse $fArrayRScseTFCo:R:ImageRDcse $fArrayRDcse$fShowRS$fShowRP$fShowRD$fInterpolationBilinear$fInterpolationNearest downsampleF upsampleF flipUsing convolve'' isPowerOfTwoIntfft2dGHC.ErrerrorModeInverseForward signOfMode fftGeneraltwiddle$fElevatorDouble$fElevatorFloat$fElevatorWord64$fElevatorWord32$fElevatorWord16$fElevatorWord8$fToYRGB $fToCMYKARGBA $fToCMYKRGB$fToYCbCrARGBA $fToYCbCrRGB $fToHSIARGBA $fToHSIRGB $fToHSIAYA$fToHSIY $fToRGBACMYKA $fToRGBCMYK$fToRGBAYCbCrA $fToRGBYCbCr $fToRGBAHSIA $fToRGBHSI $fToRGBAYA$fToRGBY $fToYAYCbCrA $fToYYCbCr $fToYCMYK $fToYAHSIA$fToYHSI $fToYARGBA $fToYGray JPGQuality GIFsLooping GIFsPalette GIFPalette decodeGifsjpImageToImagejpImageY8ToImagejpImageY16ToImagejpImageYA8ToImagejpImageYA16ToImagejpImageRGB8ToImagejpImageRGB16ToImagejpImageRGBFToImagejpImageRGBA8ToImagejpImageRGBA16ToImagejpImageYCbCr8ToImagejpImageCMYK8ToImagejpImageCMYK16ToImagejpDynamicImageToImage'jpDynamicImageToImage jpImageShowCSjpError jpCSError encodeGIF encodeGIFs encodeJPGimageToJPImage$fWritableImageTIF$fWritableImageTIF0$fWritableImageTIF1$fWritableImageTIF2$fWritableImageTIF3$fWritableImageTIF4$fWritableImageTIF5$fWritableImageTIF6$fWritableImageTIF7$fWritableImageTIF8$fWritableImageTIF9$fWritableImageTIF10$fWritableImageTIF11$fWritableImageTIF12$fWritableImageTIF13$fWritableImageTIF14$fWritableImageTIF15$fWritableImageTIF16$fWritableImageTGA$fWritableImageTGA0$fWritableImageTGA1$fWritableImageTGA2$fWritableImageTGA3$fWritableImageTGA4$fWritableImageTGA5$fWritableImageTGA6$fWritableImagePNG$fWritableImagePNG0$fWritableImagePNG1$fWritableImagePNG2$fWritableImagePNG3$fWritableImagePNG4$fWritableImagePNG5$fWritableImagePNG6$fWritableImagePNG7$fWritableImagePNG8$fWritableImagePNG9$fWritableImagePNG10$fWritableImagePNG11$fWritableImageJPG$fWritableImageJPG0$fWritableImageJPG1$fWritableImageJPG2$fWritableImageJPG3$fWritableImageJPG4$fWritableImageJPG5$fWritableImageJPG6$fWritableImageJPG7$fWritableImageHDR$fWritableImageHDR0$fWritableImageHDR1$fWritableImageHDR2$fWritableImageHDR3$fWritable[][]$fWritable[][]0$fWritableImageGIF$fWritableImageGIF0$fWritableImageGIF1$fWritableImageGIF2$fWritableImageGIF3$fWritableImageBMP$fWritableImageBMP0$fWritableImageBMP1$fWritableImageBMP2$fWritableImageBMP3$fWritableImageBMP4$fWritableImageBMP5$fWritableImageBMP6$fReadableImageTIF$fReadableImageTIF0$fReadableImageTIF1$fReadableImageTIF2$fReadableImageTIF3$fReadableImageTIF4$fReadableImageTIF5$fReadableImageTIF6$fReadableImageTIF7$fReadableImageTIF8$fReadableImageTIF9$fReadableImageTIF10$fReadableImageTIF11$fReadableImageTIF12$fReadableImageTIF13$fReadableImageTGA$fReadableImageTGA0$fReadableImageTGA1$fReadableImageTGA2$fReadableImageTGA3$fReadableImageTGA4$fReadableImageTGA5$fReadableImageTGA6$fReadableImagePNG$fReadableImagePNG0$fReadableImagePNG1$fReadableImagePNG2$fReadableImagePNG3$fReadableImagePNG4$fReadableImagePNG5$fReadableImagePNG6$fReadableImagePNG7$fReadableImagePNG8$fReadableImagePNG9$fReadableImagePNG10$fReadableImagePNG11$fReadableImageJPG$fReadableImageJPG0$fReadableImageJPG1$fReadableImageJPG2$fReadableImageJPG3$fReadableImageJPG4$fReadableImageJPG5$fReadableImageJPG6$fReadableImageJPG7$fReadableImageHDR$fReadableImageHDR0$fReadableImageHDR1$fReadableImageHDR2$fReadableImageHDR3$fReadable[][]$fReadable[][]0$fReadable[][]1$fReadable[][]2$fReadable[][]3$fReadable[][]4$fReadableImageGIF$fReadableImageGIF0$fReadableImageGIF1$fReadableImageGIF2$fReadableImageGIF3$fReadableImageGIF4$fReadableImageBMP$fReadableImageBMP0$fReadableImageBMP1$fReadableImageBMP2$fReadableImageBMP3$fReadableImageBMP4$fReadableImageBMP5$fReadableImageBMP6$fConvertiblePixelPixelCMYK16$fConvertiblePixelPixelCMYK8$fConvertiblePixelPixelYCbCr8$fConvertiblePixelPixelRGBA16$fConvertiblePixelPixelRGBA8$fConvertiblePixelPixelRGBF$fConvertiblePixelPixelRGB16$fConvertiblePixelPixelRGB8$fConvertiblePixelPixelYA16$fConvertiblePixelPixelYA8$fConvertiblePixelFloat$fConvertiblePixelWord32$fConvertiblePixelWord16$fConvertiblePixelWord8$fConvertiblePixelCMYK16Pixel$fConvertiblePixelCMYK8Pixel$fConvertiblePixelYCbCr8Pixel$fConvertiblePixelRGBA16Pixel$fConvertiblePixelRGBA8Pixel$fConvertiblePixelRGBFPixel$fConvertiblePixelRGB16Pixel$fConvertiblePixelRGB8Pixel$fConvertiblePixelYA16Pixel$fConvertiblePixelYA8Pixel$fConvertibleFloatPixel$fConvertibleWord32Pixel$fConvertibleWord16Pixel$fConvertibleWord8Pixel$fConvertiblePixelRGBA16Pixel0$fConvertiblePixelRGBA8Pixel0$fConvertiblePixelYCbCr8Pixel0$fConvertiblePixelCMYK16Pixel0$fConvertiblePixelCMYK8Pixel0$fConvertiblePixelRGBFPixel0$fConvertiblePixelRGB16Pixel0$fConvertiblePixelRGB8Pixel0$fConvertiblePixelYA16Pixel0$fConvertiblePixelYA8Pixel0$fConvertibleFloatPixel0$fConvertibleWord16Pixel0$fConvertibleWord8Pixel0$fConvertiblePixelCMYK16Pixel1$fConvertiblePixelCMYK8Pixel1$fConvertiblePixelYCbCr8Pixel1$fConvertiblePixelRGBFPixel1$fConvertiblePixelRGBA16Pixel1$fConvertiblePixelRGBA8Pixel1$fConvertiblePixelRGB16Pixel1$fConvertiblePixelRGB8Pixel1$fConvertiblePixelYA16Pixel1$fConvertiblePixelYA8Pixel1$fConvertibleFloatPixel1$fConvertibleWord16Pixel1$fConvertibleWord8Pixel1$fConvertiblePixelRGBA16Pixel2$fConvertiblePixelRGBA8Pixel2$fConvertiblePixelYCbCr8Pixel2$fConvertiblePixelCMYK16Pixel2$fConvertiblePixelCMYK8Pixel2$fConvertiblePixelRGBFPixel2$fConvertiblePixelRGB16Pixel2$fConvertiblePixelRGB8Pixel2$fConvertiblePixelYCbCr8Pixel3$fConvertiblePixelCMYK16Pixel3$fConvertiblePixelCMYK8Pixel3$fConvertiblePixelRGBFPixel3$fConvertiblePixelRGBA16Pixel3$fConvertiblePixelRGBA8Pixel3$fConvertiblePixelRGB16Pixel3$fConvertiblePixelRGB8Pixel3$fConvertiblePixelYA16Pixel2$fConvertiblePixelYA8Pixel2$fConvertibleFloatPixel2$fConvertibleWord16Pixel2$fConvertibleWord8Pixel2$fConvertiblePixelYA16Pixel3$fConvertiblePixelYA8Pixel3$fConvertibleFloatPixel3$fConvertibleWord16Pixel3$fConvertibleWord8Pixel3TFCo:R:SaveOptionTIF$fImageFormatTIFTFCo:R:SaveOptionTGA$fImageFormatTGATFCo:R:SaveOptionPNG$fImageFormatPNGTFCo:R:SaveOptionJPG$fImageFormatJPGTFCo:R:SaveOptionHDR$fImageFormatHDRTFCo:R:SaveOption[]$fImageFormat[]TFCo:R:SaveOptionGIF$fImageFormatGIFTFCo:R:SaveOptionBMP$fImageFormatBMPpnmToImagesUsinggetPxpnmDataToImagepnmDataPBMToImagepnmDataPGM8ToImagepnmDataPGM16ToImagepnmDataPPM8ToImagepnmDataPPM16ToImageppmToImageUsing decodePnmpnmError pnmCSError pnmShowData$fReadableImagePPM$fReadableImagePPM0$fReadableImagePGM$fReadableImagePGM0$fReadableImagePBM$fReadableImagePPM1$fReadableImagePPM2$fReadableImagePPM3$fReadableImagePPM4$fReadableImagePGM1$fReadableImagePBM0$fConvertiblePpmPixelRGB16Pixel$fConvertiblePpmPixelRGB8Pixel$fConvertiblePgmPixel16Pixel$fConvertiblePgmPixel8Pixel$fConvertiblePbmPixelPixel $fConvertiblePpmPixelRGB16Pixel0$fConvertiblePpmPixelRGB8Pixel0$fConvertiblePgmPixel16Pixel0$fConvertiblePgmPixel8Pixel0$fConvertiblePbmPixelPixel0 $fConvertiblePpmPixelRGB16Pixel1$fConvertiblePpmPixelRGB8Pixel1$fConvertiblePgmPixel16Pixel1$fConvertiblePgmPixel8Pixel1$fConvertiblePbmPixelPixel1 $fConvertiblePpmPixelRGB16Pixel2$fConvertiblePpmPixelRGB8Pixel2$fConvertiblePgmPixel16Pixel2$fConvertiblePgmPixel8Pixel2$fConvertiblePbmPixelPixel2 $fConvertiblePpmPixelRGB16Pixel3$fConvertiblePpmPixelRGB8Pixel3$fConvertiblePgmPixel16Pixel3$fConvertiblePgmPixel8Pixel3$fConvertiblePbmPixelPixel3TFCo:R:SaveOption[]0$fImageFormat[]0TFCo:R:SaveOption[]1$fImageFormat[]1TFCo:R:SaveOptionPPM$fImageFormatPPMTFCo:R:SaveOptionPGM$fImageFormatPGMTFCo:R:SaveOptionPBM$fImageFormatPBMDouble OutputTGA OutputTIF OutputPNG OutputJPG OutputHDR OutputGIF OutputBMPInputTGAInputPNMInputTIFInputPNGInputJPGInputHDRInputGIFInputBMP$fWritableImageOutputFormatTFCo:R:SaveOptionOutputFormat$fImageFormatOutputFormat$fReadableImageInputFormatTFCo:R:SaveOptionInputFormat$fImageFormatInputFormat Data.EitherLeftRight GHC.Conc.SyncThreadId guessFormatdisplayProgram displayUsing$fThresholdingImagePixelarr$fThresholdingPixelImagearr$fThresholdingImageImagearr