Image Features – Harris Corner and Hough Line Detection

Feature_Donike
In [1]:
import time
import math
import random
import rasterio
import cv2
import matplotlib.pyplot as plt
import numpy as np
from skimage import color
from skimage import io
from skimage import data, img_as_float

import os
import glob
import mahotas as mt
from sklearn.neighbors import KNeighborsClassifier

import pandas as pd

Ex.1

1.1 - Loading image

In [2]:
!ls UCMerced_LandUse/Images/intersection
intersection00.tif  intersection25.tif	intersection50.tif  intersection75.tif
intersection01.tif  intersection26.tif	intersection51.tif  intersection76.tif
intersection02.tif  intersection27.tif	intersection52.tif  intersection77.tif
intersection03.tif  intersection28.tif	intersection53.tif  intersection78.tif
intersection04.tif  intersection29.tif	intersection54.tif  intersection79.tif
intersection05.tif  intersection30.tif	intersection55.tif  intersection80.tif
intersection06.tif  intersection31.tif	intersection56.tif  intersection81.tif
intersection07.tif  intersection32.tif	intersection57.tif  intersection82.tif
intersection08.tif  intersection33.tif	intersection58.tif  intersection83.tif
intersection09.tif  intersection34.tif	intersection59.tif  intersection84.tif
intersection10.tif  intersection35.tif	intersection60.tif  intersection85.tif
intersection11.tif  intersection36.tif	intersection61.tif  intersection86.tif
intersection12.tif  intersection37.tif	intersection62.tif  intersection87.tif
intersection13.tif  intersection38.tif	intersection63.tif  intersection88.tif
intersection14.tif  intersection39.tif	intersection64.tif  intersection89.tif
intersection15.tif  intersection40.tif	intersection65.tif  intersection90.tif
intersection16.tif  intersection41.tif	intersection66.tif  intersection91.tif
intersection17.tif  intersection42.tif	intersection67.tif  intersection92.tif
intersection18.tif  intersection43.tif	intersection68.tif  intersection93.tif
intersection19.tif  intersection44.tif	intersection69.tif  intersection94.tif
intersection20.tif  intersection45.tif	intersection70.tif  intersection95.tif
intersection21.tif  intersection46.tif	intersection71.tif  intersection96.tif
intersection22.tif  intersection47.tif	intersection72.tif  intersection97.tif
intersection23.tif  intersection48.tif	intersection73.tif  intersection98.tif
intersection24.tif  intersection49.tif	intersection74.tif  intersection99.tif
In [3]:
img_rgb = cv2.imread('UCMerced_LandUse/Images/intersection/intersection00.tif',1)
plt.imshow(img_rgb)
plt.show()
In [4]:
# convert to grayscale
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray,cmap="gray")
plt.show()

1.2 - Harris Detector to get Roads

In [5]:
def harris_det(img):
    
    # get thresholds
    ret,thresh = cv2.threshold(img,120,255,cv2.THRESH_BINARY_INV)
    
    # dilation
    kernel = np.ones((5,5),np.uint8)
    img = cv2.dilate(thresh,kernel,iterations=2)
    plt.imshow(img,cmap="gray")
    plt.title("Dilated Image")
    plt.show()
    
    # erosion
    kernel = np.ones((10,10),np.uint8)
    img = cv2.erode(img,kernel,iterations=1)
    plt.imshow(img,cmap="gray")
    plt.title("Eroded Image")
    plt.show()
    
    # get corners
    gray = np.float32(img)
    dst = cv2.cornerHarris(gray,3,5,0.06)
    plt.imshow(dst,cmap="gray")
    plt.title("Harris - Edges and Corners")
    plt.show()
    dst = cv2.dilate(dst,None,iterations=2)
    plt.imshow(dst,cmap="gray")
    plt.title("Harris - Corners Dilated")
    plt.show()
    
    # overlay edges over original image
    img_overlay_corners = img_rgb.copy()
    img_overlay_corners[dst>0.01]=[0,0,255]
    plt.imshow(img_overlay_corners,cmap="gray")
    plt.title("Corners overlaid over Image")
    plt.show()
In [6]:
harris_det(img_gray)

1.3 - Main Road Orientations w/ Hughes transform

In [7]:
img = cv2.imread(cv2.samples.findFile('UCMerced_LandUse/Images/intersection/intersection25.tif'), cv2.IMREAD_GRAYSCALE)
plt.imshow(img)
plt.show()

