如何过滤图像以丢弃杂散像素?

时间:2019-07-06 02:26:10

标签: image-processing python-imaging-library

我的图像数据主要包含无聊的黑色背景包围的圆形图像。我通过使用PIL的getbbox()抓取边界框,然后进行裁剪来处理此问题。这让我有些满意,但是在无聊的黑色海洋中出现的微小灰色斑点导致getbbox()返回太大的边界框。

附加了故意生成的有问题的图像;请注意右下角的单个深灰色像素。我还包括了一个更典型的“现实世界”图像。

Generated problematic image Real-world image

我在PIL ImageFilter模块中使用UnsharpMask和SHARP和BLUR过滤器做了一些麻烦,但没有成功。

我想扔掉那些杂散的灰色像素并得到一个不错的边框,但又不占用我的图像数据。

1 个答案:

答案 0 :(得分:1)

您要对图像的副本运行中位数过滤器以获取边界框,然后将该边界框应用于原始的,未模糊的图像。所以:

  • 复制您的原始图片
  • 对副本应用中值模糊滤镜-可能为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