去除图像周围的0像素,调整大小

在做分割任务时,经常需要处理图像,如果图像周围有一圈0像素,需要去除掉,重新调整大小

数组的处理

如果图像的最外一圈为0,我们将图像最外圈的图像0去除掉。

import numpy as np

def remove_outer_zeros(arr):
    # 获取数组的行数和列数
    rows, cols = arr.shape

    # 检查最外层是否存在0
    top_row_zero = np.all(arr[0, :] == 0)
    bottom_row_zero = np.all(arr[-1, :] == 0)
    left_col_zero = np.all(arr[:, 0] == 0)
    right_col_zero = np.all(arr[:, -1] == 0)

    # 如果最外层有0,将其去除
    if top_row_zero:
        arr = arr[1:, :]
    if bottom_row_zero:
        arr = arr[:-1, :]
    if left_col_zero:
        arr = arr[:, 1:]
    if right_col_zero:
        arr = arr[:, :-1]

    return arr

# 测试
a = np.array([[0,0,0,0,0,0],[0,1,2,0,3,0],[0,2,0,3,6,0],[0,0,5,6,13,0],[0,5,8,0,0,0],[0,0,0,0,0,0]])
new_arr = remove_outer_zeros(a)
print(a)
print(new_arr)

[[ 0  0  0  0  0  0]
 [ 0  1  2  0  3  0]
 [ 0  2  0  3  6  0]
 [ 0  0  5  6 13  0]
 [ 0  5  8  0  0  0]
 [ 0  0  0  0  0  0]]
[[ 1  2  0  3]
 [ 2  0  3  6]
 [ 0  5  6 13]
 [ 5  8  0  0]]

 灰度图像的处理

 如果我们处理的图像为灰度图像

import numpy as np
from PIL import Image
from matplotlib import pyplot as plt


def remove_outer_zeros(image_path):
    # 打开图像
    img = Image.open(image_path)
    pixels = img.load()

    # 获取图像的尺寸
    width, height = img.size

    # 寻找最外层全为0的行和列
    top, bottom, left, right = 0, height, 0, width

    for i in range(height):
        if all(pixels[x, i] == 0 for x in range(width)):
            top = i + 1
        else:
            break

    for i in range(height - 1, -1, -1):
        if all(pixels[x, i] == 0 for x in range(width)):
            bottom = i
        else:
            break

    for i in range(width):
        if all(pixels[i, y] == 0 for y in range(height)):
            left = i + 1
        else:
            break

    for i in range(width - 1, -1, -1):
        if all(pixels[i, y] == 0 for y in range(height)):
            right = i
        else:
            break

    # 剪裁图像
    cropped_img = img.crop((left, top, right, bottom))
    cropped_img = np.array(cropped_img)

    return cropped_img


# 调用函数
image_path = r"D:\BaiduNetdiskDownload\DRIVE\DRIVE\training\mask\21_training_mask.gif"

img = np.array(Image.open(image_path))
cropped_img = remove_outer_zeros(image_path)

print(img.shape)
print(cropped_img.size )

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']# 创建一个包含四个子图的画布
# 创建一个包含四个子图的画布
fig, axes = plt.subplots(1, 2)

# 第一张子图:原始图像
axes[0].imshow(img)
axes[0].set_title('原始图像')
axes[0].axis('off')

# 第二张子图:插值后的图像
axes[1].imshow(cropped_img)
axes[1].set_title('裁剪后图像')
axes[1].axis('off')
# 调整布局,防止标题重叠
plt.tight_layout()

# 展示图像
plt.show()


# # 保存新的图像
# new_image.save("new_image.gif")

彩色图像的处理 

这是我们的原始图像 大小为(299,200,3)

 

 我们将原始图像扩充50个0像素后的图像

from PIL import Image, ImageOps
import numpy as np

def expand_image(image_path, padding):
    # 打开图像
    image = Image.open(image_path)
    
    # 获取图像原始尺寸
    width, height = image.size
    
    # 创建一个新的图像,包含原图像和指定大小的填充
    new_width = width + 2 * padding
    new_height = height + 2 * padding
    expanded_image = Image.new("RGB", (new_width, new_height), color=(0, 0, 0))
    
    # 将原图像粘贴到新图像的中间
    expanded_image.paste(image, (padding, padding))
    
    return expanded_image

# 图像路径
image_path = r"D:\My Data\Figure\下载.jpg"
# 填充大小
padding = 50

# 扩充图像
expanded_image = expand_image(image_path, padding)

# 保存扩充后的图像
output_path = r"D:\My Data\Figure\扩充.jpg"
expanded_image.save(output_path)

