In [ ]:
import glob
import os
import matplotlib.pyplot as plt
import skimage
import numpy as np
import itertools
import scipy.misc
from skimage import io
import time
import cv2

from image_processing.img_util import show_image

load photos


In [ ]:
photos = glob.glob("/hackzurich2017/data/initial_cellphone/*.jpg")

display raw photos


In [ ]:
for i, photo_fname in enumerate(photos):
    description = "{}: {}".format(i, photo_fname)
    photo = scipy.misc.imread(photo_fname)
    show_image(photo, description, side=3)

exemplar image for each class


In [ ]:
grain_only = scipy.misc.imread(photos[25])
show_image(grain_only)

mixed = scipy.misc.imread(photos[9])
show_image(mixed)

threshold RGB


In [ ]:
def threshold(img, lower=20, upper=60):
    # threshold on hue channel of HSV
    hsv_img = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
    channel_img = hsv_img[:, :, 0]
    return cv2.inRange(channel_img, lower, upper)
    
for image in [grain_only, mixed]:
    show_image(threshold(image))

In [ ]:
def overlay_on_background(fg_img, bg_img, mask):
    idx = (mask != 0)
    ret = bg_img.copy()
    ret[idx] = fg_img[idx]
    return ret

bkg = mixed.copy()
bkg[:] = (255, 105, 180) # pink

# blue_screen = io.imread('/hackzurich2017/data/blue_screen.png')
# blue_screen = blue_screen[:,:,0:3]
# bkg = cv2.resize(blue_screen, (mixed.shape[1], mixed.shape[0]))

def remove_grains(img, erode_r=5, dilate_r=40):
    threshed = threshold(img)
    
    show_image(overlay_on_background(img, bkg, threshed))
    
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(erode_r, erode_r))
    remove_small = cv2.erode(threshed, kernel)
    
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(dilate_r, dilate_r))
    restore_large = cv2.dilate(remove_small, kernel)
    
    return overlay_on_background(img, bkg, restore_large)

show_image(remove_grains(grain_only))

In [ ]:
print mixed.shape[0:2]
cv2.resize?

In [ ]: