15 dodatnih pik lp
parent
ba03bcd5c8
commit
55e5b0c3c1
|
@ -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()
|
||||
|
||||
|
|
|
@ -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,10 +785,11 @@ 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
|
||||
accumulator[binned_rho, theta] += 1
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue