LPX55's picture
refactor: update import paths for forensics utilities and enhance logging functionality in inference data
bc355a9
raw
history blame
1.01 kB
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)