裁剪图像中的背景-NumPy/Python

裁剪图像中的背景-NumPy/Python,python,numpy,image-processing,numpy-slicing,Python,Numpy,Image Processing,Numpy Slicing,我提取了下面的图像。背景值是170,我需要用最少170个值来提取多边形。 如下图所示 我想有一个处理后的图像如下 我可以实现一个嵌套的for循环并进行迭代,直到找到每行的列的最小索引和列编号的最大索引,然后提取区域。。但是我对一个更有效的解决方案感兴趣方法#1 一种策略是为图像添加标签,获取其中一个角的标签,作为背景色的一个示例,并创建该颜色的遮罩。因此,反转的遮罩区域就是我们要裁剪的区域。对于裁剪,我们将从中获得灵感 下面是实现- import cv2 from scipy.ndimage

我提取了下面的图像。背景值是170,我需要用最少170个值来提取多边形。 如下图所示

我想有一个处理后的图像如下

我可以实现一个嵌套的for循环并进行迭代,直到找到每行的列的最小索引和列编号的最大索引,然后提取区域。。但是我对一个更有效的解决方案感兴趣

方法#1

一种策略是为图像添加标签,获取其中一个角的标签,作为背景色的一个示例,并创建该颜色的遮罩。因此,反转的遮罩区域就是我们要裁剪的区域。对于裁剪,我们将从中获得灵感

下面是实现-

import cv2
from scipy.ndimage import label

im = cv2.imread('xYTKn.png') # read in input image
L,_ = label(im)
mask = (L!=L[0,0]).any(-1)
out = im[np.ix_(mask.any(1), mask.any(0))]
cv2.imwrite('output.png',out)
输入-

输出-


方法#2

另一个类似的策略是先转换为灰度,然后标记并获得所需的遮罩,如下图所示-

gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
L,_ = label(gray)
mask = (L!=L[0,0])
out = im[np.ix_(mask.any(1), mask.any(0))]
标杆管理 我们将在给定的样本图像上计时建议的解决方案。这两种方法的遮罩创建是不同的。因此,我们将仅对这些部分计时-

In [70]: %%timeit
    ...: L,_ = label(im)
    ...: mask = (L!=L[0,0]).any(-1)
47.4 ms ± 2.37 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [71]: %%timeit
    ...: gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    ...: L,_ = label(gray)
    ...: mask = (L!=L[0,0])
2.59 ms ± 20.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)