# 提示保存成功
print("扩充后的图像已保存到:", output_path)

扩充后的图像,大小为(399, 300, 3)

 然后我们处理扩充后的图像,去掉周围的0像素。

import numpy as np
from PIL import Image
from matplotlib import pyplot as plt


def trim_image(image_path):
    # 打开图像
    image = Image.open(image_path)

    # 转换为numpy数组
    image_array = np.array(image)

    # 找到非零像素的边界
    non_zero_indices = np.nonzero(image_array)
    min_row = np.min(non_zero_indices[0])
    max_row = np.max(non_zero_indices[0])
    min_col = np.min(non_zero_indices[1])
    max_col = np.max(non_zero_indices[1])

    # 裁剪图像
    cropped_image_array = image_array[min_row:max_row + 1, min_col:max_col + 1]

    # 将裁剪后的数组转换为图像
    #cropped_image = Image.fromarray(cropped_image_array)
    cropped_image = np.array(cropped_image_array)

    return cropped_image

# 图像路径
image_path = r"D:\My Data\Figure\扩充.jpg"


image = np.array(Image.open(image_path))
# 调用函数裁剪图像
cropped_image = trim_image(image_path)


print(image.shape)
print(cropped_image.shape)

# 显示裁剪后的图像和原图像
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimSun']# 创建一个包含四个子图的画布
# 创建一个包含四个子图的画布
fig, axes = plt.subplots(1, 2)

# 第一张子图:原始图像
axes[0].imshow(image)
axes[0].set_title('原始图像')
axes[0].axis('off')

# 第二张子图:插值后的图像
axes[1].imshow(cropped_image)
axes[1].set_title('去除周围的0像素')
axes[1].axis('off')

# 调整布局,防止标题重叠
plt.tight_layout()

# 展示图像
plt.show()

 去除后的图像大小为(304, 208, 3), 可见我们确实将周围的0像素去除掉了,但是周围还是有黑边,说明去掉的还是不够好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/562290.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑缺失d3dcompiler_43.dll如何修复?多种修复dll问题的有效方法分享

当用户尝试在个人计算机上运行特定的软件游戏时,系统弹出了一条错误提示信息,明确指出“d3dcompiler_43.dll”文件缺失。这个动态链接库文件(dll)是Direct3D编译器的重要组成部分,对于许多基于Windows操作系统的应用程序,尤其是那…

数据库mysql提权四种烧姿势--UDF反弹启动项MOF

免责声明:本问仅做技术交流与学习,请知法守法,不要乱搞等等 目录 前提条件 如何获取最高权限的密码? 一.UDF提权 利用条件: 信息收集 1-看有无plugin目录 2-开启外链 3-开启外连后,MSF启动~ 4-navicat--利用导出的.dll执行命令 利用原理: 执行命令: 二.反弹提权 …

B2024 输出浮点数 洛谷题单

首选需要进行了解的就是%a.bf所代表的含义就行了,直接莽了,没啥解释的笑脸🙄 在 Python 中,%a.bf 中的参数 a 和 b 是用来格式化浮点数的输出的,具体含义如下: a 表示总输出宽度,包括小数点、…

Pytorch入门实战: 06-VGG-16算法-Pytorch实现人脸识别

第P6周:VGG-16算法-Pytorch实现人脸识别 🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍖 原作者:K同学啊 🏡 我的环境: 语言环境:Python3.8 编译器:Jupyter La…

​​​​​​​iOS配置隐私清单文件App Privacy Configuration

推送到TestFlight后邮件收到警告信息如下,主要关于新的隐私政策需要补充: Hello, We noticed one or more issues with a recent submission for TestFlight review for the following app: AABBCC Version 10.10.10 Build 10 Although submission for …

堆的概念、堆的向下调整算法、堆的向上调整算法、堆的基本功能实现

目录 堆的介绍 堆的概念 堆的性质 堆的结构 堆的向下调整算法 基本思想(以建小堆为例) 代码 堆的向上调整算法 基本思想(以建小堆为例) 代码 堆功能的实现 堆的初始化 HeapInit 销毁堆 HeapDestroy 打印堆 HeapPrint …

Linux配置腾讯云yum源(保姆级教学)

1. 备份原有的 yum 源配置文件 例如: mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2. 下载腾讯云的 yum 源配置文件 例如: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/…

28.组件事件配合v-model使用

组件事件配合v-model使用 如果是用户输入&#xff0c;我们希望在获取数据的同时发送数据配合v-model来使用 <template><div><h3>ComponentA</h3><ComponentB some-event"getHandle" /><p>ComponentA接受的数据&#xff1a;{{ m…

