96 lines
4.0 KiB
Python
96 lines
4.0 KiB
Python
import numpy as np
|
||
import numpy.typing as npt
|
||
from matplotlib import pyplot as plt
|
||
import random
|
||
import cv2
|
||
import uz_framework.image as uz_image
|
||
|
||
#################################################################
|
||
# EXCERCISE 1: Exercise 1: Global approach to image description #
|
||
#################################################################
|
||
def ex1():
|
||
one_a()
|
||
one_b()
|
||
one_c()
|
||
|
||
def one_a() -> npt.NDArray[np.float64]:
|
||
"""
|
||
Firstly, you will implement the function myhist3 that computes a 3-D histogram
|
||
from a three channel image. The images you will use are RGB, but the function
|
||
should also work on other color spaces. The resulting histogram is stored in a 3-D
|
||
matrix. The size of the resulting histogram is determined by the parameter n_bins.
|
||
The bin range calculation is exactly the same as in the previous assignment, except
|
||
now you will get one index for each image channel. Iterate through the image pixels
|
||
and increment the appropriate histogram cells. You can create an empty 3-D numpy
|
||
array with H = np.zeros((n_bins,n_bins,n_bins)). Take care that you normalize
|
||
the resulting histogram.
|
||
"""
|
||
image = uz_image.imread('./data/dataset/object_01_1.png', uz_image.ImageType.float64)
|
||
bins = uz_image.get_image_bins_ND(image, 20)
|
||
return bins
|
||
|
||
def one_b() -> None:
|
||
"""
|
||
In order to perform image comparison using histograms, we need to implement
|
||
some distance measures. These are defined for two input histograms and return a
|
||
single scalar value that represents the similarity (or distance) between the two histograms.
|
||
Implement a function compare_histograms that accepts two histograms
|
||
and a string that identifies the distance measure you wish to calculate
|
||
Implement L2 metric, chi-square distance, intersection and Hellinger distance.
|
||
Function implemented in uz_framework
|
||
"""
|
||
return None
|
||
|
||
def one_c() -> None:
|
||
"""
|
||
Test your function
|
||
Compute a 8×8×8-bin 3-D histogram for each image. Reshape each of them into a
|
||
1-D array. Using plt.subplot(), display all three images in the same window as well
|
||
as their corresponding histograms. Compute the L2 distance between histograms of
|
||
object 1 and 2 as well as L2 distance between histograms of objects 1 and 3.
|
||
|
||
Question: Which image (object_02_1.png or object_03_1.png) is more similar
|
||
to image object_01_1.png considering the L2 distance? How about the other three
|
||
distances? We can see that all three histograms contain a strongly expressed component (one bin has a much higher value than the others). Which color does this
|
||
bin represent
|
||
Answer:
|
||
"""
|
||
IM1 = uz_image.imread('./data/dataset/object_01_1.png', uz_image.ImageType.float64)
|
||
IM2 = uz_image.imread('./data/dataset/object_02_1.png', uz_image.ImageType.float64)
|
||
IM3 = uz_image.imread('./data/dataset/object_03_1.png', uz_image.ImageType.float64)
|
||
N_BINS = 8
|
||
|
||
H1 = uz_image.get_image_bins_ND(IM1, N_BINS).reshape(-1)
|
||
H2 = uz_image.get_image_bins_ND(IM2, N_BINS).reshape(-1)
|
||
H3 = uz_image.get_image_bins_ND(IM3, N_BINS).reshape(-1)
|
||
|
||
fig, axs = plt.subplots(2,3)
|
||
fig.suptitle('Euclidian distance between three images')
|
||
|
||
axs[0, 0].imshow(IM1)
|
||
axs[0, 0].set(title='Image1')
|
||
axs[0, 1].imshow(IM2)
|
||
axs[0, 1].set(title='Image2')
|
||
axs[0, 2].imshow(IM3)
|
||
axs[0, 2].set(title='Image3')
|
||
|
||
axs[1, 0].bar(np.arange(N_BINS**3), H1, width=3)
|
||
axs[1, 0].set(title=f'L_2(h1, h1) = {np.round(uz_image.compare_two_histograms(H1, H1, uz_image.DistanceMeasure.euclidian_distance), 2)}')
|
||
axs[1, 1].bar(np.arange(N_BINS**3), H2, width=3)
|
||
axs[1, 1].set(title=f'L_2(h1, h2) = {np.round(uz_image.compare_two_histograms(H1, H2, uz_image.DistanceMeasure.euclidian_distance), 2)}')
|
||
axs[1, 2].bar(np.arange(N_BINS**3), H3, width=3)
|
||
axs[1, 2].set(title=f'L_2(h1, h3) = {np.round(uz_image.compare_two_histograms(H1, H3, uz_image.DistanceMeasure.euclidian_distance), 2)}')
|
||
|
||
plt.show()
|
||
|
||
|
||
# ######## #
|
||
# SOLUTION #
|
||
# ######## #
|
||
|
||
def main():
|
||
ex1()
|
||
|
||
if __name__ == '__main__':
|
||
main()
|