我需要以这样的方式拆分蒙版:如果蒙版内存在不一致,则会将其分开。例如,如果我在一只猫上画一个面具,我希望宽的部分(身体)是一个面具,窄的部分(尾巴)是另一个面具。
目前,我有一个连续的面具,其中包括两者猫的身体和尾巴。我想将其分成两个不同的面具。如何使用 Python 实现此目的?
原始掩码
所需掩码
我研究了使用 此 中描述的方法,该方法侧重于多边形分区并将轮廓分成多个三角形。但是,这种方法不适合我的需求,因为我想根据大小和形状分割蒙版,而不是创建多个三角形分区。
可以使用形态学运算和连接组件分析的组合在 Python 中对图像中的蒙版区域进行聚类。以下是如何做到这一点:
import cv2
import numpy as np
# 加载图像并转换为灰度
image = cv2.imread("mask.png", cv2.IMREAD_GRAYSCALE)
# 阈值化图像以创建二进制蒙版
_, mask = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY)
# 执行形态学开运算以去除狭窄连接
kernel = np.ones((5, 5), np.uint8)
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=2)
# 在开运算图像上执行连接组件分析
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(opening, 8, cv2.CV_32S)
# 创建一个列表来存储分割后的蒙版
segmented_masks = []
# 循环遍历每个标签(排除背景)
for label in range(1, num_labels):
# 创建一个新的蒙版,其中包含当前标签
component_mask = (labels == label).astype(np.uint8) * 255
# 将分割后的蒙版添加到列表中
segmented_masks.append(component_mask)
# 显示分割后的蒙版
for i, mask in enumerate(segmented_masks):
cv2.imshow(f"Segmented Mask {i+1}", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
此代码执行以下操作:
- 加载图像并创建一个二进制蒙版。
- 执行形态学开运算。 此操作有助于去除连接更大区域的狭窄连接,例如猫的尾巴和身体之间的连接。
- 执行连接组件分析。 此操作标识图像中的不同连接区域。
- 循环遍历每个连接组件并创建一个新的蒙版。 这将为每个连接区域创建一个单独的蒙版。
可以通过调整形态学内核的大小和开运算的迭代次数来调整此代码以满足的需要。
此方法应该可以帮助根据大小和形状对蒙版进行分割。
标签:python,opencv,image-processing,scikit-learn,cluster-analysis From: 78807317