【Linux文件系统开发】认知篇

【Linux文件系统开发】认知篇 文章目录 【Linux文件系统开发】认知篇一、文件系统的概念二、文件系统的种类&#xff08;文件管理系统的方法&#xff09;三、分区四、文件系统目录结构五、虚拟文件系统&#xff08;Virtual File System&#xff09;1.概念2.原因3.作用4.总结 一…

排序 “叁” 之交换排序

目录 1. 基本思想 2.冒泡排序 2.1 基本思想 2.2 代码示例 2.3 冒泡排序的特性总结 3.快速排序 3.1 基本思想 &#x1f335;hoare版本 &#x1f335;挖坑法 ​编辑 &#x1f335;前后指针版本 ​编辑 3.2 快速排序优化 &#x1f33b;三数取中法选key 3.4 快速排序…

HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程

HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程 &#x1f4cd;相关篇《HAL STM32 I2C方式读取MT6701磁编码器获取角度例程》&#x1f4cc;当前最新MT6701数据手册&#xff1a;https://www.magntek.com.cn/upload/MT6701_Rev.1.8.pdf&#x1f4dc;SSI协议读角度&#xff…

flutter 实现表单的封装包含下拉框和输入框

一、表单封装组件实现效果 //表单组件 Widget buildFormWidget(List<InputModel> formList,{required GlobalKey<FormState> formKey}) {return Form(key: formKey,child: Column(children: formList.map((item) {return Column(crossAxisAlignment: CrossAxisAlig…

4月21日Linux运维用户相关的添加,分组,修改权限等shell脚本开发第一天

4月21日运维用户相关的添加&#xff0c;分组&#xff0c;修改权限等shell脚本开发第一天 第一天主要实现前2个功能 ​ 主要卡在了&#xff1a; 正确的写法如下&#xff0c;注意[]中的空格&#xff0c;要求很严格&#xff01;&#xff01;&#xff01; #!/bin/bash # 先查看已…

LIUNX系统编程:文件系统

目录 1.创建文件的本质 1.1目录本身也是一个文件&#xff0c;也有他自己的inode 1.2LINUX创建文件&#xff0c;一定是在目录中创建文件。 2.重谈文件的增删查改 2.1为什目录没有写权限&#xff0c;就不能新建文件。 2.2.文件的查找 3.路径 3.1挂载 3.2如何理解挂载 1.创…

【QT学习】8.qt事件处理机制,事件过滤器,自定义事件

1.qt事件处理机制 事件处理&#xff1a; 当用户移动鼠标的时候 &#xff0c;创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去&#xff0c;事件管理器 从队列中 取出事件&#xff0c;然后 调用其对应的事件处理函数。 多态机制&#xff1a; &#x…

2023年图灵奖颁发给艾维·维格森(Avi Wigderson),浅谈其计算复杂性理论方面做出的重要贡献

Avi Wigderson是一位以色列计算机科学家&#xff0c;他在计算复杂性理论方面做出了重要的贡献&#xff0c;并对现代计算产生了深远的影响。 Wigderson的主要贡献之一是在证明计算复杂性理论中的基本问题的困难性方面。他证明了许多经典问题的困难性&#xff0c;如图论中的图同构…

Day08React——第八天

useEffect 概念&#xff1a;useEffect 是一个 React Hook 函数&#xff0c;用于在React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff0c;比如发送AJAx请求&#xff0c;更改daom等等 需求&#xff1a;在组件渲染完毕后&#xff0c;立刻从服务器获取频道列表数据…

每天五分钟机器学习:神经网络模型参数的选择

本文重点 在深度学习和人工智能的浪潮中,神经网络作为其中的核心力量,发挥着举足轻重的作用。然而,神经网络的性能并非一蹴而就,而是需要经过精心的参数选择和调优。 神经网络由大量的神经元组成,每个神经元之间通过权重进行连接。这些权重,以及神经元的偏置、激活函数…

Adobe Acrobat PDF 2024

Adobe Acrobat PDF 2024正式发布&#xff01;支持Windows和macOS系统&#xff0c;新界面做了轻微调整。 下载地址 Windows客户端&#xff1a;https://www.123pan.com/s/f43eVv-GKZKd.html macOS客户端&#xff1a;https://www.123pan.com/s/f43eVv-PKZKd.html

idea在controller或者service使用ctrl+alt+b进入方法后,如何返回到 进入前的那一层

idea在controller或者service使用ctrlaltb进入方法后&#xff0c;如何返回到进入方法的最外层 解决方案使用 ctrlalt ← /→← /→ 键盘上的左右键盘