您将建议识别包含图像中对象的最小矩形选择吗?
我有一个3000x4000ish的图像,该图像大部分是普通图像,但其中有一个对象,我想使python自动识别(并承认我的意思是用对象划定区域),然后创建一个“新”图像图像是包含对象的最小矩形选择?
例如,红色轮廓定义了图像,黑色轮廓是对象,蓝色轮廓是我想让python自己识别的新图像。
不幸的是,由于原因,我不能只使用阈值。
答案 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')
此代码的想法很简单:确定不是白色的水平和垂直线,取最小值和最大值,这将定义边界。
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)
之一,所以它们都是白色的,因此在搜索非白色水平线时,我们不需要在全部。
如果我仅对您的问题有更多了解,仍然可以优化此解决方案。例如,在以下情况下可以对算法进行优化:
请让我们知道这些算法的性能是否对您足够好。