diff --git a/assignment2/solution.py b/assignment2/solution.py index c435bf8..89ebc4d 100644 --- a/assignment2/solution.py +++ b/assignment2/solution.py @@ -288,10 +288,10 @@ def two_e(): # EXCERCISE 3: Image Filtering # ################################ def ex3(): - #three_a() - # three_b() - # three_c() - #three_d() + three_a() + three_b() + three_c() + three_d() three_e() def three_a(): @@ -312,9 +312,12 @@ def three_a(): """ lena = uz_image.imread('./data/images/lena.png', uz_image.ImageType.float64) lena_grayscale = uz_image.transform_coloured_image_to_grayscale(lena.astype(np.float64)) + + # Gaussian noise lena_gausssian_noise = uz_image.gauss_noise(lena_grayscale) + # Salt and pepper noise lena_salt_and_pepper = uz_image.sp_noise(lena_grayscale) - kernel = uz_image.get_gaussian_kernel(1) + kernel = np.array(uz_image.get_gaussian_kernel(2)) # MUST BE A 2D for TRANSPOSE # Denoised denosised_lena = cv2.filter2D(lena_gausssian_noise, cv2.CV_64F, kernel) @@ -335,6 +338,7 @@ def three_a(): axs[0, 2].set(title='Salt and Pepper applied') axs[1, 2].imshow(desalted_lena, cmap='gray') axs[1, 2].set(title='Desalted Lena') + axs[1, 0].set_visible(False) plt.show() @@ -345,17 +349,10 @@ def three_b(): """ museum_grayscale = uz_image.imread_gray('./data/images/museum.jpg', uz_image.ImageType.uint8) - #https://blog.demofox.org/2022/02/26/image-sharpening-convolution-kernels/ # Pa tui na slajdih lepo pise - - kernel = np.array([[-1, -1, -1], - [-1, 17, -1], - [-1, -1,-1]]) - - kernel = kernel * 1./9. - - museo = cv2.filter2D(museum_grayscale, -1, kernel) + museo = uz_image.sharpen_image(museum_grayscale, 1.2) fig, axs = plt.subplots(1, 2) + fig.suptitle('Sharpening operation') axs[0].imshow(museum_grayscale, cmap='gray') axs[0].set(title='Original') axs[1].imshow(museo, cmap='gray') @@ -367,6 +364,8 @@ def three_c(): signal[15:20] = 1.0 fig, axs = plt.subplots(1, 4) + fig.suptitle('Signal manipulation') + axs[0].plot(signal) axs[0].set(title='Original') @@ -392,22 +391,18 @@ def three_d(): and pepper noise. Compare the results with the Gaussian filter for multiple noise intensities and filter sizes. """ - lena = uz_image.imread('./data/images/obama.jpg', uz_image.ImageType.float64) + lena = uz_image.imread('./data/images/lena.png', uz_image.ImageType.float64) lena_grayscale = uz_image.transform_coloured_image_to_grayscale(lena.astype(np.float64)) + # Peppered lena_salt_and_pepper = uz_image.sp_noise(lena_grayscale) - # Depeppered deppepered_lena = uz_image.apply_median_method_2D(lena_salt_and_pepper, 7) # Sharpened - kernel = np.array([[-1, -1, -1], - [-1, 17, -1], - [-1, -1,-1]]) - - kernel = kernel * 1./9. - sharpened_lena = cv2.filter2D(deppepered_lena, cv2.CV_64F, kernel) + sharpened_lena = uz_image.sharpen_image(deppepered_lena,1) fig, axs = plt.subplots(1, 4) + fig.suptitle('Common methods applied over Lena image') axs[0].imshow(lena_grayscale, cmap='gray') axs[0].set(title='Orginal image') diff --git a/assignment2/uz_framework/image.py b/assignment2/uz_framework/image.py index 43835cd..bae6c4d 100644 --- a/assignment2/uz_framework/image.py +++ b/assignment2/uz_framework/image.py @@ -326,6 +326,27 @@ def get_gaussian_kernel(sigma: float): return result / np.sum(result) +def sharpen_image(image: Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]], sharpen_factor=1.0) -> Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]]: + """ + Accepts: image & sharpen factor + + Returns: sharpened image + https://blog.demofox.org/2022/02/26/image-sharpening-convolution-kernels/ <-- sharpening kernel, but also on slides + good explanation + """ + sharpened_image = image.copy() + + KERNEL = np.array([[-1, -1, -1], + [-1, 17, -1], + [-1, -1,-1]]) * 1./9. * sharpen_factor + + if image.dtype.type == np.float64: + sharpened_image = cv2.filter2D(sharpened_image, cv2.CV_64F, KERNEL) + elif image.dtype.type == np.uint8: + sharpened_image = cv2.filter2D(sharpened_image, cv2.CV_8U, KERNEL) + + return sharpened_image + def gaussfilter2D(image: Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]], sigma: float) -> Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]]: """ Accepts: image, sigma @@ -340,10 +361,10 @@ def gaussfilter2D(image: Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]], return filtered_image def simple_median(signal: npt.NDArray[np.float64], width: int): - signal = signal.copy() if width % 2 == 0: raise Exception('No u won\'t do that') + signal = signal.copy() for i in range(len(signal) - int(np.ceil(width/2))): middle_element = int(i + np.floor(width/2)) signal[middle_element] = np.median(signal[i:i+width]) @@ -352,10 +373,10 @@ def simple_median(signal: npt.NDArray[np.float64], width: int): def apply_median_method_2D(image:Union[npt.NDArray[np.float64], npt.NDArray[np.uint8]], width: int): if width % 2 == 0: raise Exception('No u won\'t do that') + image = image.copy() W_HALF = int(np.floor(width/2)) padded_image = np.pad(image, W_HALF, mode='edge') - print(image.shape) IMAGE_HEIGHT = image.shape[0] # y IMAGE_WIDTH = image.shape[1] # x