Black Border Autocrop
SkillMediaCrops uninformative black or dark borders from images by deriving a binary mask from the grayscale channel and trimming rows/columns.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Black Border Autocrop skill
What this skill tells your AI
The instructions your AI receives, as published by wenmin-wu/ds-skills in skills/cv/black-border-autocrop/SKILL.md and read by ahel’s review.
Overview
Medical images (retinal scans, X-rays), scanned documents, and padded photos often have large black or dark borders that waste resolution and confuse models. This technique converts to grayscale, thresholds to find informative pixels, then crops to the bounding box of non-dark content. Works on both grayscale and multi-channel images, applying the same mask consistently across all channels.
Quick Start
import numpy as np
import cv2
def autocrop_black_border(img, tol=7):
"""Crop dark borders from an image.
Args:
img: (H, W) or (H, W, C) numpy array
tol: pixel intensity threshold (0-255); below this is "dark"
Returns:
cropped image
"""
if img.ndim == 2:
mask = img > tol
return img[np.ix_(mask.any(1), mask.any(0))]
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
mask = gray > tol
rows = mask.any(1)
cols = mask.any(0)
if not rows.any():
return img # entirely dark — return original
return img[np.ix_(rows, cols)]
# Usage
img = cv2.imread("scan.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cropped = autocrop_black_border(img, tol=7)
cropped = cv2.resize(cropped, (512, 512))
Workflow
- Convert color image to grayscale
- Create binary mask: pixels > threshold are "content"
- Find rows/columns that contain any content pixels
- Crop to the bounding box of content rows/columns
- Resize cropped image to target dimensions
Key Decisions
- tol: 7 for near-black borders; increase (20-30) for dark-gray borders
- Safety check: Return original if mask is empty (image too dark)
- Before resize: Always crop before resize to maximize effective resolution
- Multi-channel: Apply grayscale mask to all channels uniformly via
np.ix_
References
Signals
- GitHub stars
- 60
- Forks
- 4
- Last commit
- Apr 2026
Advanced
- Catalog kind
- skill
- Gateway key
cv-black-border-autocrop- Source
- github.com/wenmin-wu/ds-skills