我提取了以下图像。背景值为170,我需要提取至少包含170个值的多边形。因为图片如下
我希望具有如下处理的图像
我可以实现一个嵌套的for循环,并进行迭代,直到找到该列的最小索引并为每一行找到该列号的最大索引,然后提取区域。。但是我对numpy查询更有效的解决方案感兴趣
方法#1
一种策略是标记图像,获得一个角的标签,作为背景颜色的一个样本,并创建该颜色的蒙版。因此,倒置遮罩区域是我们要裁剪的区域。对于裁剪,我们将从Crop black border of image using NumPy : Answer post
中获得启发。
这里是实现-
Crop black border of image using NumPy : Answer post
输入-
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))]