dst1 = cv2.Canny(img,100,20,None,3)
plt.imshow(dst1,cmap="gray")
plt.show()
In [8]:
# convert to RGB and Copy
cdst = cv2.cvtColor(dst1, cv2.COLOR_GRAY2BGR)
cdst_copy = np.copy(cdst)
In [9]:
# ?cv2.HoughLines
In [10]:
"""
# Manual Solution from Prati
lines = cv2.HoughLines(dst1, 1, np.pi / 180, 125, None, 0, 0)

if lines is not None:
    for i in range(0,len(lines)):
        
        rho = lines[i][0][0]
        theta = lines[i][0][1]
        
        a = math.cos(theta)
        b = math.sin(theta)
        
        x0 = a*rho
        y0 = b*rho
        
        pt1 = (int(x0 + 1000*(-b)),int(y0 + 1000*(a)))
        pt2 = (int(x0 - 1000*(-b)), int(y0 - 1000*(a)))
        
        cv2.line(cdst,pt1,pt2,(0,0,255),7,cv2.LINE_AA)
        
        
plt.imshow(cdst)
plt.show()
"""
# transorm lines
linesP = cv2.HoughLinesP(dst1, 1, np.pi / 180, 155, None, 50, 10)

# draw lines
if linesP is not None:
    for i in range(0, len(linesP)):
        l = linesP[i][0]
        cv2.line(cdst_copy, (l[0], l[1]), (l[2], l[3]), (0,0,255), 7, cv2.LINE_AA)

        

plt.imshow(cdst_copy)
plt.show()

Exercise 2

In [11]:
train_path = "/home/simon/CDE_UBS/Image_Analysis/03_Image_Features/UCMerced_LandUse/Images"
train_classes = os.listdir(train_path) 
In [12]:
# Extract Train and Test DFs holding paths and targets

x_paths_train = []
y_train = []
for train_class in train_classes:
    # get files in train folders
    files = os.listdir(train_path+"/"+train_class)
    # shuffle list to get random 10 images
    random.shuffle(files)
    files = files[:10]
    # append files with paths to dataset and Y label
    for file in files:
        x_paths_train.append(train_path+"/"+train_class+"/"+file)
        y_train.append(train_class)

# create pd df
df_train = pd.DataFrame({"x_path":x_paths_train,"y":y_train})

x_paths_test = []
y_test = []
for test_class in train_classes:
    # get files in train folders
    files = os.listdir(train_path+"/"+test_class)
    # shuffle list to get random 10 images
    random.shuffle(files)
    file = files[0]
    y_test.append(test_class)
    x_paths_test.append(train_path+"/"+test_class+"/"+file)
    """# append files with paths to dataset and Y label
    for file in files:
        x_paths_test.append(train_path+"/"+test_class+"/"+file)
        y_test.append(train_class)"""

# create pd df
df_test = pd.DataFrame({"x_path":x_paths_test,"y":y_test})
    
In [13]:
def get_features(path):
    img = cv2.imread(path)
    textures = mt.features.haralick(img)
    ht_mean = textures.mean(axis=0)
    return(ht_mean)
In [14]:
# append texture
tex = []
for path in df_train["x_path"]:
    tex.append(get_features(path))
df_train["x"] = tex

tex = []
for path in df_test["x_path"]:
    tex.append(get_features(path))
df_test["x"] = tex
In [15]:
df_train.head(5)
Out[15]:
x_path y x
0 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... river [0.0012447339431267647, 213.6953739032691, 0.7...
1 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... river [0.0002697358640565882, 671.6049101314522, 0.7...
2 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... river [0.0014521793386555479, 261.5884032588976, 0.8...
3 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... river [0.00016310613691894715, 302.30642994773154, 0...
4 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... river [0.0007591564715914901, 606.6542579302326, 0.7...
In [16]:
df_test.head(5)
Out[16]:
x_path y x
0 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... river [0.000854585229168331, 802.7071070005217, 0.85...
1 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... buildings [0.0002937545387317787, 392.2858152413333, 0.7...
2 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... intersection [0.00021946310388044858, 534.7896318158239, 0....
3 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... overpass [0.0017166742149301141, 2099.2503651676557, 0....
4 /home/simon/CDE_UBS/Image_Analysis/03_Image_Fe... beach [0.0006261706037242413, 1244.860437159545, 0.7...

Create NN-CLass Model

In [17]:
x_train = df_train["x"]
x_train = [l.tolist() for l in x_train]
y_train = list(df_train["y"])
In [ ]:
 
In [18]:
model = KNeighborsClassifier(n_neighbors=7)
model.fit(x_train,y_train)
Out[18]:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
                     metric_params=None, n_jobs=None, n_neighbors=7, p=2,
                     weights='uniform')
In [19]:
pred = []
for x in df_test["x"]:
    x = x.reshape(1, -1)
    pred.append(model.predict(x))
df_test["y_pred"] = pred
In [20]:
c = 0
for path,y,y_pred in zip(df_test["x_path"],df_test["y"],df_test["y_pred"]):
    plt.imshow(cv2.imread(path))
    plt.title("True: "+y+" Pred: "+str(y_pred[0]))
    plt.show()
    c = c+1
    if c==5:
        break
    
    
In [ ]:
 
In [ ]:
 
Further Reading
Recent Updates