Dodal se one_a

main
Gasper Spagnolo 2022-10-17 09:00:07 +02:00
parent 25a6337328
commit c5e79f5bac
2 changed files with 65 additions and 2 deletions

View File

@ -80,6 +80,9 @@ def convolve(I: np.ndarray, *ks):
I = cv2.filter2D(I, cv2.CV_64F, k) I = cv2.filter2D(I, cv2.CV_64F, k)
return I return I
def convert_float64_array_to_uint8_array(a: npt.NDArray[np.float64]) -> npt.NDArray[np.uint8]:
return a.astype(np.uint8)
if __name__ == '__main__': # False if this file is imported to another file and executed from there. if __name__ == '__main__': # False if this file is imported to another file and executed from there.

View File

@ -2,6 +2,7 @@ import UZ_utils as uz
import numpy as np import numpy as np
import numpy.typing as npt import numpy.typing as npt
from matplotlib import pyplot as plt from matplotlib import pyplot as plt
import random
####################################### #######################################
# EXCERCISE 1: Basic image processing # # EXCERCISE 1: Basic image processing #
@ -11,7 +12,7 @@ def excercise_one() -> None:
image = one_a() image = one_a()
one_b(image) one_b(image)
one_c(image) one_c(image)
one_d(100, 200, 50, 200, image) # needs to be fixed one_d(100, 200, 50, 200, image)
one_e() one_e()
def one_a() -> npt.NDArray[np.float64]: def one_a() -> npt.NDArray[np.float64]:
@ -124,8 +125,67 @@ def one_e() -> None:
# EXCERCISE 2: Thresholding and histograms # # EXCERCISE 2: Thresholding and histograms #
############################################ ############################################
def excercise_two() -> None:
"""
Thresholding an image is an operation that produces a binary image (mask) of the same
size where the value of pixels is determined by whether the value of the corresponding
pixels in the source image is greater or lower than the given threshold.
"""
two_a()
def two_a() -> tuple[npt.NDArray[np.float64], npt.NDArray[np.uint8]]:
"""
Create a binary mask from a grayscale image. The binary mask is a matrix the same
size as the image which contains 1 where some condition holds and 0 everywhere
else. In this case the condition is simply the original image intensity. Use the image
bird.jpg. Display both the image and the mask.
"""
random_number = random.random()
TRESHOLD = 0.4
image = uz.imread_gray("./images/bird.jpg")
binary_mask = image.copy()
if random_number < 0.5:
binary_mask[binary_mask < TRESHOLD] = 0
binary_mask[binary_mask >= TRESHOLD] = 1
else:
binary_mask = np.where(binary_mask < TRESHOLD, 0, 1)
binary_mask = uz.convert_float64_array_to_uint8_array(binary_mask)
fig, (ax0, ax1) = plt.subplots(1, 2)
fig.suptitle("Birdie and its mask")
ax0.imshow(image, cmap="gray")
ax1.imshow(binary_mask, cmap="gray")
ax0.set(title="Original image")
ax1.set(title="Mask of birdie")
plt.show()
return (image, binary_mask)
def two_b() -> None:
"""
Write a function myhist that accepts a grayscale image and the number of bins that
will be used in building a histogram. The function should return a 1D array that
represents the image histogram (the size should be equal to the number of bins, of
course).
The histogram is simply a count of pixels with same (or similar) intensity for all
bins. You can assume the values of the image are within the interval [0,255]. If you
use fewer than 255 bins, intensities will have to be grouped together, e.g. if using 10
bins, all values on the interval [0,25] will fall into bin 0.
Write a script that calculates and displays histograms for different numbers of bins
using bird.jpg
"""
def main() -> None: def main() -> None:
excercise_one() #excercise_one()
excercise_two()
if __name__ == "__main__": if __name__ == "__main__":
main() main()