import numpy as np
import cv2
import matplotlib.pyplot as plt
# load images
left = cv2.imread('sawtooth/im0.ppm')
right = cv2.imread('sawtooth/im2.ppm')
# convert to grayscale
left_gray = cv2.cvtColor(left, cv2.COLOR_BGR2GRAY)
right_gray = cv2.cvtColor(right, cv2.COLOR_BGR2GRAY)
# show grayscale images
cv2.imshow('Left', left_gray)
cv2.imshow('Right', right_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
# define the image patch
patch_loc = [100, 120]
patch_size = [100, 100]
# extract the patch from the left image
patch_left = left_gray[patch_loc[0]:(patch_loc[0] + patch_size[0]),
patch_loc[1]:(patch_loc[1] + patch_size[1])]
# extract strip from the rigth image
strip_right = right_gray[patch_loc[0]:(patch_loc[0] + patch_size[0]), :]
# show left patch and right strip
cv2.imshow('Image Patch Left', patch_left)
cv2.imshow('Image Strip Right', strip_right)
cv2.waitKey(0)
cv2.destroyAllWindows()
################################### FIND BEST X USING SUM OF SQUARED DIFFERENCES
# create a function to find the best x match location in the right strip
def best_x(patch, strip):
""" Return the best x location for the patch in the strip using the sum of
squared differences.
Params:
patch: The input image patch to be compared
strip: The input strip image in which the patch is compared against
Returns:
best_x: The best x fit location of the patch in the strip
"""
min_diff = float('inf')
best_x = 0
for x in range(0, strip.shape[1] - patch.shape[1] + 1):
extracted_patch = strip[:, x:(x + patch.shape[1])]
ssd = np.sum((patch - extracted_patch)**2)
if ssd < min_diff:
best_x = x
min_diff = ssd
return best_x
# get best_x and corresponding patch
x = best_x(patch_left, strip_right)
patch_right = strip_right[:, x:(x + patch_left.shape[1])]
# plot patch left, strip right and patch right using matplotlib
fig = plt.figure(figsize=(8, 6))
fig.canvas.set_window_title('Best X Patch Detection')
plt.subplot(311), plt.imshow(patch_left, 'gray')
plt.title('Original Patch from the Left Image'), plt.xticks([]), plt.yticks([])
plt.subplot(312), plt.imshow(strip_right, 'gray')
plt.title('Original Strip from the Right Image'), plt.xticks([]), plt.yticks([])
plt.subplot(313), plt.imshow(patch_right, 'gray')
plt.title('Extracted Patch from the Right Image'), plt.xticks([]), plt.yticks([])
plt.show()
############################################# FIND DISPARITY VECTOR FOR 2 STRIPS
# define strip row (y) and the square block size (b)
y = 75
b = 100
# extract strip from the images
left_strip = left_gray[y:(y + b), :]
right_strip = right_gray[y:(y + b), :]
# show strip images
cv2.imshow('Left Disparity Image Strip', left_strip)
cv2.imshow('Right Disparity Image Strip', right_strip)
cv2.waitKey(0)
cv2.destroyAllWindows()
# define function to find disparity
def match_strips(left_strip, right_strip, block_size):
''' A function for finding the pixel disparity vector between each block in
right and left strips with the given block size. '''
num_blocks = left_strip.shape[1] / block_size # python 2 floors integer div
# create an empty disparity vector
disparity = np.zeros(num_blocks)
# how many times does the block fit in the strip
for i in range(num_blocks):
x_left = i*block_size
patch_left = left_strip[:, x_left:(x_left + block_size)] # get patch
x_right = best_x(patch_left, right_strip)
disparity[i] = x_left - x_right
return disparity
# call the match strips function
disparity = match_strips(left_strip, right_strip, b)
print disparity
# plot strips and disparity
fig = plt.figure(figsize=(8, 6))
fig.canvas.set_window_title('Stereo Disparity')
plt.subplot(311), plt.imshow(left_strip, 'gray')
plt.title('Strip from the Left Image'), plt.xticks([]), plt.yticks([])
plt.subplot(312), plt.imshow(right_strip, 'gray')
plt.title('Strip from the Right Image'), plt.xticks([]), plt.yticks([])
plt.subplot(313), plt.plot(disparity)
plt.title('Disparity Between the Two Images')
plt.show()