|
import cv2 as cv
|
|
import numpy as np
|
|
from PIL import Image
|
|
|
|
def bit_plane_extractor(
|
|
image: Image.Image,
|
|
channel: str = "Luminance",
|
|
bit: int = 0,
|
|
filter_type: str = "Disabled"
|
|
) -> Image.Image:
|
|
"""Extract and visualize a bit plane from a selected channel of the image."""
|
|
img = np.array(image.convert("RGB"))
|
|
if channel == "Luminance":
|
|
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
|
|
elif channel == "RGB Norm":
|
|
b, g, r = cv.split(img.astype(np.float64))
|
|
img = np.sqrt(np.power(b, 2) + np.power(g, 2) + np.power(r, 2)).astype(np.uint8)
|
|
else:
|
|
idx = {"Red": 0, "Green": 1, "Blue": 2}[channel]
|
|
img = img[:, :, idx]
|
|
plane = cv.bitwise_and(np.full_like(img, 2 ** bit), img)
|
|
plane = cv.normalize(plane, None, 0, 255, cv.NORM_MINMAX).astype(np.uint8)
|
|
if filter_type == "Median":
|
|
plane = cv.medianBlur(plane, 3)
|
|
elif filter_type == "Gaussian":
|
|
plane = cv.GaussianBlur(plane, (3, 3), 0)
|
|
return Image.fromarray(plane) |