# Original from Miller/Ranum chapter 6.
# This version detects edges for each rgb, not just gray.
# cmc, 11/27/09

from cImage import *

# Original from Listing 6.11 (this version returns
# tuple of sums - one for each rgb value)
def convolveRGB(anImage,pixelRow,pixelCol,kernel):
    kernelColumnBase = pixelCol - 1
    kernelRowBase = pixelRow - 1
    
    rSum = gSum = bSum = 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)
            r = apixel.getRed()
            g = apixel.getGreen()
            b = apixel.getBlue()
            rSum = rSum + r * kernel[kRowIndex][kColIndex]
            gSum = gSum + g * kernel[kRowIndex][kColIndex]
            bSum = bSum + b * kernel[kRowIndex][kColIndex]
    
    return (rSum, gSum, bSum)

# Original from Listing 6.12 (this version colors new image
# separately for rgb components, so no gray image either)
import math
def edgeDetectRGB(theImage):
    newim = EmptyImage(theImage.getWidth(), theImage.getHeight())
    red = Pixel(255,0,0)
    green = Pixel(0,255,0)
    blue = Pixel(0,0,255)
    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,theImage.getHeight()-1):    
        for col in range(1,theImage.getWidth()-1):   
            gx = convolveRGB(theImage,row,col,xMask)  # now gx and gy
            gy = convolveRGB(theImage,row,col,yMask)  # are tuples
            gRed = math.sqrt(gx[0]**2 + gy[0]**2)
            gGreen = math.sqrt(gx[1]**2 + gy[1]**2)
            gBlue = math.sqrt(gx[2]**2 + gy[2]**2)

            if gRed > 175 or gGreen > 175 or gBlue > 175:
                if gRed > gGreen:
                    if gRed > gBlue:
                       newim.setPixel(col,row,red)
                    else:
                       newim.setPixel(col,row,blue)
                elif gGreen > gBlue:
                    newim.setPixel(col,row,green)
                else:
                    newim.setPixel(col,row,blue)
            else:
                newim.setPixel(col,row,white)

    return newim

filename = input("enter filename, including .gif suffix: ")
image = FileImage(filename)
print("wait for it ...")
edges = edgeDetectRGB(image)
window = ImageWin("Edges of " + filename, edges.getWidth(), edges.getHeight())
edges.draw(window)
window.exitOnClick()

save = input("save image? ")
if save[0].upper() == 'Y':
    newfile = "edges_" + filename
    edges.save(newfile)
