c073 Ivp Lab8
c073 Ivp Lab8
PART B
Class : C Batch : C1
Date of Grading:
Hadamard
Code
#C073
#Viha Shukla
import numpy as np
import cv2
resized_image = cv2.imread('viha.jpg',
cv2.IMREAD_GRAYSCALE)
if resized_image is None:
else:
def create_hadamard_matrix(n):
hadamard_matrix = np.array([[1]])
for i in range(n):
hadamard_matrix = np.block([[hadamard_matrix,
hadamard_matrix], [hadamard_matrix, -
hadamard_matrix]])
return hadamard_matrix
def matrix_inverse_transform(matrix,
transformed_image):
def normalize_transformed_image(img):
def normalize_inverse_image(img):
n = image.shape[0]
if percentage == 25:
mask[n//2:, n//2:] = 0
mask[n//2:, :] = 0
mask[:n//2, n//2:] = 0
mask[n//2:, :] = 0
def dct2(image):
def idct2(image):
h, w = image.shape
dct_image[i:i+block_size, j:j+block_size] =
dct(dct(block.T, norm='ortho').T, norm='ortho')
return dct_image
# Function for block-wise inverse DCT
h, w = dct_image.shape
idct_image = np.zeros_like(dct_image,
dtype=np.float64)
idct_image[i:i+block_size, j:j+block_size] =
idct(idct(block.T, norm='ortho').T, norm='ortho')
return idct_image
H_matrix = create_hadamard_matrix(8)
image_as_float = resized_image.astype(np.float64)
transformed_hadamard_image =
matrix_transform(H_matrix, image_as_float)
block_dct_4x4 = block_dct(image_as_float, 4)
block_dct_8x8 = block_dct(image_as_float, 8)
hadamard_reconstructed_images = []
dct_reconstructed_images = []
block_dct_reconstructed_4x4 = []
block_dct_reconstructed_8x8 = []
compression_ratios_hadamard = []
compression_ratios_dct = []
compression_ratios_block_dct_4x4 = []
compression_ratios_block_dct_8x8 = []
compression_ratio_hadamard = original_size /
compressed_size_hadamard
compression_ratios_hadamard.append(compression_ratio_
hadamard)
compression_ratio_dct = original_size /
retained_dct_coeffs
compression_ratios_dct.append(compression_ratio_dct)
compression_ratio_block_dct_4x4 = original_size /
retained_block_dct_4x4
compression_ratios_block_dct_4x4.append(compression_ra
tio_block_dct_4x4)
compression_ratio_block_dct_8x8 = original_size /
retained_block_dct_8x8
compression_ratios_block_dct_8x8.append(compression_ra
tio_block_dct_8x8)
# Inverse transformations
# Inverse Hadamard
modified_hadamard_image =
retain_frequencies(transformed_hadamard_image,
percent)
reconstructed_hadamard_image =
matrix_inverse_transform(H_matrix,
modified_hadamard_image)
hadamard_reconstructed_images.append(normalize_invers
e_image(reconstructed_hadamard_image))
# Inverse DCT
modified_dct_image =
retain_frequencies(transformed_dct_image, percent)
reconstructed_dct_image = idct2(modified_dct_image)
dct_reconstructed_images.append(normalize_inverse_imag
e(reconstructed_dct_image))
# Inverse 4x4 Block DCT
modified_block_dct_4x4 =
retain_frequencies(block_dct_4x4, percent)
reconstructed_block_dct_4x4 =
block_idct(modified_block_dct_4x4, 4)
block_dct_reconstructed_4x4.append(normalize_inverse_im
age(reconstructed_block_dct_4x4))
modified_block_dct_8x8 =
retain_frequencies(block_dct_8x8, percent)
reconstructed_block_dct_8x8 =
block_idct(modified_block_dct_8x8, 8)
block_dct_reconstructed_8x8.append(normalize_inverse_im
age(reconstructed_block_dct_8x8))
plt.figure(figsize=(16, 12))
plt.subplot(4, 4, i + 1)
plt.imshow(normalize_transformed_image(retain_frequenci
es(transformed_hadamard_image, percentage)),
cmap='gray')
plt.title(f'Hadamard {percentage}%')
plt.axis('off')
plt.subplot(4, 4, i + 5)
plt.imshow(hadamard_reconstructed_images[i],
cmap='gray')
plt.axis('off')
plt.subplot(4, 4, i + 9)
plt.imshow(normalize_transformed_image(retain_frequenci
es(transformed_dct_image, percentage)), cmap='gray')
plt.title(f'DCT {percentage}%')
plt.axis('off')
plt.subplot(4, 4, i + 13)
plt.imshow(dct_reconstructed_images[i],
cmap='gray')
plt.axis('off')
plt.figure(figsize=(16, 8))
plt.subplot(4, 4, i + 1)
plt.imshow(normalize_transformed_image(retain_frequenci
es(block_dct_4x4, percentage)), cmap='gray')
plt.axis('off')
plt.subplot(4, 4, i + 5)
plt.imshow(block_dct_reconstructed_4x4[i],
cmap='gray')
plt.title(f'Inverse 4x4 Block DCT {percentage}%')
plt.axis('off')
plt.figure(figsize=(16, 8))
plt.subplot(4, 4, i + 1)
plt.imshow(normalize_transformed_image(retain_frequenci
es(block_dct_8x8, percentage)), cmap='gray')
plt.axis('off')
plt.subplot(4, 4, i + 5)
plt.imshow(block_dct_reconstructed_8x8[i],
cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
B.4 Conclusion:
The study demonstrated that both Hadamard and DCT transforms are
valuable tools for image processing, each with unique strengths. However,
DCT is generally preferable for high-quality compression, as it better
preserves visual fidelity while minimizing data size. The Hadamard transform
can still be useful in specific applications, particularly where computational
efficiency is critical. Future work could investigate the potential benefits of
combining both methods to leverage their respective advantages for
improved image processing outcomes.
************************