| """ |
| Preprocessing script for pneumonia consolidation enhancement. |
| This script enhances chest X-ray images to better visualize consolidations, |
| air bronchograms, and subtle patterns necessary for accurate segmentation. |
| """ |
|
|
| import cv2 |
| import numpy as np |
| from pathlib import Path |
| import argparse |
|
|
|
|
| def enhance_consolidation(img_path, output_path=None): |
| """ |
| Enhance chest X-ray image to better visualize pneumonia consolidation. |
| |
| Args: |
| img_path: Path to the input image (JPG/PNG) |
| output_path: Path to save the enhanced image (optional) |
| |
| Returns: |
| Enhanced image as numpy array |
| """ |
| |
| img = cv2.imread(str(img_path), cv2.IMREAD_GRAYSCALE) |
| |
| if img is None: |
| raise ValueError(f"Could not read image from {img_path}") |
| |
| |
| |
| clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8)) |
| enhanced = clahe.apply(img) |
| |
| |
| |
| kernel = np.array([[-1, -1, -1], |
| [-1, 9, -1], |
| [-1, -1, -1]]) |
| sharpened = cv2.filter2D(enhanced, -1, kernel) |
| |
| |
| |
| laplacian = cv2.Laplacian(sharpened, cv2.CV_64F) |
| laplacian = np.uint8(np.absolute(laplacian)) |
| |
| |
| alpha = 0.8 |
| beta = 0.2 |
| result = cv2.addWeighted(sharpened, alpha, laplacian, beta, 0) |
| |
| |
| if output_path: |
| cv2.imwrite(str(output_path), result) |
| print(f"Enhanced image saved to: {output_path}") |
| |
| return result |
|
|
|
|
| def batch_enhance_consolidation(input_dir, output_dir, image_extension='.jpg'): |
| """ |
| Process multiple images in a directory. |
| |
| Args: |
| input_dir: Directory containing input images |
| output_dir: Directory to save enhanced images |
| image_extension: File extension to process (default: .jpg) |
| """ |
| input_path = Path(input_dir) |
| output_path = Path(output_dir) |
| output_path.mkdir(parents=True, exist_ok=True) |
| |
| |
| images = list(input_path.rglob(f"*{image_extension}")) |
| |
| print(f"Found {len(images)} images to process") |
| |
| for img_path in images: |
| try: |
| |
| rel_path = img_path.relative_to(input_path) |
| out_path = output_path / rel_path |
| out_path.parent.mkdir(parents=True, exist_ok=True) |
| |
| |
| enhance_consolidation(img_path, out_path) |
| print(f"Processed: {img_path.name}") |
| |
| except Exception as e: |
| print(f"Error processing {img_path}: {e}") |
| |
| print(f"\nProcessing complete! Enhanced images saved to: {output_path}") |
|
|
|
|
| def create_visualization_comparison(original_path, enhanced_path, output_path): |
| """ |
| Create a side-by-side comparison of original and enhanced images. |
| |
| Args: |
| original_path: Path to original image |
| enhanced_path: Path to enhanced image |
| output_path: Path to save comparison image |
| """ |
| original = cv2.imread(str(original_path), cv2.IMREAD_GRAYSCALE) |
| enhanced = cv2.imread(str(enhanced_path), cv2.IMREAD_GRAYSCALE) |
| |
| |
| if original.shape != enhanced.shape: |
| enhanced = cv2.resize(enhanced, (original.shape[1], original.shape[0])) |
| |
| |
| comparison = np.hstack([original, enhanced]) |
| |
| |
| font = cv2.FONT_HERSHEY_SIMPLEX |
| cv2.putText(comparison, 'Original', (10, 30), font, 1, (255, 255, 255), 2) |
| cv2.putText(comparison, 'Enhanced', (original.shape[1] + 10, 30), font, 1, (255, 255, 255), 2) |
| |
| cv2.imwrite(str(output_path), comparison) |
| print(f"Comparison saved to: {output_path}") |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser( |
| description="Enhance chest X-ray images for pneumonia consolidation segmentation" |
| ) |
| parser.add_argument( |
| '--input', |
| type=str, |
| required=True, |
| help='Input image file or directory' |
| ) |
| parser.add_argument( |
| '--output', |
| type=str, |
| required=True, |
| help='Output file or directory' |
| ) |
| parser.add_argument( |
| '--batch', |
| action='store_true', |
| help='Process entire directory (batch mode)' |
| ) |
| parser.add_argument( |
| '--extension', |
| type=str, |
| default='.jpg', |
| help='Image file extension for batch processing (default: .jpg)' |
| ) |
| |
| args = parser.parse_args() |
| |
| if args.batch: |
| batch_enhance_consolidation(args.input, args.output, args.extension) |
| else: |
| enhance_consolidation(args.input, args.output) |
|
|