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)