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

news2024/9/29 17:34:43

在做分割任务时,经常需要处理图像,如果图像周围有一圈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像素去除掉了,但是周围还是有黑边,说明去掉的还是不够好。

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

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

相关文章

vue3【详解】选项式 API 实现逻辑复用

抽离逻辑代码到一个函数函数命名约定为 useXxxx格式 ( React Hooks 也是 )在 setup 中引用 useXxx 函数 演示代码:实时获取鼠标的坐标 逻辑封装 useMousePosition.js // 导入 ref, onMounted, onUnmounted import { ref, onMounted, onUnmounted } from "vue…

【Python-Pygame】

Python-Pygame ■ Pygame-简介■ Pygame-安装■ Pygame-Rect区域位置■ Pygame-Draw绘图函数■ Pygame-■ Pygame-■ Pygame-■ Pygame-事件监听■ Pygame-Event事件模块■ Pygame-游戏循环■ Pygame-Display显示模块■ Pygame-Time时间控制■ Pygame-Font文本和字体■ Pygame-…

软考 - 系统架构设计师 - ESB(企业服务总线)例题

问题 1: 根据描述 Ramp Control 是负责系统中相关各种业务活动的组件,根据题目描述,系统中包含检查机位环境,卸货,装货等业务活动,所以 Ramp Control 服务组件提供的服务名称就是 “负责检查机位环境&#…

OLAP多维语义模型

概述 为了严谨起见,在正式内容之前,先把OLAP多维语义模型是什么说明一下。 先说OLAP(Online Analytical Processing),它是和OLTP相对的概念,关于这两个概念的详细解释网上有很多。严格的来说OLAP与多维数…

Java Email API有哪些常用功能?如何使用?

Java Email API支持哪些邮件协议?常用的邮件API推荐? Java Email API作为Java开发领域中处理电子邮件的重要工具,为我们提供了丰富的功能来发送、接收和管理电子邮件。下面,AokSend就来详细探讨一下Java Email API的常用功能。 …

Webpack-

定义 静态模块:指的是编写代码过程中的html,css,js,图片等固定内容的文件 打包:把静态模块内容压缩、整合、翻译等(前端工程化) 1)把less/sass转成css代码 2)把ES6降级…

Gitlab: Python项目CI/CD实践

目录 1. 说明 2. 准备工作 2.1 服务器 2.2 开发机hosts文件 2.3 项目 3. 步骤过程 3.1 建仓Fastapi T1 3.2 开发机测试构建与推送 ​编辑 3.3 在工作站添加gitlab-runner 3.4 提交代码,查看Pipelines结果 3.5 观察部署情况 4. 参考 1. 说明 分别以一个…

Isaac Sim 1(学习笔记2024.4.22)

仅作为个人学习笔记使用,防止一转头就找不到了 一.ROS bridge 1.On Playback Tick 节点: 在模拟“播放”时生成一个时钟信号。接收到该节点发出的时钟信号的节点将在每个模拟步骤中执行它们的计算函数。 2.ROS Subscribe Twist 节点: 订阅 …

数据结构-循环队列和循环双端队列的多角度实现

文章目录 1. 循环队列的数组形式实现2. 循环队列的链表实现3. 循环双端队列的数组形式实现4. 循环双端队列的链表实现 在力扣的题面如下 1. 循环队列的数组形式实现 其实循环队列的数组形式只有下面要注意的点,只要掌握了下面的这几点,代码层面上就没有什么问题了 用数组模拟的…

精灵传信系统/支持对接易支付/网站+小程序双端php源码下载

简介 精灵传信支持在线提交发送短信,查看回复短信,在线购买额度,自定义对接易支付,设置违禁词,支持网站小程序双端。(文末下载) 演示截图 在数字化浪潮的推动下,技术创新正以前所未…

VUE 弹框内容懒加载-真实项目

背景&#xff1a;VUE 页面&#xff0c;点击按钮&#xff0c;弹框&#xff0c;内容从接口获取&#xff0c;数据量比较大&#xff0c;鼠标滑到页面最底部&#xff0c;调取一次接口&#xff0c;分批加载&#xff1b; demo&#xff1a; <template><div><!-- 触发弹…

通用变频器ACS800-04M-0320-3可议价

商业别名&#xff1a;ACS800-04M-0320-3 产品编号&#xff1a;68279429 ABB 型号名称&#xff1a;ACS800-04M-0320-3 目录说明&#xff1a;ACS800-04M-0320-3&#xff1b; ACS800-04M-0320-3 Pcont.max:250kW, Icont.max:521A 原产地&#xff1a;芬兰 (FI) 海关税则号&#xf…

现代图形API综合比较:Vulkan | DirectX | Metal | WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元&#xff0c;可以处理大量数据&#xff0c;例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…

springboot3 集成knife4j No endpoint GET /doc.html.

springboot3 集成knife4j 访问页面&#xff1a;http://127.0.0.1:8022/doc.html 提示&#xff1a; No endpoint GET /doc.html. 描述环境&#xff1a; java17 springboot3.2.0 knife4j的jar包 <dependency><groupId>com.github.xiaoymin</groupId><a…

vue实现周日历 日历按周切换 vue日程管理

实现的功能 1、点击今天&#xff1a;回到今日日期并选中今日日期&#xff0c;查当天数据 2、点击左箭头&#xff1a;切换上一周 3、点击右箭头&#xff1a;切换下一周 4、黄圆圈代表有日程提醒&#xff0c;点击选中&#xff0c;下方对应显示当前日程提醒的内容&#xff0c;没有…

打造稳定安全的亚马逊测评环境:关键步骤与要点一览

亚马逊测评环境的搭建是一项既复杂又需要深入细致考虑的工作&#xff0c;它涉及多方面的技术配置和资源准备。以下是一些关键步骤和要点&#xff0c;帮助您更高效地构建测评环境。 一、资源筹备 1. 养号系统&#xff1a;选择稳定、高效的养号系统&#xff0c;确保能够模拟真实…

上传文件到HDFS

1.创建文件夹 hdfs -dfs -mkdir -p /opt/mydoc 2.查看创建的文件夹 hdfs -dfs -ls /opt 注意改文件夹是创建在hdfs中的&#xff0c;不是本地&#xff0c;查看本地/opt&#xff0c;并没有该文件夹。 3.上传文件 hdfs dfs -put -f file:///usr/local/testspark.txt hdfs://m…

【JavaEE初阶系列】——网络原理之进一步了解应用层以及传输层的UDP协议

目录 &#x1f6a9;进一步讲应用层 &#x1f388;自定义应用层协议 &#x1f388;用什么格式组织 &#x1f469;&#x1f3fb;‍&#x1f4bb;xml(远古的数据组织格式) &#x1f469;&#x1f3fb;‍&#x1f4bb;json(当下最流行得一种数据组织格式) &#x1f469;&…

Docker(二)Docker+ server部署极简前端页面

本篇文章介绍如何使用 Dockerserver 将一个极简前端页面进行部署 1.本地运行一个简单的前端页面&#xff0c;再把它部署到服务器上 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

算法思想总结:栈

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