LPX
cv2
32d1ae3
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)