# From Miller/Ranum chapter 6
# slightly modified by cmc, 11/27/09

from cImage import *

# Listing 6.11
def convolve(anImage,pixelRow,pixelCol,kernel):
    kernelColumnBase = pixelCol - 1
    kernelRowBase = pixelRow - 1
    
    sum = 0
    for row in range(kernelRowBase,kernelRowBase+3):
        for col in range(kernelColumnBase,kernelColumnBase+3):
            kColIndex = col-kernelColumnBase
            kRowIndex = row-kernelRowBase
            
            apixel = anImage.getPixel(col,row)
            intensity = apixel.getRed()
            
            sum = sum + intensity * kernel[kRowIndex][kColIndex]
    
    return sum

# Listing 6.12
import math
def edgeDetect(theImage):
    grayImage = pixelMapper(theImage,grayPixel)    
    newim = EmptyImage(grayImage.getWidth(), grayImage.getHeight())
    black = Pixel(0,0,0)
    white = Pixel(255,255,255)
    xMask = [ [-1,-2,-1],[0,0,0],[1,2,1] ]
    yMask = [ [1,0,-1],[2,0,-2],[1,0,-1] ]      

    for row in range(1,grayImage.getHeight()-1):    
        for col in range(1,grayImage.getWidth()-1):   
            gx = convolve(grayImage,row,col,xMask)  
            gy = convolve(grayImage,row,col,yMask)
            g = math.sqrt(gx**2 + gy**2) 
            
            if g > 175:
                newim.setPixel(col,row,black)
            else:
                newim.setPixel(col,row,white)

    return newim

# Listing 6.3
def grayPixel(oldpixel):
    intensitySum = oldpixel.getRed() + oldpixel.getGreen() + \
                   oldpixel.getBlue()
    aveRGB = intensitySum // 3

    newPixel = Pixel(aveRGB,aveRGB,aveRGB)
    return newPixel

# Listing 6.5
def pixelMapper(oldimage,rgbFunction):

    width = oldimage.getWidth()          
    height = oldimage.getHeight()
    newim = EmptyImage(width,height)     

    for row in range(height):
        for col in range(width):
            originalPixel = oldimage.getPixel(col,row)
            newPixel = rgbFunction(originalPixel)          
            newim.setPixel(col,row,newPixel)
            
    return newim


filename = input("enter filename, including .gif suffix: ")
image = FileImage(filename)
print("wait for it ...")
edges = edgeDetect(image)
window = ImageWin("Edges of " + filename, edges.getWidth(), edges.getHeight())
edges.draw(window)
window.exitOnClick()
