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

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

数组的处理

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

import numpy as npdef remove_outer_zeros(arr):# 获取数组的行数和列数rows, cols = arr.shape# 检查最外层是否存在0top_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 pltdef 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, widthfor i in range(height):if all(pixels[x, i] == 0 for x in range(width)):top = i + 1else:breakfor i in range(height - 1, -1, -1):if all(pixels[x, i] == 0 for x in range(width)):bottom = ielse:breakfor i in range(width):if all(pixels[i, y] == 0 for y in range(height)):left = i + 1else:breakfor i in range(width - 1, -1, -1):if all(pixels[i, y] == 0 for y in range(height)):right = ielse: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 npdef expand_image(image_path, padding):# 打开图像image = Image.open(image_path)# 获取图像原始尺寸width, height = image.size# 创建一个新的图像,包含原图像和指定大小的填充new_width = width + 2 * paddingnew_height = height + 2 * paddingexpanded_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 pltdef 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像素去除掉了,但是周围还是有黑边,说明去掉的还是不够好。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纠正对CAN的错误认识

STM32CUBEMX系列——CAN通讯的配置_stm32cubemx 配置103 can-CSDN博客 STM32之CAN通信_stm32 can通信-CSDN博客 在回环模式下,发送的数据帧会在控制器内部被立即接收,而不会通过总线传播到其他节点。这种模式可以确保在没有其他节点干扰的情况下&#…

AI边缘计算盒子+ThingSense管理平台,推动明厨亮灶智慧监管新篇章

背景随着“互联网”时代的浪潮汹涌而至,国家及各地政府纷纷在“十四五”规划中明确指出,强化食品安全管理,利用技术手段实现智慧监管是刻不容缓的任务。为此,各地正加速推进“互联网明厨亮灶”的建设步伐,实现系统对接…

C# 使用 ThoughtWorks.QRCode 生成二维码

目录 关于 ThoughtWorks.QRCode 开发运行环境 方法设计 代码实现 调用示例 Logo图标透明化 小结 关于 ThoughtWorks.QRCode 二维码是用某种特定的几何图形按一定规律在平面分布的、黑白相间的、记录数据符号信息的图形,在应用程序开发中也被广泛使用&#x…

vue+node使用RSA非对称加密,实现登录接口加密密码

背景 登录接口,密码这种重要信息不可以用明文传输,必须加密处理。 这里就可以使用RSA非对称加密,后端生成公钥和私钥。 公钥:给前端,公钥可以暴露出来,没有影响,因为公钥加密的数据只有私钥才…

不同分辨率下搜狗输入法输入图标过大

现象 笔记本是2k屏外接1080p显示器,分辨率不同导致搜狗输入法在笔记本显示器上显示正常,而在1080p显示器下图标很大过大,一打字就显得很尴尬。 解决 找到以上三个可执行文件,分别右键打开属性-->兼容性-->更改高DPI设置 按…

安装nvm管理node版本

准备工作 卸载电脑上原有的nodejs,卸载后确保相关的文件夹也删除掉,否则会在nvm安装成功后管理node版本时造成冲突,例如执行nvm use 20.5.0时报exit status 145的错误。原本就没有安装过node的不用管 一、nvm的安装及使用 1、下载nvm&…

SS-Net复现

表1 8 labeled 样本复现结果–Dice:88.540501,Jaccard:79.60452,95HD:7.58588897,误差在可接受范围内 表2 7 labeled 样本复现结果–Dice:86.778431,Jaccard:77.665895&…

算法思想总结:栈

一、栈的经典应用:波兰表达式与逆波兰表达式 我们平时看到的 12*(3-4*5)6/7 叫做中缀表达式,平时我们习惯用这个计算的原因是我们可以整体地去看到这个表达式并且清楚地知道各个运算符的优先级,但是计算机并不一定知道…

微信小程序四(全局配置和页面配置页面跳转)

全局配置: 小程序根目录下的 app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等 tabBar设置:最少两个最多5个 "tabBar": {"list":[{"pagePath": &qu…

“饕餮之路:贪吃蛇编程精粹“

目录 前言 1.写代码前的预准备 1.1修改控制台 1.2相关WinAPI32知识学习 1.2.1WinAPI32介绍 1.2.2 mode 命令 1.2.3 title 命令 1.2.4COORD 1.2.5GetStdHandle 1.2.6对控制台光标进行设置 1.2.6.1GetConsolrCursorInfo 1.2.6.2 CONSOLE_CURSOR_INFO 1.2.6.3SetConsol…

vos3000外呼系统客户端无法安装如何解决?

如果 VOS3000 外呼系统客户端无法安装,可以尝试以下解决方法: 检查系统要求: 确保你的计算机满足 VOS3000 外呼系统客户端的系统要求,包括操作系统版本、内存、处理器等。如果系统不符合要求,可能会导致安装失败或者运…

c语言中,数组取地址的书写格式

数组取地址 为了更好的区分数组取地址时的情况,我们建立两个数组,arr1一维数组和arr2二维数组,用printf函数来打印出每个例子arr1和arr2的地址,这样可以更加直观的区分出来。 首先我们看到第一组打印,可以看到若是直接…

Qt图片等资源管理

Qt的图片等资源管理通常有两种方式 1,直接将图标和一些配置文件打包在可执行程序中 添加qrc文件,可使用qtcreator直接添加 右键选中工程 点击选择即可。 然后添加文件。我这个例子是添加了Image文件夹下的图片资源 使用的时候,可以在代码…

TCP/IP协议(二)

一、TCP-选项 1.简介 在TCP/IP报文中,固定头部下边就是 "选项"部分。 (1)TCP头部的选项部分是TCP为了适应复杂的网络环境和更好的服务应用层而进行设计的 (2)大多数的TCP选项部分出现在TCP连接建立阶段 2.构成 2.1 最大报文传输段 最大报文传输段(Ma…

Java面试八股之简述Servlet体系结构

简述Servlet体系结构 Servlet是Java Web开发中的核心组件,用于接收和响应HTTP请求,生成动态内容。它具有平台无关性、协议无关性和动态内容生成能力,遵循明确的生命周期。尽管现代Web开发中更多使用高级框架,但Servlet作为基础&a…

【SAP ME 18】SAP ME创建开发组件ear

1、说明 SC开发组件ear项目是所有sap me二次开发项目的编译入和部署入口,通过ear可以有效的针对子项目的编译和部署 2、创建开发组件

【MATLAB源码-第190期】基于matlab的32QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境: MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术,作为一种高效的调制方案,能够通过在相同的带宽条件下传输更多的数据位来满足这一需求…

云打印怎么下单?网上云打印下单教程来了!

近些年来,随着移动互联网的发展,云打印也越来越火热。如今有越来越多的用户选择云打印服务。但是现在仍有很多不知道如何下单。那么云打印怎么下单呢?今天小易就来和大家介绍一下网上云打印的下单教程。 云打印怎么下单?网上云打印…

MYSQL45道练习题---持续更新中

来源: Mysql_45道练习题 - 简书 共四张表: ①、course表: CId:课程id Cname:课程名称 TId:老师id ②、student学生表: SId:学生id Sname:…

【Linux】进程的程序地址空间①

目录 前言: 1.什么是地址空间 区域划分 页表: 2.为什么要有地址空间 2.1 进程与内存解耦合 2.2安全 3.凭什么说进程具有独立性: 4.用地址空间解释一下申请内存 前言: 在C语言中,我们说我们将内存分为,栈区…