abdo
abdo
By:
Abdelrahman Mohamed Abdelaty
Youssef Bahy Youssef
Explanation of Work:
The code performs image compression using Discrete Cosine
Transform (DCT). It compresses an input image by applying DCT to
its color components (Red, Green, Blue), truncating coefficients,
and then reconstructing the image from the compressed
coefficients. The compression level is controlled by the parameter
m, which determines the number of coefficients retained in each
8x8 DCT block. The compression process is performed for different
values of m, and the compression ratio and Peak Signal-to-Noise
Ratio (PSNR) are calculated to evaluate the compression
performance.
Results and Answers to Questions:
• Image Components Visualization: The code visualizes the
individual color components (Blue, Green, Red) of the input
image.
Results and Answers to Questions:
• Comparison of Original and Decompressed Images: The code
compares the original image with the decompressed images for
different compression levels (m values).
Results and Answers to Questions:
Results and Answers to Questions:
Results and Answers to Questions:
Results and Answers to Questions:
patch_size = 8
dct_blocks = np.zeros_like(padded)
for i in range(0, h_pad, patch_size):
for j in range(0, w_pad, patch_size):
dct_blocks[i:(i + m), j:(j + m)] = dct2(padded[i:(i + patch_size), j:(j + patch_size)], m)
return decompressed
def calculate_PSNR(original, decompressed):
mse = np.mean((original - decompressed) ** 2)
peak = 255 # Peak value for uint8 image
psnr = 10 * np.log10((peak ** 2) / mse)
return psnr
# Read the input image and extract color components
image = cv2.imread('pictures/original_image.png')
b, g, r = cv2.split(image)
# original_image_path
original_image_path = 'image1.png'
# Display individual color components
plt.figure(figsize=(10, 4))
plt.subplot(1, 3, 1)
plt.imshow(b, cmap='Blues')
plt.title('Blue Component')
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(g, cmap='Greens')
plt.title('Green Component')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(r, cmap='Reds')
plt.title('Red Component')
plt.axis('off')
plt.savefig('pictures/image_components.png')
plt.show()
• # Plot PSNR against m
• psnr_values = []
• m_values = [1, 2, 3, 4]
• for m in m_values:
• compressed_r = compress_DCT(r.astype(np.float64), m)
• compressed_g = compress_DCT(g.astype(np.float64), m)
• compressed_b = compress_DCT(b.astype(np.float64), m)
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 2, 2)
decompressed_image = np.clip(decompressed_image, 0, 255).astype(np.uint8)
plt.imshow(cv2.cvtColor(decompressed_image, cv2.COLOR_BGR2RGB))
plt.title(f'Decompressed Image (m={m})')
plt.axis('off')
plt.savefig(f'pictures/compare_results/Original_Decompressed (m={m}).png')
# decompressed_image.save(f'Decompressed Image (m={m})')
cv2.imwrite(f'pictures/decompressed_images/decompressed_image_m{m}.png', decompressed_image)
plt.show()
original_size = os.path.getsize('pictures/original_image.png')
image_size = []
image_compression_ratio = []
image_size.append(original_size)
image_compression_ratio.append(1)
for i in range(1, 5, 1):
compressed_image_path = f'pictures/compressed_images/compressed_image_m{i}.png'
compressed_size = os.path.getsize(compressed_image_path)
compression_ratio = original_size / compressed_size
image_size.append(compressed_size)
image_compression_ratio.append(compression_ratio)
data = {
'size': image_size,
'compression ratio': image_compression_ratio
}
original_size = os.path.getsize('pictures/original_image.png')
image_size = []
image_compression_ratio = []
image_size.append(original_size)
image_compression_ratio.append(1)
for i in range(1, 5, 1):
compressed_image_path = f'pictures/compressed_images/compressed_image_m{i}.png'
compressed_size = os.path.getsize(compressed_image_path)
compression_ratio = original_size / compressed_size
image_size.append(compressed_size)
image_compression_ratio.append(compression_ratio)
data = {
'size': image_size,
'compression ratio': image_compression_ratio
}
df = pd.DataFrame.from_dict(data)
df.index=["original image", "decompressed image (m=1)", "decompressed image (m=2)", "decompressed image (m=3)", "decompressed image (m=4)"]
# df.head()
# Plot DataFrame
plt.figure(figsize=(8, 6))
df.plot(kind='bar', rot=45)
plt.title('Image Size and Compression Ratio')
plt.xlabel('Image')
plt.ylabel('Value')
plt.tight_layout()