All done lets fucking go

main
Gasper Spagnolo 2022-10-22 18:08:28 +02:00
parent 6ced34f623
commit bfa7eb87ad
2 changed files with 53 additions and 32 deletions

View File

@ -4,7 +4,6 @@ from matplotlib import pyplot as plt
import random
import cv2
import uz_framework.image as uz_image
import UZ_utils as uz
#######################################
# EXCERCISE 1: Basic image processing #
@ -146,7 +145,7 @@ def excercise_two() -> None:
two_b('./images/bird.jpg', 100, 20)
two_c('./images/bird.jpg', 20, 100)
two_d()
two_e(uz.imread_gray('./images/bird.jpg', uz.ImageType.uint8).astype(np.uint8))
two_e(uz_image.imread_gray('./images/bird.jpg', uz_image.ImageType.uint8).astype(np.uint8))
def two_a() -> tuple[npt.NDArray[np.float64], npt.NDArray[np.uint8]]:
@ -295,9 +294,9 @@ def two_e(image: npt.NDArray[np.uint8]):
######################################################
def excercise_three() -> None:
three_a()
#three_a()
#mask1, _ = three_b()
#three_c(uz.imread('./images/bird.jpg', uz.ImageType.float64), mask1)
#three_c(uz_image.imread('./images/bird.jpg', uz_image.ImageType.float64), mask1)
#three_d()
three_e()
@ -312,7 +311,7 @@ def three_a() -> None:
Answer: Opening = Erosion then dialation
Closing = Dialation then erosion
"""
img_orig = uz.imread_gray('./images/mask.png', uz.ImageType.float64)
img_orig = uz_image.imread_gray('./images/mask.png', uz_image.ImageType.float64)
img_er_dil = img_orig.copy()
img_dil_er = img_orig.copy()
@ -386,19 +385,15 @@ def three_b():
axs[0].imshow(original_mask, cmap='gray')
axs[0].set(title="Original mask")
axs[1].imshow(mask1, cmap='gray')
axs[1].set(title="Using elipse")
axs[2].imshow(mask2, cmap='gray')
axs[2].set(title="Using cross")
plt.show()
return (mask1, mask2)
# Ez lmao
def three_c(image: npt.NDArray[np.float64], mask: npt.NDArray[np.uint8]):
"""
Write a function immask that accepts a three channel image and
@ -406,11 +401,9 @@ def three_c(image: npt.NDArray[np.float64], mask: npt.NDArray[np.uint8]):
corresponding pixel in the mask is equal to 0. Otherwise, the pixel value should be
equal to the corresponding image pixel. Do not use for loops, as they are slow
"""
mask = np.expand_dims(mask, axis=2)
img = uz_image.apply_mask_on_image(image, mask)
image = mask * image
plt.imshow(image)
plt.imshow(img)
plt.show()
def three_d():
@ -422,16 +415,13 @@ def three_d():
would you fix that in general? (just inverting the mask if necessary doesnt count)
Answer:
"""
eagle_img_gray = uz.imread_gray('./images/eagle.jpg', uz.ImageType.uint8).astype(np.uint8)
eagle_img_color = uz.imread('./images/eagle.jpg', uz.ImageType.float64)
eagle_img_gray = uz_image.imread_gray('./images/eagle.jpg', uz_image.ImageType.uint8).astype(np.uint8)
eagle_img_color = uz_image.imread('./images/eagle.jpg', uz_image.ImageType.float64)
TRESHOLD = two_e(eagle_img_gray)
binary_mask = eagle_img_gray.copy()
binary_mask = np.where(binary_mask < TRESHOLD, 0, 1)
binary_mask = uz.convert_float64_array_to_uint8_array(binary_mask)
plt.imshow(binary_mask, cmap='gray')
plt.show()
binary_mask = binary_mask.astype(np.uint8)
# If I would invert image here, then we would get crap
# So workaround:
@ -448,7 +438,20 @@ def three_d():
# Now invert binary mask
binary_mask = np.where(binary_mask == 1, 0 , 1)
three_c(eagle_img_color, binary_mask)
removed_background_img = uz_image.apply_mask_on_image(eagle_img_color, binary_mask)
fig, axs = plt.subplots(1, 3)
fig.suptitle('Removing background of Eagle')
axs[0].imshow(eagle_img_color)
axs[0].set(title='Original image')
axs[1].imshow(binary_mask, cmap='gray')
axs[1].set(title='Computed Mask')
axs[2].imshow(removed_background_img, cmap='gray')
axs[2].set(title='Image with removed background')
plt.show()
def three_e():
"""
@ -461,26 +464,24 @@ def three_e():
from the original image (replace them with white background). Display the results
"""
# https://stackoverflow.com/a/42812226
coin_img_gray = uz.imread_gray('./images/coins.jpg', uz.ImageType.uint8).astype(np.uint8)
coin_img_color = uz.imread('./images/coins.jpg', uz.ImageType.float64)
coin_img_gray = uz_image.imread_gray('./images/coins.jpg', uz_image.ImageType.uint8).astype(np.uint8)
coin_img_color = uz_image.imread('./images/coins.jpg', uz_image.ImageType.float64)
TRESHOLD = two_e(coin_img_gray)
COIN_SIZE = 700
binary_mask = coin_img_gray.copy()
binary_mask = np.where(binary_mask < TRESHOLD, 0, 1)
binary_mask = uz.convert_float64_array_to_uint8_array(binary_mask)
binary_mask = binary_mask.astype(np.uint8)
SE_CROSS = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
binary_mask = cv2.erode(binary_mask, SE_CROSS, iterations=3)
binary_mask = cv2.dilate(binary_mask, SE_CROSS, iterations=2)
SE_CROSS = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 3))
binary_mask = cv2.dilate(binary_mask, SE_CROSS, iterations=2)
SE_CROSS = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 2))
binary_mask = cv2.dilate(binary_mask, SE_CROSS, iterations=2)
# Now invert binary mask
binary_mask = np.where(binary_mask == 1, 0 , 1)
binary_mask = uz.convert_float64_array_to_uint8_array(binary_mask)
binary_mask = binary_mask.astype(np.uint8)
output = cv2.connectedComponentsWithStats(binary_mask, 4, cv2.CV_32S)
n_blobs, im_with_separated_blobs, stats, _ = output
@ -491,13 +492,26 @@ def three_e():
if sizes[blob] > COIN_SIZE:
binary_mask[im_with_separated_blobs == blob] = 0
three_c(coin_img_color, binary_mask)
removed_coins = uz_image.apply_mask_on_image(coin_img_color, binary_mask)
removed_coins[removed_coins == 0] = 1
fig, axs = plt.subplots(1, 3)
fig.suptitle('Removal of >700px coins')
axs[0].imshow(coin_img_color)
axs[0].set(title='Original image')
axs[1].imshow(binary_mask, cmap='gray')
axs[1].set(title='Computed Mask')
axs[2].imshow(removed_coins)
axs[2].set(title='Image with coins removed')
plt.show()
def main() -> None:
#excercise_one()
excercise_one()
excercise_two()
#excercise_three()
excercise_three()
if __name__ == "__main__":
main()

View File

@ -80,8 +80,6 @@ def transform_coloured_image_to_grayscale(image: npt.NDArray[np.float64]) -> npt
for j in range(image.shape[1]):
grayscale_image[i, j] = (image[i, j, 0] + image[i,j, 1] + image[i, j, 2]) / 3
print(grayscale_image)
print(grayscale_image.shape)
return grayscale_image
@ -213,3 +211,12 @@ def get_image_bins(image: Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]]
counts = np.insert(counts, i - 1, 0)
return counts / np.sum(counts)
def apply_mask_on_image(image: Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]], mask: npt.NDArray[np.uint8]):
image = image.copy()
mask = np.expand_dims(mask, axis=2)
image = mask * image
return image