利用scipy.ndimage.binary_fill_hoses提取标记轮廓的mask-20201025

颜色标记提取
本文介绍了一种基于颜色范围的图像标记提取方法。通过定义特定颜色的阈值,利用Python中的NumPy和SciPy库来创建颜色掩膜(mask),并进一步填充轮廓以完整提取目标区域。

根据刘博记录如何提取标记内的mask,中间是自己的理解过程,可删除精简。

import numpy as np
import matplotlib.pyplot as plt
import skimage.io as io
import scipy

def marker_color(color='yellow'):
    return [255, 242, 0]

img = io.imread('./8_2.png')[...,0:3]
mask1 = np.all(np.array([255, 242, 0]) - 40 < img, axis=-1)
plt.imshow(mask1)
plt.show()
mask2 = np.all(np.array([255, 242, 0]) + 40 > img, axis=-1)
plt.imshow(mask2)
plt.show()
mask = np.logical_and(mask1, mask2)
plt.imshow(mask)
plt.show()
mask = scipy.ndimage.binary_fill_holes(mask)
plt.imshow(mask)
plt.show()

fig,axes = plt.subplots(1,2,figsize=(10,5))
axes[0].imshow(img)
axes[1].imshow(mask, cmap='gray')
plt.show()
io.imsave('tmp.png', mask*255)
### 凸包处理后的图像直接输出方法 在不使用 `scipy.ndimage.binary_fill_holes` 的情况下,直接输出凸包处理后的图像结果可以通过以下方式实现。凸包处理本身是一种形态学操作,其输出结果已经包含了原始图像中所有前景区域的扩展,形成一个近似凸形的区域。在处理完成后,只需将结果换为标准的二值图像格式,即可用于显示或保存。 根据形态学凸包算法的实现逻辑,其最终输出的图像是一个布尔型或 `uint8` 类型的二维数组,其中值为 `1`(或 `255`)的像素表示属于凸包的区域,值为 `0` 的像素表示背景。为了输出该图像,只需将结果数组换为 0-255 的灰度范围,并使用 OpenCV 或其他图像处理库进行显示或保存。 以下是一个示例代码,展示如何在不使用 `binary_fill_holes` 的情况下输出凸包处理后的图像: ```python import numpy as np import cv2 def convex_hull(image): B1 = np.array([[-1, 1, -1], [-1, 1, 0], [-1, -1, -1]]) # 右上 B2 = np.array([[-1, -1, -1], [0, 1, -1], [-1, 1, -1]]) # 右下 B3 = np.array([[-1, -1, -1], [-1, 1, 0], [-1, 1, -1]]) # 左下 B4 = np.array([[-1, 1, -1], [0, 1, -1], [-1, -1, -1]]) # 左上 def shot_nonshot(A, B): A = np.array(A, dtype=np.uint8) B = np.array(B, dtype=np.int8) M, N = A.shape out = np.zeros((M, N), dtype=np.uint8) A_padded = np.pad(A, pad_width=1, mode='constant', constant_values=0) for i in range(M): for j in range(N): match = True for m in range(3): for n in range(3): b_val = B[m, n] a_val = A_padded[i + m, j + n] if b_val == 1 and a_val != 1: match = False break elif b_val == 0 and a_val != 0: match = False break if not match: break if match: out[i, j] = 1 return out def convex(A, B, max_iter=20): X = np.array(A, dtype=np.uint8).copy() for _ in range(max_iter): X_old = X.copy() Xtmp = shot_nonshot(X, B) Xtmp = Xtmp + X_old X = np.array(Xtmp >= 1, dtype=np.uint8) if np.sum(np.abs(X - X_old)) < 1e-6: break return X D1 = convex(image, B1) D2 = convex(image, B2) D3 = convex(image, B3) D4 = convex(image, B4) hull = D1 + D2 + D3 + D4 result = np.array(hull >= 1, dtype=np.uint8) result[result >= 1] = 255 # 换为标准灰度图像格式 return result # 示例用法 if __name__ == "__main__": image_path = '5.tif' binary_image = cv2.imread(image_path, 0) _, binary_image = cv2.threshold(binary_image, 127, 255, cv2.THRESH_BINARY) hull = convex_hull(binary_image) cv2.imshow('Convex Hull', hull) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,`convex_hull` 函数的输出 `result` 是一个二值图像,其中前景像素值为 `1`,背景像素值为 `0`。通过 `result[result >= 1] = 255`,可以将图像换为标准的 0-255 灰度格式,以便于使用 OpenCV 显示或保存。 此外,图像的膨胀操作可用于进一步扩展凸包边缘,以确保边界更加完整,例如使用 `scipy.ndimage.binary_dilation` 进行处理[^1]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值