What is bit-plane slicing?

Bit-plane slicing is a technique used in digital image processing to analyze the individual bits in the pixel values, where each pixel is represented by a binary number, commonly using 8 bits for grayscale images or 24 bits for color images.

The process of bit-plane slicing involves separating and displaying each bit of the pixel values as a separate image. It creates a set of binary images, each corresponding to a single bit of the original pixel values. The most significant bit (MSB) is the leftmost bit, representing the highest order bit; the least significant bit (LSB) is the rightmost bit, representing the lowest order bit.

3-bit grayscale image
3-bit grayscale image

Process

We will use the image below to illustrate the process of bit-plane slicing.

Input image
Input image
  1. Convert to binary: Convert the value of each pixel in the image to its binary representation.

Binary representation of input image
Binary representation of input image
  1. Bit-plane extraction: The number of planes will equal the number of bits used to represent pixel values. Each bit is assigned to a separate plane. The MSB is assigned to the first-bit plane and the LSB to the last-bit plane.

  2. Create bit plane images: Create separate images for each extracted bit plane. These images will be binary, with pixel values of 0 and 1, representing the presence or absence of the corresponding bit in the original pixel values.

Creation of 3 bit planes
Creation of 3 bit planes

Code

Here is how we can implement bit plane-slicing in Python:

import numpy as np
def decimal_to_binary(decimal, num_bits):
# Convert to binary, remove '0b' prefix
binary = bin(decimal)[2:]
# Ensure a fixed width with leading zeros
binary = binary.zfill(num_bits)
return binary
def bit_plane_slicing(image):
num_bits = 3
# Create a list of images for each bit plane
bit_planes = [np.zeros(image.shape, dtype=np.uint8) for _ in range(num_bits)]
# Perform bit-plane slicing
for i in range(num_bits):
# Assign bits from MSB to LSB
bit_value = 2 ** (num_bits - 1 - i)
# Ensure values are 0 or 1
bit_planes[i] = (image & bit_value) >> (num_bits - 1 - i)
return bit_planes
image = np.array([
[3, 7, 1, 5, 4],
[0, 6, 2, 7, 3],
[1, 4, 6, 2, 5],
[7, 0, 3, 1, 4],
[2, 5, 7, 6, 0]
], dtype=np.uint8)
# Convert the image to binary representation
binary_image = np.array([[decimal_to_binary(value, 3) for value in row] for row in image])
# Perform bit-plane slicing
bit_planes = bit_plane_slicing(image)
# Display the bit planes
for i, plane in enumerate(bit_planes):
print(f"Bit Plane {i} (1-bit values):\n")
for row in plane:
print(" ".join([str(value) for value in row]))
print("\n")

Explanation

The decimal_to_binary function takes decimal values and converts them into their binary representation, ensuring a fixed width of 3 bits with leading zeros.

The bit_plane_slicing function creates separate bit planes for the input image. It generates bit planes by shifting the bits in the binary representation. Each resulting bit plane contains 1-bit values (0 or 1), showing the presence or absence of a specific bit in the original pixel values.

Visualization and analysis

It is helpful to break down an image into bit planes first. The first-bit plane shows the big picture, and each subsequent plane adds finer details. This helps us understand which bits carry important information and which contain noise.

Bit-plane slicing can be used to enhance images. For example, focusing on lower-bit planes can reduce noise, while higher planes can emphasize details. It can also be used for compression because we can allocate more bits to important planes, saving space while keeping vital image features intact. Bit plane analysis is an important tool for working with images at different levels of detail.

Copyright ©2024 Educative, Inc. All rights reserved