基于python的去除图像内部填充

1 代码功能

该代码实现了一个图像处理的功能,具体来说是去除图像内部填充(或更准确地说,是提取并显示图像中轮廓的外围区域,而忽略内部填充)。以下是该功能的详细步骤:

  1. 读取图像 :使用cv2.imread()函数从指定路径image_path读取图像。如果图像无法加载(例如,文件不存在或路径错误),则打印错误消息并返回。

  2. 转换为灰度图像 :通过cv2.cvtColor()函数将图像从BGR颜色空间转换为灰度图像。这是边缘检测前的必要步骤,因为边缘检测通常在灰度图像上执行。

  3. 应用边缘检测 :使用cv2.Canny()函数对灰度图像进行Canny边缘检测。Canny边缘检测是一种流行的边缘检测算法,它通过计算图像梯度的局部最大值来检测边缘。这里设置了两个阈值(100和200),用于控制边缘检测的灵敏度。

  4. 查找轮廓 :通过cv2.findContours()函数在边缘检测后的图像中查找轮廓。这里使用了cv2.RETR_EXTERNAL标志,表示只检索最外层的轮廓,忽略轮廓内部的洞或轮廓上的其他轮廓。

  5. 创建掩膜 :创建一个与灰度图像形状相同但全为黑色的图像(即掩膜)。然后,使用cv2.drawContours()函数在掩膜上绘制找到的轮廓,轮廓内的区域被设置为白色(255)。

  6. 应用掩膜到原图 :由于掩膜是灰度图像(单通道),而原图是BGR图像(三通道),因此需要将掩膜转换为三通道图像(使用cv2.cvtColor())。然后,使用cv2.bitwise_and()函数将掩膜应用到原图上,以提取轮廓外围的区域,忽略内部填充。

  7. 显示结果 :使用matplotlib的plt.imshow()函数显示原始图像、掩膜和结果图像。由于matplotlib默认以RGB格式显示图像,而OpenCV以BGR格式读取图像,因此在显示之前需要将图像从BGR转换为RGB。

最终,这段代码会显示三个图像:原始图像、掩膜(仅显示轮廓)和结果图像(只包含原始图像中轮廓外围的区域)。这可以用于去除图像中不需要的内部细节,只保留轮廓和轮廓外的区域。

2 代码

python 复制代码
import cv2  
import numpy as np  
import matplotlib.pyplot as plt  
  
def remove_interior_fill(image_path):  
    # 1. 读取图像  
    img = cv2.imread(image_path)  
    if img is None:  
        print(f"Error: Unable to load image at {image_path}")  
        return  
  
    # 2. 转换为灰度图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
      
    _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) 
    gray = cv2.equalizeHist(gray)
    # 3. 应用边缘检测  
    edges = cv2.Canny(gray, 100, 200)  
  
    # 4. 查找轮廓  
    contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  
  
    # 5. 创建掩膜  
    mask = np.zeros_like(gray)  
    cv2.drawContours(mask, contours, -1, 255, -1)  
  
    # 6. 应用掩膜到原图  
    # 注意:我们需要将掩膜扩展到原始图像的通道数  
    mask_3ch = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)  
    result = cv2.bitwise_and(img, mask_3ch)  
  
    # 显示结果  
    plt.figure(figsize=(12, 4))  
    plt.subplot(1, 3, 1)  
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 转换为RGB以正确显示颜色  
    plt.title('Original')  
    plt.axis('off')  
  
    plt.subplot(1, 3, 2)  
    plt.imshow(cv2.cvtColor(mask_3ch, cv2.COLOR_BGR2RGB))  # 同样转换为RGB  
    plt.title('Mask')  
    plt.axis('off')  
  
    plt.subplot(1, 3, 3)  
    plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))  
    plt.title('Result')  
    plt.axis('off')  
  
    plt.show()  
  
# 使用示例  
image_path = 'input.jpg'  
remove_interior_fill(image_path)

3 运行结果

图 3-1 运行结果

相关推荐
Elastic 中国社区官方博客几秒前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
组合缺一几秒前
Solon AI (Java) v3.9 正式发布:全能 Skill 爆发,Agent 协作更专业!仍然支持 java8!
java·人工智能·ai·llm·agent·solon·mcp
哈__2 分钟前
CANN: AI 生态的异构计算核心,从架构到实战全解析
人工智能·架构
B站_计算机毕业设计之家3 分钟前
豆瓣电影推荐系统 | Python Django Echarts构建个性化影视推荐平台 大数据 毕业设计源码 (建议收藏)✅
大数据·python·机器学习·django·毕业设计·echarts·推荐算法
MSTcheng.5 分钟前
【C++】C++11新特性(二)
java·开发语言·c++·c++11
熊猫钓鱼>_>5 分钟前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端
晓13137 分钟前
第七章 【C语言篇:文件】 文件全面解析
linux·c语言·开发语言
愚者游世7 分钟前
Delegating Constructor(委托构造函数)各版本异同
开发语言·c++·程序人生·面试·改行学it
想你依然心痛8 分钟前
ModelEngine·AI 应用开发实战:从智能体到可视化编排的全栈实践
人工智能·智能体·ai应用·modelengine
小镇敲码人9 分钟前
探索华为CANN框架中的ACL仓库
c++·python·华为·acl·cann