用图像中的对象定义区域

时间:2019-05-08 08:11:59

标签: python python-2.7

您将建议识别包含图像中对象的最小矩形选择吗?

我有一个3000x4000ish的图像,该图像大部分是普通图像,但其中有一个对象,我想使python自动识别(并承认我的意思是用对象划定区域),然后创建一个“新”图像图像是包含对象的最小矩形选择?

例如,红色轮廓定义了图像,黑色轮廓是对象,蓝色轮廓是我想让python自己识别的新图像。

不幸的是,由于原因,我不能只使用阈值。

Example

1 个答案:

答案 0 :(得分:0)

如果可以使用库PIL(Linux上存在AFAIK,而在Windows上可以获取),那么我可以为您提供两种解决方案: 1.清理,对于4000x3000的图像,需要40秒。

from PIL import Image

im = Image.open('test.png', 'r')

def isHorizontalWhite(y):
    return all([im.getpixel((x,y)) == (255,255,255) for x in range(im.width)])
nonWhiteHorizontals = [y for y in range(im.height) if not isHorizontalWhite(y)]

def isVerticalWhite(x):
    return all([im.getpixel((x, y)) == (255, 255, 255) for y in range(im.height)])
nonWhiteVerticals = [x for x in range(im.width) if not isVerticalWhite(x)]

assert nonWhiteHorizontals or nonWhiteVerticals, "Image seems to be blank"

cropped = im.crop((min(nonWhiteVerticals), min(nonWhiteHorizontals), max(nonWhiteVerticals)+1, max(nonWhiteHorizontals)+1))
cropped.save('edited.png')

此代码的想法很简单:确定不是白色的水平和垂直线,取最小值和最大值,这将定义边界。

  1. 更少的清洁溶液,对于4000x3000图像需要9秒。
im = Image.open('test.png', 'r')
pixels = im.getdata()

def getPixel(x,y):
    return pixels[x + y * im.width]

def isHorizontalWhite(y):
    return all([getPixel(x,y) == (255,255,255) for x in range(im.width)])
nonWhiteHorizontals = [y for y in range(im.height) if not isHorizontalWhite(y)]

def isVerticalWhite(x):
    return all([getPixel(x,y) == (255, 255, 255) for y in range(min(nonWhiteHorizontals), max(nonWhiteHorizontals)+1)])
nonWhiteVerticals = [x for x in range(im.width) if not isVerticalWhite(x)]

assert nonWhiteHorizontals or nonWhiteVerticals, "Image seems to be blank"

cropped = im.crop((min(nonWhiteVerticals), min(nonWhiteHorizontals), max(nonWhiteVerticals)+1, max(nonWhiteHorizontals)+1))
cropped.save('edited.png')

这里完成了两个主要的优化: 首先,我们将所有像素加载到某种类似于列表的结构中并以这种方式访问​​它们,而不是多次访问图像以请求单个像素。 第二,是因为我们知道所有点的x坐标都来自间隔(0, min(nonWhiteVerticals)), (max(nonWhiteVerticals), im.width)之一,所以它们都是白色的,因此在搜索非白色水平线时,我们不需要在全部。

如果我仅对您的问题有更多了解,仍然可以优化此解决方案。例如,在以下情况下可以对算法进行优化:

  1. 我们知道中间的物体很大,因此不会被裁剪太多。
  2. 我们知道对象是一个“整体”(所有非白色像素都相互连接)。

请让我们知道这些算法的性能是否对您足够好。