15 dodatnih pik lp

main
Gasper Spagnolo 2022-11-17 08:00:04 +01:00
parent ba03bcd5c8
commit 55e5b0c3c1
2 changed files with 173 additions and 11 deletions

View File

@ -4,7 +4,7 @@ from matplotlib import pyplot as plt
import cv2
import uz_framework.image as uz_image
import uz_framework.text as uz_text
import os
##############################################
# EXCERCISE 1: Exercise 1: Image derivatives #
##############################################
@ -13,7 +13,7 @@ def ex1():
#one_a()
#one_b()
#one_c()
one_d()
one_e()
def one_a() -> None:
"""
@ -148,6 +148,123 @@ def one_d() -> None:
plt.show()
def one_e():
"""
hello
"""
museum = uz_image.imread('./images/museum.jpg', uz_image.ImageType.float64)
#uz_image.get_image_bins_gradient_magnitude_and_angles(museum)
#ex2_naive('../assignment2/data/dataset/', 8)
ex2_optimized('../assignment2/data/dataset/', 8)
def ex2_naive(directory: str, n_bins: int):
"""
Taken from EX2
"""
methods=[uz_image.DistanceMeasure.euclidian_distance, uz_image.DistanceMeasure.chi_square_distance,
uz_image.DistanceMeasure.intersection_distance, uz_image.DistanceMeasure.hellinger_distance ]
img_names = os.listdir(directory)
all_dists = [[] for _ in range(len(methods))]
selected_distances = [[] for _ in range(len(methods))]
compare_image = uz_image.imread('../assignment2/data/dataset/object_05_4.png', uz_image.ImageType.float64)
h_compare_image = uz_image.get_image_bins_ND(compare_image, n_bins).reshape(-1)
imgs = []
hists = []
for i in range(len(img_names)):
# Firstly read all images
current_image = uz_image.imread(f'{directory}/{img_names[i]}', uz_image.ImageType.float64)
imgs.append(current_image)
current_image_histogram = uz_image.get_image_bins_ND(current_image, n_bins).reshape(-1)
hists.append(current_image_histogram)
# Then iterate through all methods and calculate distances
for j in range(len(methods)):
all_dists[j].append(uz_image.compare_two_histograms(h_compare_image, current_image_histogram, methods[j]))
for i in range(len(all_dists)):
# Setup plot
fig, axs = plt.subplots(2, 6)
fig.suptitle(f'Comparrison between different measures, using:{methods[i].name}')
# Sort the distances
sorted_dists = np.sort(all_dists[i])
ixs=[]
# find the closest and plot em
for j in range(6):
# Find indexes of closes distances
for k in range(len(all_dists[i])):
if all_dists[i][k] == sorted_dists[j]:
ixs.append(k)
selected_distances[i].append(sorted_dists[j])
continue
# Now plot them
axs[0, j].imshow(imgs[ixs[j]])
axs[0, j].set(title=f'{img_names[ixs[j]]}')
axs[1, j].bar(np.arange(n_bins**3), hists[ixs[j]], width=3)
axs[1, j].set(title=f'd={np.round(all_dists[i][ixs[j]], 2)}')
plt.show()
return all_dists, selected_distances
def ex2_optimized(directory: str, n_bins: int):
"""
Taken from EX2
"""
methods=[uz_image.DistanceMeasure.euclidian_distance, uz_image.DistanceMeasure.chi_square_distance,
uz_image.DistanceMeasure.intersection_distance, uz_image.DistanceMeasure.hellinger_distance ]
img_names = os.listdir(directory)
all_dists = [[] for _ in range(len(methods))]
selected_distances = [[] for _ in range(len(methods))]
compare_image = uz_image.imread_gray('../assignment2/data/dataset/object_05_4.png', uz_image.ImageType.float64)
h_compare_image = uz_image.get_image_bins_gradient_magnitude_and_angles(compare_image)
imgs = []
hists = []
for i in range(len(img_names)):
# Firstly read all images
current_image = uz_image.imread_gray(f'{directory}/{img_names[i]}', uz_image.ImageType.float64)
imgs.append(current_image)
current_image_histogram = uz_image.get_image_bins_gradient_magnitude_and_angles(current_image)
hists.append(current_image_histogram)
# Then iterate through all methods and calculate distances
for j in range(len(methods)):
all_dists[j].append(uz_image.compare_two_histograms(h_compare_image, current_image_histogram, methods[j]))
for i in range(len(all_dists)):
# Setup plot
fig, axs = plt.subplots(2, 6)
fig.suptitle(f'Comparrison between different measures, using:{methods[i].name}')
# Sort the distances
sorted_dists = np.sort(all_dists[i])
ixs=[]
# find the closest and plot em
for j in range(6):
# Find indexes of closes distances
for k in range(len(all_dists[i])):
if all_dists[i][k] == sorted_dists[j]:
ixs.append(k)
selected_distances[i].append(sorted_dists[j])
continue
# Now plot them
axs[0, j].imshow(imgs[ixs[j]])
axs[0, j].set(title=f'{img_names[ixs[j]]}')
axs[1, j].bar(np.arange(n_bins**3), hists[ixs[j]], width=3)
axs[1, j].set(title=f'd={np.round(all_dists[i][ixs[j]], 2)}')
plt.show()
return all_dists, selected_distances
############################################
# EXCERCISE 2: Exercise 1: Edges in images #
############################################
@ -543,7 +660,7 @@ def three_f():
axs[0, 0].imshow(hough_image_n)
axs[0, 0].set(title='normal')
axs[0, 1].imshow(image_with_edges_i)
axs[0, 1].imshow(hough_image_i)
axs[0, 1].set(title='normal')
axs[1, 0].imshow(rectangle_image, cmap='gray')
@ -567,7 +684,7 @@ def three_f():
# ######## #
def main():
#ex1()
ex1()
#ex2()
#ex3()

View File

@ -241,6 +241,49 @@ def get_image_bins_ND(image: Union[npt.NDArray[np.float64], npt.NDArray[np.uint
return hist / np.sum(hist)
def get_image_bins_gradient_magnitude_and_angles(image: Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]]) -> npt.NDArray[np.float64]:
WIDTH = image.shape[0]
HEIGHT = image.shape[1]
WIDTH_8 = WIDTH // 8
HEIGHT_8 = HEIGHT // 8
def split_into_blocks(image):
blocks = []
for y in range(0, 7):
for x in range(0, 8):
if x == 7:
blocks.append(image[y*WIDTH_8 : (y +1)* WIDTH_8, 7*HEIGHT_8 : HEIGHT].copy()) # handle the last column
else:
blocks.append(image[y*WIDTH_8 : (y +1)* WIDTH_8, x*HEIGHT_8 : (x +1)* HEIGHT_8].copy())
for x in range(0, 7):
blocks.append(image[7*WIDTH_8 : WIDTH, x*HEIGHT_8 : (x +1)* HEIGHT_8].copy()) # handle the last row
blocks.append(image[7*WIDTH_8 : WIDTH, 7*HEIGHT_8 : HEIGHT].copy())
return blocks
angle_linspace = np.linspace(-np.pi, np.pi, num=8)
gm, da = gradient_magnitude(image, 1 )
gm_blocks = split_into_blocks(gm)
da_blocks = split_into_blocks(da)
histogram = []
for ix in range(64):
# Gradient magnitude and angles
gm_l = gm_blocks[ix].reshape(-1)
da_l = da_blocks[ix].reshape(-1)
accumulator = np.zeros(8)
binned = np.digitize(da_l, angle_linspace)
for i in range(binned.size):
accumulator[binned[i] - 1] += gm_l[i]
# Normalize accumulator
histogram.extend(accumulator / np.sum(accumulator))
histogram = np.array(histogram)
return histogram / np.sum(histogram)
def compare_two_histograms(h1: npt.NDArray[np.float64], h2: npt.NDArray[np.float64],
method: DistanceMeasure) -> float:
"""
@ -707,7 +750,7 @@ def hough_find_lines(image: Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]
rhos = np.round(x* cos_precalculated + y* sin_precalculated).astype(np.int64)
# Bin the rhos
binned = np.digitize(rhos, rho_values)
binned = np.digitize(rhos, rho_values) -1
# Add to accumulator
for theta in range(n_bins_theta):
@ -716,6 +759,7 @@ def hough_find_lines(image: Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]
return accumulator
def hough_find_lines_i(image_with_lines: npt.NDArray[np.float64], gradient_angles: npt.NDArray[np.float64],
gradient_magnitude: npt.NDArray[np.float64],
n_bins_theta: int, n_bins_rho: int, treshold: float) -> npt.NDArray[np.uint64]:
""""
Accepts: bw image with lines, n_bins_theta, n_bins_rho, treshold
@ -741,9 +785,10 @@ def hough_find_lines_i(image_with_lines: npt.NDArray[np.float64], gradient_angle
theta = np.digitize(gradient_angles[y, x] / 2, theta_values) -1
rho = np.round(x* cos_precalculated[theta] + y* sin_precalculated[theta]).astype(np.int64)
binned_rho = np.digitize(rho, rho_values) - 1
binned_rho = np.digitize(rho, rho_values) - 1 # cuz digitize is returning bin number + 1
# Add to accumulator
print(gradient_magnitude[y, x])
accumulator[binned_rho, theta] += 1
return accumulator
@ -833,7 +878,7 @@ def find_lines_in_image_naive(image: npt.NDArray[np.float64], SIGMA=1, THETA=0.0
hough_image_nms = nonmaxima_suppression_box(hough_image)
# Fifth step: Retrieve sigma and theta pairs
pairs = retrieve_hough_pairs(image, hough_image_nms, np.max(hough_image_nms) *0.6, int(N_BINS_THETA), int(N_BINS_RHO))
pairs = retrieve_hough_pairs(image, hough_image_nms, np.max(hough_image_nms) *0.5, int(N_BINS_THETA), int(N_BINS_RHO))
# Sixth step: select best pairs
best_pairs = select_best_pairs(pairs, 10)
@ -854,15 +899,15 @@ def find_lines_in_image_improved(image: npt.NDArray[np.float64], SIGMA=1, THETA=
derivative_magnitude, gradient_angles = gradient_magnitude(image, SIGMA)
# Third step: Transform image into hough space
hough_image = hough_find_lines_i(image_with_edges, gradient_angles, N_BINS_THETA, N_BINS_RHO, TRESHOLD)
hough_image = hough_find_lines_i(image_with_edges, gradient_angles, derivative_magnitude, N_BINS_THETA, N_BINS_RHO, TRESHOLD)
# Fourth step: Apply nonmaxima suppression
hough_image_nms = nonmaxima_suppression_box(hough_image)
# Fifth step: Retrieve sigma and theta pairs
pairs = retrieve_hough_pairs(image, hough_image_nms, np.max(hough_image_nms) *0.001, N_BINS_THETA, N_BINS_RHO)
pairs = retrieve_hough_pairs(image, hough_image_nms, 0, N_BINS_THETA, N_BINS_RHO)
# Sixth step: select best pairs
best_pairs = select_best_pairs(pairs, 10)
#best_pairs = select_best_pairs(pairs, 10)
best_pairs = pairs
return image_with_edges, derivative_magnitude, gradient_angles, hough_image, hough_image_nms, pairs, best_pairs