def error(coords_list):
    seeds = fixed_seeds.copy()
    print(f'coordinate list : {coords_list}')
    print(f'seeds : {seeds}')
    for index in range(len(coords_list) // 2):
        coordinate = (int(coords_list[2 * index]),
                      int(coords_list[2 * index + 1]))
        seeds.update({coordinate: colour})
    segmentation = Segmentation(image_array,
                                beta,
                                seeds,
                                image_name,
                                reference_path=target_segmentation_path)
    segmentation.solve()
    segmentation.build_segmentation_image()
    return segmentation.compute_error()
    for key, value in initial_seeds.items() if value == 'red'
}
initial_coords = list(initial_variable_seeds.keys())
print(f'initial coords = {initial_coords}')

optimal_coords = optimize.minimize(error,
                                   initial_coords,
                                   method='nelder-mead',
                                   constraints=cons,
                                   options={
                                       'xtol': 1e-3,
                                       'disp': True
                                   })

optimal_seeds = fixed_seeds
for index in range(len(optimal_coords) // 2):
    coordinate = (int(optimal_coords[2 * index]),
                  int(optimal_coords[2 * index + 1]))
    optimal_seeds.update({coordinate: colour})

# optimal segmentation
segmentation = Segmentation(image_array,
                            beta,
                            optimal_seeds,
                            image_name,
                            reference_path=target_segmentation_path)
segmentation.solve()
segmentation.build_segmentation_image()
segmentation.compute_error()
segmentation.contours_to_png()
std_list = np.linspace(0, 0.02, size)
betas_list = np.linspace(0, 5000, size)
error_values = []

with open(seeds_file_path, 'rb') as seeds_file:
    seeds = pickle.load(seeds_file)
for noise_std in std_list:
    segmentation = Segmentation(image_array, 1, seeds, image_name)
    segmentation.add_noise(0, noise_std)
    segmentation.set_reference_segmentation(target_segmentation_path)
    for beta in betas_list:
        print(f'index = {index}, beta = {beta}, std = {noise_std}')
        segmentation.beta = beta
        segmentation.solve()
        segmentation.build_segmentation_image()
        error_values.append(segmentation.compute_error())
        index += 1

X, Y = np.meshgrid(betas_list, std_list)
triang = mtri.Triangulation(np.reshape(
    X, [size*size]), np.reshape(Y, [size*size]))
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.set_xlabel(r'$\beta$')
ax.set_ylabel('noise')
ax.set_zlabel('error')
ax.set_zlim3d(0, 0.085)
ax.set_zticks([0.1])
ax.set_xticks([0, 5000])
ax.set_yticks([0, 0.02])