python 填充二值对象孔洞

这篇博客展示了如何使用Python的scikit-image库进行二值图像处理,通过binary_fill_holes函数填充图像中的空洞,同时使用不同大小的结构元素进行实验。它涵盖了从灰度转换到形态学操作,重点在于实际应用和结果可视化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import pylab
from scipy.ndimage.morphology import binary_fill_holes
from skimage.io import imread
from skimage.color import rgb2gray
import matplotlib.pylab as plt
import numpy as np

im = rgb2gray(imread('./9781789343731_Code/images/text.png'))
im[im <= 0.5] = 0
im[im > 0.5] = 1
pylab.gray()
plt.figure(figsize=(20,15))
plt.subplot(221)
plt.imshow(im)
plt.title('original', size=20)
plt.axis('off')
i = 2
for n in [3, 5, 7]:
    plt.subplot(2, 2, i)
    im1 = binary_fill_holes(im, structure=np.ones((n,n)))
    plt.imshow(im1)
    plt.title('binary_fill_holes with structure square side ' + str(n), size=20)
    plt.axis('off')
    i += 1
plt.savefig('text-out.png')
plt.show()

在这里插入图片描述

### 回答1: OpenCV可以使用函数fillPoly来填充图像中的孔洞轮廓。fillPoly函数可以填充多边形区域,使用该函数可以将图像中指定的多边形形状内的像素点颜色填充为指定的灰度或颜色。 使用fillPoly函数填充孔洞轮廓的步骤如下: 1. 首先,需要准备一个与要填充孔洞轮廓相同大小的图像作为掩膜(mask),该图像的像素应初始化为0。 2. 然后,需要将孔洞轮廓的顶点坐标按照顺时针或逆时针的顺序保存在一个numpy数组中。 3. 调用fillPoly函数,将掩膜图像、保存顶点坐标的数组、数组长度作为参数传入。 4. 设置要填充的颜色或灰度。 5. 调用imshow函数显示填充后的图像。 以下是一个示例代码: import numpy as np import cv2 # 创建与原始图像大小一致的掩膜 mask = np.zeros((height, width), dtype=np.uint8) # 定义孔洞轮廓的顶点坐标 contour = np.array([[100, 100], [200, 100], [200, 200], [100, 200]], dtype=np.int32) # 使用fillPoly函数填充孔洞轮廓 cv2.fillPoly(mask, [contour], 255) # 设置填充颜色为白色 color = (255, 255, 255) # 将填充结果显示出来 result = cv2.bitwise_and(image, image, mask=mask) result = cv2.cvtColor(result, cv2.COLOR_BGR2RGB) # 将BGR格式转为RGB格式 cv2.imshow("Filled Image", result) cv2.waitKey(0) cv2.destroyAllWindows() 这样就可以使用OpenCV中的fillPoly函数来实现填充图像中的孔洞轮廓。注意,使用fillPoly填充孔洞轮廓前,需要先创建一个与原始图像大小一致的掩膜图像,并将孔洞轮廓的顶点坐标按照顺时针或逆时针的顺序保存在一个numpy数组中。 ### 回答2: 使用OpenCV填充图中的孔洞轮廓可以通过以下步骤实现: 1. 首先,加载图像并确保图像中只有两个像素0和255(或1和0),其中0代表背景像素,255(或1)代表对象像素。 2. 使用OpenCV的findContours函数找到图像中对象的轮廓。该函数返回边界点的列表。 3. 遍历每个轮廓,使用OpenCV的drawContours函数将轮廓绘制在一个单独的黑色背景图像上。 4. 将绘制轮廓的黑色图像进行化,将轮廓内部的像素设置为255。 5. 在原始的图像上使用bitwise_or函数与上述化的图像进行逻辑或操作。此操作将使用轮廓来填充孔洞。 以下是示例代码: ```python import cv2 import numpy as np # 加载图像 image = cv2.imread('binary_image.png', cv2.IMREAD_GRAYSCALE) # 创建黑色背景图像 filled_image = np.zeros_like(image) # 寻找轮廓 contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓 cv2.drawContours(filled_image, contours, -1, (255), thickness=cv2.FILLED) # 填充后的图像 filled_image = cv2.threshold(filled_image, 1, 255, cv2.THRESH_BINARY)[1] # 逻辑或操作填充孔洞 filled_image = cv2.bitwise_or(image, filled_image) # 显示填充后的图像 cv2.imshow('Filled Image', filled_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码中,我们首先加载图像。然后使用findContours函数找到轮廓,并在黑色背景图像上绘制轮廓。接下来,将绘制轮廓的图像进行化,然后使用bitwise_or函数与原始图像进行逻辑或操作。最后,显示填充后的图像
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值