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