def SIFT(filename, r_mag): """ Returns the interest points found """ s = 3 k = 2 ** (1.0 / s) I = cv2.imread(filename) I_bw = cv2.imread(filename, 0) I1 = misc.imresize(I_bw, 50, 'bilinear').astype(int) I2 = misc.imresize(I1, 50, 'bilinear').astype(int) I3 = misc.imresize(I2, 50, 'bilinear').astype(int) dim = I_bw.shape # Sigma value we defined, yields more responses than the one below; #sigma1 = [math.sqrt(0.5), math.sqrt(1), math.sqrt(2), math.sqrt(4), #math.sqrt(8), math.sqrt(16), math.sqrt(32), math.sqrt(64), #math.sqrt(128), math.sqrt(256), math.sqrt(512)] # Sigma values for FIRST SCALE ONLY proposed by Lowe, yields less responses: sigma1 = numpy.array([1.3, 1.6, 1.6 * k, 1.6 * (k ** 2), 1.6 * (k ** 3), 1.6 * (k ** 4)]) print "creating gaussian pyramids.." o1sc = numpy.zeros((I_bw.shape[0],I_bw.shape[1],5)) o2sc = numpy.zeros((I1.shape[0],I1.shape[1],5)) o3sc = numpy.zeros((I2.shape[0],I2.shape[1],5)) o4sc = numpy.zeros((I3.shape[0],I3.shape[1],5)) for i in range(0,5): o1sc[:,:,i] = scipy.ndimage.filters.gaussian_filter(I_bw,sigma = sigma1[i]) o2sc[:,:,i] = scipy.ndimage.filters.gaussian_filter(I1,sigma = sigma1[i]) #+2 o3sc[:,:,i] = scipy.ndimage.filters.gaussian_filter(I2,sigma = sigma1[i]) #+4 o4sc[:,:,i] = scipy.ndimage.filters.gaussian_filter(I3,sigma = sigma1[i]) # +6 # Calculate difference of gaussian images. print "creating difference of gaussian pyramids.." DoG_pictures_scale_1 = numpy.zeros((I_bw.shape[0],I_bw.shape[1],4)) DoG_pictures_scale_2 = numpy.zeros((I1.shape[0],I1.shape[1],4)) DoG_pictures_scale_3 = numpy.zeros((I2.shape[0],I2.shape[1],4)) DoG_pictures_scale_4 = numpy.zeros((I3.shape[0],I3.shape[1],4)) for i in range(0,4): # CT: TRY WITH HELPERFUNCTION MINUS DoG_pictures_scale_1[:,:,i] = o1sc[:,:,i+1] - o1sc[:,:,i] #DoG_pictures_scale_1[:,:,i] = h.matrix_substraction(o1sc[:,:,i+1],o1sc[:,:,i]) # ct DoG_pictures_scale_2[:,:,i] = o2sc[:,:,i+1] - o2sc[:,:,i] DoG_pictures_scale_3[:,:,i] = o3sc[:,:,i+1] - o3sc[:,:,i] DoG_pictures_scale_4[:,:,i] = o4sc[:,:,i+1] - o4sc[:,:,i] #print DoG_pictures_scale_1[:,:,1] #cv2.imshow('image',DoG_pictures_scale_1[:,:,0]) #cv2.waitKey(0) # Initialize arrays for keypoints DoG_extrema_points_1_1 = [] DoG_extrema_points_1_2 = [] DoG_extrema_points_2 = [] DoG_extrema_points_3 = [] DoG_extrema_points_4 = [] print("Finding points for scale 1") for y in range(3, I_bw.shape[0] - 3): for x in range(3, I_bw.shape[1] - 3): if (find_max_new(DoG_pictures_scale_1,1,y,x, r_mag) == 1): DoG_extrema_points_1_1.append([y,x,0]) if (find_max_new(DoG_pictures_scale_1,2,y,x, r_mag) == 1): DoG_extrema_points_1_2.append([y,x,1]) dogn1 = numpy.array(DoG_extrema_points_1_1) dogn2 = numpy.array(DoG_extrema_points_1_2) if (len(dogn1) > 1) and (len(dogn2)>1): result = numpy.vstack([dogn1, dogn2]) #print result print "Number of points in first octave: %d" % len(result) #h.points_to_txt(result, "interest_points_sc1.txt", "\n") h.points_to_txt_3_points(result, "interest_points_sc1.txt", "\n") h.color_pic(I, result, filename[:-4] + "-sift_sc1-"+ "r-" + str(r_mag) + ".jpg") # TODO add scales """ print "Finding points for scale 2" for y in range(3, I1.shape[0] - 3): for x in range(3, I1.shape[1] - 3): if (find_max_new(DoG_pictures_scale_2,y,x, r_mag) == 1): DoG_extrema_points_2.append([y,x,0]) print len(DoG_extrema_points_2) dogn2 = numpy.array(DoG_extrema_points_2) if (len(dogn2) > 1): result1 = numpy.vstack([dogn2]) print "Number of points in second octave: %d" % len(result1) h.points_to_txt(result1, "interest_points_sc2.txt", "\n") h.color_pic(I1, result1, filename[:-4] + "-sift_sc2-"+ "r-" + str(r_mag) + ".jpg") print "Finding points for scale 3" for y in range(3, I2.shape[0] - 3): for x in range(3, I2.shape[1] - 3): if (find_max_new(DoG_pictures_scale_3,y,x, r_mag) == 1): DoG_extrema_points_3.append([y,x,0]) dogn3 = numpy.array(DoG_extrema_points_3) if (len(dogn3) > 1): result2 = numpy.vstack([dogn3]) print "LENGTH", len(result2) print "Number of points in third octave: %d" % len(result2) h.points_to_txt(result2, "interest_points_sc3.txt", "\n") h.color_pic(I2, result2, filename[:-4] + "-sift_sc3-"+ "r-" + str(r_mag) + ".jpg") print "Finding points for scale 4" for y in range(3, I3.shape[0] - 3): for x in range(3, I3.shape[1] - 3): if (find_max_new(DoG_pictures_scale_4,y,x, r_mag) == 1): DoG_extrema_points_4.append([y,x,0]) dogn4 = numpy.array(DoG_extrema_points_4) if (len(dogn4) > 1): result3 = numpy.vstack([dogn4]) print "Number of points in fourth octave: %d" % len(result3) h.points_to_txt(result3, "interest_points_sc4.txt", "\n") h.color_pic(I3, result3, filename[:-4] + "-sift_sc4-"+ "r-" + str(r_mag) + ".jpg") """ return(result)
def findSurfPoints(filename): clear = " " * 50 I_bw = cv2.imread(filename, 0).astype(float) I = cv2.imread(filename) sigma = 1.2 gausspictures = numpy.zeros((I_bw.shape[0],I_bw.shape[1],8)) for i in range (0,7): gausspictures[:,:,i] = cv2.filter2D(I_bw,-1, getGauss(1.2,i)) deriv9 = numpy.zeros((I_bw.shape[0],I_bw.shape[1],5)) deriv15 = numpy.zeros((I_bw.shape[0],I_bw.shape[1],5)) deriv21 = numpy.zeros((I_bw.shape[0],I_bw.shape[1],5)) deriv27 = numpy.zeros((I_bw.shape[0],I_bw.shape[1],5)) for y in range (10, I_bw.shape[0]-10): for x in range (10, I_bw.shape[1]-10): deriv9[y,x,0] = gausspictures[y,x+1,0] + gausspictures[y,x-1,0] - 2 * gausspictures[y,x,0] # DXX deriv9[y,x,1] = gausspictures[y+1,x,0] + gausspictures[y-1,x,0] - 2 * gausspictures[y,x,0] # DYY deriv9[y,x,2] = gausspictures[y+1,x+1,0] - gausspictures[y+1,x-1,0] - gausspictures[y-1,x+1,0] + gausspictures[y-1,x-1,0] # DXY deriv9[y,x,3] = gausspictures[y,x+1,0] - gausspictures[y,x-1,0] # DX deriv9[y,x,4] = gausspictures[y+1,x,0] - gausspictures[y+1,x,0] # DY # TODO Also calculate ds deriv15[y,x,0] = gausspictures[y,x+1,1] + gausspictures[y,x-1,1] - 2 * gausspictures[y,x,1] # DXX deriv15[y,x,1] = gausspictures[y+1,x,1] + gausspictures[y-1,x,1] - 2 * gausspictures[y,x,1] # DYY deriv15[y,x,2] = gausspictures[y+1,x+1,1] - gausspictures[y+1,x-1,1] - gausspictures[y-1,x+1,1] + gausspictures[y-1,x-1,1] # DXY deriv15[y,x,3] = gausspictures[y,x+1,1] - gausspictures[y,x-1,1] deriv15[y,x,4] = gausspictures[y+1,x,1] - gausspictures[y+1,x,1] deriv21[y,x,0] = gausspictures[y,x+1,2] + gausspictures[y,x-1,2] - 2 * gausspictures[y,x,2] # DXX deriv21[y,x,1] = gausspictures[y+1,x,2] + gausspictures[y-1,x,2] - 2 * gausspictures[y,x,2] # DYY deriv21[y,x,2] = gausspictures[y+1,x+1,2] - gausspictures[y+1,x-1,2] - gausspictures[y-1,x+1,2] + gausspictures[y-1,x-1,2] # DXY deriv21[y,x,3] = gausspictures[y,x+1,2] - gausspictures[y,x-1,2] deriv21[y,x,4] = gausspictures[y+1,x,2] - gausspictures[y+1,x,2] deriv27[y,x,0] = gausspictures[y,x+1,3] + gausspictures[y,x-1,3] - 2 * gausspictures[y,x,3] # DXX deriv27[y,x,1] = gausspictures[y+1,x,3] + gausspictures[y-1,x,3] - 2 * gausspictures[y,x,3] # DYY deriv27[y,x,2] = gausspictures[y+1,x+1,3] - gausspictures[y+1,x-1,3] - gausspictures[y-1,x+1,3] + gausspictures[y-1,x-1,3] # DXY deriv27[y,x,3] = gausspictures[y,x+1,3] - gausspictures[y,x-1,3] deriv27[y,x,4] = gausspictures[y+1,x,3] - gausspictures[y+1,x,3] hessian9 = numpy.zeros((I_bw.shape[0],I_bw.shape[1])) hessian15 = numpy.zeros((I_bw.shape[0],I_bw.shape[1])) hessian21 = numpy.zeros((I_bw.shape[0],I_bw.shape[1])) hessian27 = numpy.zeros((I_bw.shape[0],I_bw.shape[1])) for y in range (10, I_bw.shape[0]-10): for x in range (10, I_bw.shape[1]-10): hessian9[y,x] = (deriv9[y,x,0] * deriv9[y,x,1]) - (0.9*deriv9[y,x,2])**2 hessian15[y,x] = (deriv15[y,x,0] * deriv15[y,x,1]) - (0.9*deriv15[y,x,2])**2 hessian21[y,x] = (deriv21[y,x,0] * deriv21[y,x,1]) - (0.9*deriv21[y,x,2])**2 hessian27[y,x] = (deriv27[y,x,0] * deriv27[y,x,1]) - (0.9*deriv27[y,x,2])**2 scale1hessian = numpy.zeros((I_bw.shape[0],I_bw.shape[1],4)) scale1hessian[:,:,0] = hessian9 scale1hessian[:,:,1] = hessian15 scale1hessian[:,:,2] = hessian21 scale1hessian[:,:,3] = hessian27 extrema_points_1_1 = [] extrema_points_1_2 = [] for y in range(0,I_bw.shape[0]): for x in range(0,I_bw.shape[1]): Flag = False if find_max_new(scale1hessian,1,y,x) == 1 and (accurate_keypoint(deriv15[y,x,:]) == 1): extrema_points_1_1.append([y,x,(9/9*1.2)]) Flag = True if Flag == False and find_max_new(scale1hessian,2,y,x) == 1 and (accurate_keypoint(deriv21[y,x,:]) == 1): extrema_points_1_2.append([y,x,(15/9*1.2)]) dogn1 = numpy.array(extrema_points_1_1) dogn2 = numpy.array(extrema_points_1_2) if (len(dogn1) > 1) and (len(dogn2)>1): result = numpy.vstack([dogn1, dogn2]) print ("Number of points in first octave: %d" % len(result)) h.points_to_txt_3_points(result, "SURF_interest_points_o1.txt", "\n") h.color_pic(I, result, filename[:-4] + "Surfo1" + ".jpg")