去除图像周围的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.hqwc.cn/news/638261.html

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

相关文章

TPG原理以及verilog实现

文章目录 一、前言二、verilog代码实现三、仿真以及结果分析 一、前言 TPG(video_test_pattern generator) 视频测试模式发生器用于产生测试数据,对视频数据通路测试。根据视频输出时序产生相应的图像数据 二、verilog代码实现 timescale 1ns / 1nsmodule tpg ( i…

冒泡排序c++

题目描述 编程输入n(1≤n≤20)个小于1000非负整数,然后自动按从大到小的顺序输出。(冒泡排序) 输入 第一行,数的个数n; 第二行,n个非负整数。 输出 由大到小的n个非负整数,每个数占一行。 样例输入 …

.net core webapi 高颜值的接口管理系统界面取代swagger,更好调试和查看

.net core webapi 高颜值的接口管理系统界面取代swagger,更好调试和查看 安装 dotnet add package IGeekFan.AspNetCore.Knife4jUI --version 0.0.16配置文档: 配置起始页 builder.Services.AddSwaggerGen(c > {// 配置 Swagger 文档相关信息c.Swa…

天梯赛 L2-052 吉利矩阵

//r[n]:当前第几列的值。 //l[n]:当前第几行的值。 暴力减止 #include<bits/stdc.h> using namespace std; #define int long long const int n1e3; int a,b,c,l[n],r[n],an; void dfs(int x,int y) {if(xb1){an;return ;}for(int i0;i<a;i){l[x]i;r[y]i;if(l[x]&l…

TCP传输的粘包问题和各种异常情况

文章目录 粘包问题用分隔符用数字代表长度 TCP传输可能遇到的异常情况进程终止电脑关机正常情况下关机非正常情况关机&#xff08;停电&#xff09;电脑断网 粘包问题 粘包问题其实并不是TCP独有的的问题而是每一个面向字节流都会出现的问题&#xff0c;那么什么是粘包问题呢&…

走进敦煌说谷雨 | 谷雨万物新,推开那扇门

谷雨&#xff0c;是春季的最后一个节气&#xff0c; 也铺垫着“热烈”夏天的到来。 让我们来到敦煌&#xff0c;遍寻上下五千年&#xff0c; 了解谷雨在文物里的故事和习俗。 雨生百谷 且把春留驻 谷雨取自“雨生百谷”之意。谷雨&#xff0c;意味着寒潮天气基本结束。这时…

分析和比较深度学习框架 PyTorch 和 Tensorflow

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 深度学习作为人工智能的一个重要分支&#xff0c;在过去十年中取得了显著的进展。PyTorch 和 TensorFlow 是目前最受欢迎、最强大的两个深度学习框架&#xff0c;它们各自拥有独特的特点和优势。 1. Py…

6.MMD ray渲染 材质的添加及打光方法

材质 前置准备 先准备好模型和场景 将ray控制器拖入进去 添加完默认的材质以后的效果 打开插入材质页面 打开MaterialMap栏 将流萤的模型展开 自发光 现在给领带添加一个自发光效果 在自发光Emissive里&#xff0c;打开x1&#xff0c;选择albedo&#xff0c;白光 现在…

【计算机毕业设计】理发店管理系统产品功能说明——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

Quarto Dashboards 教程 1:Overview

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 小区物业管理系统 的设计与实现

一.项目介绍 系统分为管理员 和 业主 两块&#xff1a; 管理员点击进入到系统操作界面&#xff0c;可以对首页、业主信息管理、管理员信息管理、 楼栋和房屋信息管理、物业费管理、地下停车位管理、公告信息管理、报修信息管理、 投诉管理以及个人信息等功能模块 …

Java 异常处理详解

Java异常是Java编程语言中用于表示程序运行时错误的一种机制。Java异常体系通过异常类和异常处理来实现&#xff0c;允许程序在遇到预期或意外情况时&#xff0c;优雅地处理问题&#xff0c;而不是立即终止程序运行。 异常类层次结构 Java异常类都继承自java.lang.Throwable类…