def srasm2(enhimgtf, edgeimgs, marks, orient, k, m, modes, maxiter): lms,_ = lm.procrustes(marks) mean, eigenvecs, eigenvals, lm_reduced = lm.pca_reduce(lms, modes) stdvar = np.std(lm_reduced, axis=1) croppedmarks = np.array([]) for i in range(13): croppedmarks = np.append(croppedmarks,lm.transform_shape(np.reshape(marks[:,i],(marks[:,i].size,1)),-1150,-500,1,0)) for i in range(13): croppedmarks = np.append(croppedmarks,lm.transform_shape(np.reshape(marks[:,i + 13],(marks[:,i + 13].size,1)),-1173,-500,1,0)) croppedmarks = np.reshape(croppedmarks,(croppedmarks.size / 26,26),'F') smallermarks = np.array([]) for i in range(26): smallermarks = np.append(smallermarks,lm.transform_shape(np.reshape(croppedmarks[:,i],(croppedmarks[:,i].size,1)),0,0,1.0 / 2,0)) smallermarks = np.reshape(smallermarks,(smallermarks.size / 26,26),'F') itx, ity, isc, itheta = init.get_initial_transformation(enhimgtf,mean,orient) b = np.zeros((modes,1)) imgtf = pp.apply_sobel(enhimgtf) imgtf = cv2.pyrDown(imgtf) edgies = np.array(map(lambda x: cv2.pyrDown(x),edgeimgs)) means, covs = gl.get_statistical_model_new(edgies,smallermarks,k) b, ntx, nty, nsc, itheta = asm(imgtf, means, covs, b, itx / 2, ity / 2, isc / 2, itheta, k, m, stdvar, mean, eigenvecs, maxiter, orient) return lm.transform_shape(lm.pca_reconstruct(b,mean,eigenvecs),ntx * 2,nty * 2,nsc * 2,itheta)
def match_image(imgind, orientation = 2, showground = True, modes = 5, k = 5, m = 10, maxiter = 50, multires = True): img = io.get_enhanced_img(imgind) imges = io.get_all_gradient_img(imgind) colgradimg = io.greyscale_to_colour(io.get_img(imgind)) #colgradimg = io.greyscale_to_colour(pp.apply_sobel(img)) # Init evaluation upper = None upperground = None lower = None lowerground = None itervec = np.array([0,0,0,0]) if orientation != 1: marks = io.read_all_landmarks_by_orientation(0,imgind) if multires: upper, itervec[0:2] = mrasm(img, imges, marks,0, k, m, modes, maxiter) else: upper = srasm2(img, imges, marks,0, k, m, modes, maxiter) draw.draw_contour(colgradimg,upper, thicc=1) allmarks = io.read_all_landmarks_by_orientation(0) upperground = None upperground = np.reshape(allmarks[:,imgind - 1],(allmarks[:,imgind - 1].size,1)) upperground = lm.transform_shape(upperground,-1150,-500,1,0) if showground: draw.draw_contour(colgradimg,upperground,color=(0,255,0), thicc=1) if orientation != 0: marks = io.read_all_landmarks_by_orientation(1,imgind) if multires: lower, itervec[2:4] = mrasm(img, imges, marks,1, k, m, modes, maxiter) else: lower = srasm2(img, imges, marks,1, k, m, modes, maxiter) draw.draw_contour(colgradimg,lower, thicc=1) allmarks = io.read_all_landmarks_by_orientation(1) lowerground = None lowerground = np.reshape(allmarks[:,imgind - 1],(allmarks[:,imgind - 1].size,1)) lowerground = lm.transform_shape(lowerground,-1150,-500,1,0) if showground: draw.draw_contour(colgradimg,lowerground,color=(0,255,0), thicc=1) #io.show_on_screen(colgradimg,1) #cv2.imwrite("result_contour.png",colgradimg) dumpimg = io.greyscale_to_colour(io.get_img(imgind)) # evaluate_results(upper, upperground, lower, lowerground, True, dumpimg) cv2.imwrite(str(imgind) + "i" + str(maxiter) + '.png',dumpimg) #io.show_on_screen(dumpimg,1) return itervec
def mrasm(enhimgtf, edgeimgs, marks, orient, k, m, modes, maxiter, resdepth = 1): itervec = np.array([0,0]) lms,_ = lm.procrustes(marks) mean, eigenvecs, eigenvals, lm_reduced = lm.pca_reduce(np.copy(lms), 26) coverage, modes_needed = lm.get_num_eigenvecs_needed(eigenvals) mean, eigenvecs, eigenvals, lm_reduced = lm.pca_reduce(lms, modes_needed) stdvar = np.std(lm_reduced, axis=1) croppedmarks = np.array([]) for i in range(13): croppedmarks = np.append(croppedmarks,lm.transform_shape(np.reshape(marks[:,i],(marks[:,i].size,1)),-1150,-500,1,0)) for i in range(13): croppedmarks = np.append(croppedmarks,lm.transform_shape(np.reshape(marks[:,i + 13],(marks[:,i + 13].size,1)),-1173,-500,1,0)) croppedmarks = np.reshape(croppedmarks,(croppedmarks.size / 26,26),'F') itx, ity, isc, itheta = init.get_initial_transformation(enhimgtf,mean,orient) b = np.zeros((modes_needed,1)) print '' print 'Starting multi-resolution fitting procedure for orientation ' + str(orient) print '--------' imgtf = pp.apply_sobel(enhimgtf) for i in range(resdepth + 1): print 'Step ' + str(i) + ':' edgies = edgeimgs limgtf = imgtf j = 0 while resdepth - i > j: limgtf = cv2.pyrDown(limgtf) edgies = np.array(map(lambda x: cv2.pyrDown(x),edgies)) smallermarks = np.array([]) for l in range(26): smallermarks = np.append(smallermarks,lm.transform_shape(np.reshape(croppedmarks[:,l],(croppedmarks[:,l].size,1)),0,0,1.0 / 2,0)) smallermarks = np.reshape(smallermarks,(smallermarks.size / 26,26),'F') j += 1 means, covs = gl.get_statistical_model_new(edgies,smallermarks,k) b, ntx, nty, nsc, itheta, itervec[i] = asm(limgtf, means, covs, b, float(itx) / math.pow(2.0,(resdepth-i)), float(ity) / math.pow(2.0,(resdepth-i)), float(isc) / math.pow(2.0,(resdepth-i)), itheta, k, m, stdvar, mean, eigenvecs, maxiter, orient) itx = ntx * math.pow(2.0,(resdepth-i)) ity = nty * math.pow(2.0,(resdepth-i)) isc = nsc * math.pow(2.0,(resdepth-i)) return lm.transform_shape(lm.pca_reconstruct(b,mean,eigenvecs),itx,ity,isc,itheta), itervec
def asm(imgtf, means, covs, b, tx, ty, s, theta, k, m, stdvar, mean, eigenvecs, maxiter, orient): numit = -1 for i in range(maxiter): shapetf = lm.pca_reconstruct(b,mean,eigenvecs) shapetf = lm.transform_shape(shapetf, tx, ty, s, theta) approx, stop = find_new_points(imgtf, shapetf, means, covs, k, m, orient) if stop: numit = i+1 print ' Stopped at iteration ' + str(i) + ' out of ' + str(maxiter) + ' maximum.' break b, tx, ty, s, theta = match_model_to_target(approx, mean, eigenvecs) #Check for plausible shapes for p in range(b.size): b[p, 0] = max(min(b[p, 0],3*stdvar[p]),-3*stdvar[p]) if i == maxiter - 1: numit = maxiter print ' Completed max number of iterations: ' + str(i + 1) return b, tx, ty, s, theta, numit
def make_object_space_visible(ls): return lms.transform_shape(ls, 350, 250, 2203, 0)