Thresholding Function




Now what we want to do is create a function that will take the images we feed it, and threshold it. The way we're going to do this is by taking the "average" color value, and then thresholding any pixel as black if it is any darker or white if it is lighter.

To start, let's delete everything but the imports, leaving:

from PIL import Image
import numpy as np

import matplotlib.pyplot as plt
import time
	  

Then we'll begin our threshold function:

def threshold(imageArray):
    balanceAr = []
    newAr = imageArray

Above, we define the function, and we specify that we're expecting a parameter, the imageArray. This will be that array that we've been seeing with the pixel values.

Next, we define the balanceAr as an empty list, and the newAr, for now, is the imageArray. We cannot modify the actual iar without NumPy throwing a fit, so we do this. Balance array, at the end, will be averaged, to find our threshold.

Now we begin a for loop. Within this for loop we have some code that is not compatible between Python versions. I will just put a Python 2 and Python 3 version here.

Python 2:


    for eachRow in imageArray:
        for eachPix in eachRow:
            avgNum = reduce(lambda x, y: x + y, eachPix[:3]) / len(eachPix[:3])
            balanceAr.append(avgNum)

Python 3:

    
    from statistics import mean
    for eachRow in imageArray:
        for eachPix in eachRow:
            avgNum = mean(eachPix[:3])
            balanceAr.append(avgNum)

Next, our goal is to apply this function to some images, so let's add some images here:

i = Image.open('images/numbers/0.1.png')
iar = np.array(i)
i2 = Image.open('images/numbers/y0.4.png')
iar2 = np.array(i2)
i3 = Image.open('images/numbers/y0.5.png')
iar3 = np.array(i3)
i4 = Image.open('images/sentdex.png')
iar4 = np.array(i4)


fig = plt.figure()
ax1 = plt.subplot2grid((8,6),(0,0), rowspan=4, colspan=3)
ax2 = plt.subplot2grid((8,6),(4,0), rowspan=4, colspan=3)
ax3 = plt.subplot2grid((8,6),(0,3), rowspan=4, colspan=3)
ax4 = plt.subplot2grid((8,6),(4,3), rowspan=4, colspan=3)

ax1.imshow(iar)
ax2.imshow(iar2)
ax3.imshow(iar3)
ax4.imshow(iar4)


plt.show()
	 

Run the script and you should see:

Now what we want to do is threshold the images, so then we'll see that the zeros look all the same, and then you'll see it work in an image with more than two colors.

The next tutorial:





  • Introduction and Dependencies
  • Understanding Pixel Arrays
  • More Pixel Arrays
  • Graphing our images in Matplotlib
  • Thresholding
  • Thresholding Function
  • Thresholding Logic
  • Saving our Data For Training and Testing
  • Basic Testing
  • Testing, visualization, and moving forward