Как отфильтровать изображение, чтобы выбрасывать случайные пиксели? - PullRequest
1 голос
/ 06 июля 2019

У меня есть данные изображения, которые содержат в основном округлые изображения, окруженные скучным черным фоном. Я справляюсь с этим, захватывая ограничивающий прямоугольник с помощью getbbox () PIL, а затем обрезаю его. Это доставляет мне некоторое удовлетворение, но крошечные серые пятна в море скучного черного заставляют getbbox () возвращать слишком большие ограничивающие рамки.

Прилагается намеренно сгенерированное проблемное изображение; обратите внимание на один темно-серый пиксель в правом нижнем углу. Я также включил более типичный образ "реального мира".

Сгенерировано проблемное изображение Реальное изображение

Я немного поработал с фильтрами UnsharpMask, SHARP и BLUR в модуле PIL ImageFilter, но безуспешно.

Я хочу выбросить эти паразитные серые пиксели и получить красивую ограничивающую рамку, но без потери данных моего изображения.

1 Ответ

1 голос
/ 06 июля 2019

Вы хотите запустить фильтр медиана для копии вашего изображения, чтобы получить ограничивающий прямоугольник, а затем применить этот ограничивающий прямоугольник к исходному не размытому изображению. Итак:

  • Скопируйте исходное изображение
  • применить медианный фильтр размытия к копии - вероятно, 5x5 в зависимости от размера пятнышка
  • получить ограничительную рамку
  • применить ограничивающую рамку к исходному изображению.

Вот код, с которого можно начать:

#!/usr/local/bin/python3

import numpy as np
from PIL import Image, ImageFilter

# Load image 
im = Image.open('eye.png').convert('L')
orig = im.copy()    # Save original

# Threshold to make black and white
thr = im.point(lambda p: p > 128 and 255)
# Following line is just for debug
thr.save('result-1.png')

# Median filter to remove noise
fil = thr.filter(ImageFilter.MedianFilter(3))
# Following line is just for debug
fil.save('result-2.png')

# Get bounding box from filtered image
bbox = fil.getbbox()

# Apply bounding box to original image and save
result = orig.crop(bbox)
result.save('result.png')

enter image description here

...