初学者指南: 使用NumPy数组进行图像处理

news2025/1/25 4:36:05

这里写自定义目录标题

  • 初学者指南: 使用NumPy数组进行图像处理
    • 1、加载图像
    • 2、裁剪图像
    • 3、分离颜色
    • 4、转换
    • 5、灰度转换
    • 6、图像分割
    • 结语

初学者指南: 使用NumPy数组进行图像处理

由于图像也可以被视为由数组组成,因此我们也可以使用NumPy执行不同的图像处理任务。在本文中,我们将了解使用 NumPy 执行的图像处理任务。

大多数情况下,我们在需要对不同大小的数组执行数学和逻辑运算,这时候使用NumPy会事半功倍。由于图像也可以被视为由数组组成,因此我们使用NumPy的数组功能进行不同的图像处理。本文将有助于初学者从最基本的方面了解图像处理。本文作为 <<神经网络的数学基础:张量运算>>的拓展,有意系统学习人工智能编程的同学,可以参考一下,加深对基本概念和数组的理解。
我们从导入库和加载随机图像开始。本文使用PyCharm作为代码编写测试的IDE工具。

1、加载图像

随便找一张图片,从加载图片开始。

import matplotlib.pylab as plt

image = plt.imread("src/pics-old/guv0.png")
plt.imshow(image)
# 依次表示数组的维度,形状,数组本身
print(image.ndim, image.shape, image)
plt.show()

输出如下,
注意:不同的图片格式,数组内容可能会不一样,我加载的这张图片,数据是01的值,类型是float,有的图片格式数据是unit8,范围是0255的值:

图1
3 (768, 1280, 3) [[[0.9882353 0.09411765 0.3764706 ]
[0.9882353 0.09411765 0.3764706 ]
[0.9882353 0.09411765 0.3764706 ]

[0.30588236 0.99607843 0.3254902 ]
[0.30980393 0.99607843 0.32941177]
[0.3137255 0.99607843 0.33333334]]]

2、裁剪图像

加载图像后,我们可以对图像执行基本的裁剪操作。对于 NumPy,可以通过数组的切片操作来执行裁剪操作。

import matplotlib.pylab as plt

image = plt.imread("src/pics-old/guv0.png")
# 只是一个:表示这个维度保持不变,410: 表示从0~1280这个轴的index=410 处切一刀
crop_img = image[:, 410:, :]
print(image.shape, crop_img.shape)
plt.imshow(crop_img)
plt.show()

图 2

在这里,我们可以看到我们已经裁剪了图像。现在我们可以继续下一个图像处理步骤

3、分离颜色

因为我们知道每个图像都是由像素值组成的,这些像素值代表三个整数或小数,称为其颜色的 RGB 值。为了将这些颜色的图像分开,我们需要拉出图像数组的正确切片。

import numpy as np
import matplotlib.pylab as plt

image = plt.imread("src/pics-old/guv0.png")
# 使用plot创建一个1行3列的尺寸为(12,8)的绘图区,相当每个是6英寸宽,4英寸高。
fig, axs = plt.subplots(nrows=1, ncols=3, figsize=(12, 8))
for c, ax in zip(range(3), axs):
    # 造一个与image数组一样结构,初始值为0的数组
    # 如果你图片数据值是0~255,类型设为unit8,如果是0~1,设置为float64
    rgb_img = np.zeros(image.shape, dtype="float64")
    # 读取image某一通道的值
    # RGB只拷贝C位,按循环依次取值为0,1,2
    rgb_img[:, :, c] = image[:, :, c]
    ax.imshow(rgb_img)
    ax.set_axis_off()
plt.show()

图 3

在输出中,我们可以看到我们已经分离了图像的 RGB,让我们进入图像处理的下一步

4、转换

在此步骤中,我们将执行颜色转换。为此,我们可以将图像像素视为空间中的一个点。以这种方式处理图像像素使我们能够对色点进行转换。旋转色点可以是上述语句的一个例子。在这里,我们应用了 Numpy 的爱因斯坦符号函数,这是一种将旋转矩阵逐像素应用于图像的方法。

import numpy as np
import matplotlib.pylab as plt


def rotation_matrix(theta):
    return np.c_[
        [1, 0, 0],
        [0, np.cos(theta), -np.sin(theta)],
        [0, np.sin(theta), np.cos(theta)]
    ]


image = plt.imread("src/pics-old/guv0.png")
img_rot = np.einsum("ijk,lk->ijl", image, rotation_matrix(np.pi))
plt.imshow(img_rot)
plt.show()

图 4

在输出中,我们可以看到将 sigmoid 应用于颜色空间是有效的,并且我们正在连续应用像素颜色的旋转。现在在下一步中,我们将看看如何将图像转换为灰度图像

5、灰度转换

我们还可以使用 NumPy 将图像转换为灰度图像。通过取图像RGB值的加权平均值,我们可以执行此操作。

import numpy as np
import matplotlib.pylab as plt

image = plt.imread("src/pics-old/guv0.png")

rgb_weights = [0.2989, 0.5870, 0.1140]
grayscale_image = np.dot(image[..., :3], rgb_weights)
plt.imshow(grayscale_image)
plt.show()

图 5

这是我们灰度转换过程输出的图像。让我们继续下一步的图像处理

6、图像分割

这是我们分割图像不同区域的最常用的图像处理步骤之一。有多种方法可以做到这一点,例如前景和背景。例如,在本文中,我们将了解如何通过将图像转换为灰度并找到阈值来执行分割。图像中高于阈值的像素位于一个区域中,而其他像素位于另一个区域中

import numpy as np
import matplotlib.pylab as plt

image = plt.imread("src/pics-old/guv0.png")
image = image*255


def simple_threshold(img, threshold=128):
    return ((img > threshold) * 255).astype("uint8")


thresholds = [100, 120, 128, 138, 150]

fig, axs = plt.subplots(nrows=1, ncols=len(thresholds), figsize=(20, 5))

rgb_weights = [0.2989, 0.5870, 0.1140]
gray_im = np.dot(image[..., :3], rgb_weights)

# gray_im = to_grayscale(image)

for t, ax in zip(thresholds, axs):
    ax.imshow(simple_threshold(gray_im, t), cmap='Greys')
    ax.set_title("Threshold: {}".format(t), fontsize=20)
    ax.set_axis_off()
plt.show()

输出:

图6

在上面的输出中,我们可以看到我们使用不同的阈值将图像分割成两个区域

结语

在本文中,我们讨论了使用 NumPy 库执行的图像处理的不同任务。此外,我们还使用 matplotlib 库在处理后对图像进行可视化。通过查看上述几点,我们可以说,我们也可以通过使用其他一些逻辑来执行其他任务

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

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

相关文章

【Lilishop商城】No2-6.确定软件架构搭建五(本篇包括定时任务xxl-job)

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇只介绍重点架构逻辑&#xff0c;具体编写看源代码就行&#xff0c;读起来也不复杂~ 谨慎&#xf…

如何配置一台适合oc渲染器的电脑?

众所周知&#xff0c;Octane 是最流行的渲染引擎之一。此外&#xff0c;Octane 是一个 GPU 渲染引擎&#xff0c;它使用一种计算最终生成的图片的方法&#xff0c;试图达到照片般的真实感。Octane 是一种利用 GPU 技术的无偏渲染引擎&#xff0c;非常接近物理精度。一台好的 PC…

计算机组成原理习题课第三章-2(唐朔飞)

计算机组成原理习题课第三章-2&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

天宇优配|平台助企“抱团出海” “小而美”中觅“先机”

天津华图轿车物流有限公司一批二手新能源车从连云港装船发往阿联酋迪拜。&#xff08;采访方针供图&#xff09; 最近&#xff0c;一笔100.8万美元的出口信誉稳妥保单融资借款&#xff0c;被划到了天津华图轿车物流有限公司的账户上。正值客户“下单”高峰期&#xff0c;这笔及…

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)&#xff08;一&#xff09; 本文目录&#xff1a; 一、【旋转的精灵女孩】案例运行效果 二、Three.js简介 三、Three.js代码正常运行显示条件 &#xff08;1&#xff09;不载入任何纹理贴图的网页 &#xff08;2&…

双十二蓝牙耳机啥牌子好?2022年度热销蓝牙耳机排名

这期双十二数码好物分享&#xff0c;工作室打算来跟大家说说蓝牙耳机这个话题&#xff0c;它已经成为出行必带的装备&#xff0c;上班族、学生党、游戏党都离不开蓝牙耳机。今年我们测评过数十款型号了&#xff0c;本期我们盘点了今年热销的蓝牙耳机排名&#xff0c;让大家直观…

【学习笔记】《Python深度学习》第五章:深度学习用于计算机视觉

文章目录1 卷积神经网络简介1.1 卷积运算1.2 最大池化运算2 在小型数据集上从头开始训练一个卷积神经网络2.1 下载数据2.2 构建网络2.3 数据预处理2.4 数据增强3 使用预训练的卷积神经网络3.1 特征提取3.2 微调模型3.3 小结4 卷积神经网络的可视化4.1 可视化中间激活4.2 可视化…

新手想开一个传奇该如何操作?开一个传奇必须掌握哪些知识要点

对于这个问题&#xff0c;近期问的人比较多&#xff0c;相比这也是热爱传奇这个游戏的朋友会问到的一个问题&#xff0c;因为喜欢玩这个游戏&#xff0c;也想要自己去开一个 经营一个 不管是电脑端也好 还是手机端也好&#xff0c;但是对于一些新手确实不知道该如何开始操作 从…

H3C opsf/rip/ftp/telent/nat/acl综合

实验拓扑 拓扑下载 https://sharewh2.xuexi365.com/share/84b85b32-acb7-4f62-a389-6188680a19f3?t3 图 1-1 注&#xff1a;如无特别说明&#xff0c;描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备&#xff0c;R2 或 SW2 对应拓扑中设备名称末尾数字为 2 的设备…

三天入门Redis【快速浏览版】

文章目录第一天1.1 Redis基础1.1.1 NoSql引入1.1.2 NoSql特点1.1.3 NoSql数据库1.1.4 Redis概述1.1.5 Redis文件的作用1.1.6 Redis相关介绍1.2 常用的五大类型及操作⭐️1.2.1 Redis键&#xff08;key&#xff09;1.2.2 库的一些操作1.2.3 Redis字符串1.2.4 Redis列表&#xff…

MATLAB数据导入

MATLAB数据导入 在编写一个程序时&#xff0c;经常需要从外部读入数据。MATLAB使用多种格式打开数据。本章将要介绍MATLAB中数据的导入。 MATLAB中导入数据的方式有两种&#xff0c;分别是在命令行通过代码把数据导进去和通过MATLAB的数据导入向导导入数据。本节将为大家介绍第…

ASCHIP_ISP Tool 工具 使用与更新

系列文章目录 ASCHIP-ISP Tool 版本1 2022 11 26ASCHIP-ISP Tool 版本1 使用说明 2022 11 26 软件介绍 对窗体进行初步配置&#xff0c;配置其大小与显示 一&#xff1a;软件介绍 ASCHIP_ISP Tool 工具是用于具有 ISP 功能型号类型的单片机进行 ISP 更新程序开发实验的配套上位…

Lint-staged自动修复格式错误及小结

文章目录一、背景二、Lint-staged2.1 简介2.2 修改package.json2.3 修改pre-commit2.4 测试三、小结3.1 代码格式规范3.2 Git提交规范一、背景 通过前面几节的介绍&#xff0c;目前想要提交代码&#xff0c;就要保证代码格式规范和提交信息格式规范&#xff0c;特别是pre-subm…

vue设置页面背景及背景图片

本地静态图片 <template><view class"max"><image src"../../static/bg.png" mode""></image></view> </template><script>export default {data() {return {}},methods: {}} </script><st…

JavaEE之Cookie 和 Session 的工作流程

文章目录前言Cookie 和 Session 的核心方法Cookie 和 Session 的工作流程总结前言 HTTP涉及到的键值对: query string请求/响应的headerCookie里的内容form表单提交的bofyjson格式的body服务器存储若干个sessionId和HttpSession对象每个HttpSession对象本身里面又可以保存多个…

前景一片蓝海,Android音视频开发必备基础知识汇总

转瞬间&#xff0c;2022 已慢慢步入深冬&#xff0c;回首过去一年&#xff0c;音视频技术在经历一番风浪的侵袭过后&#xff0c;变得逐渐相对平静下来。 “内卷”之外&#xff0c;大家似乎更多了一份“理性”指导我们去做一些正确的事&#xff0c;追求技术在商业中的更高价值。…

数商云B2B商城系统订货功能为新能源汽车行业赋能,打造高质量发展生态圈

近年来&#xff0c;随着传统的汽车销售模式的信息不对称、价格不透明等问题日益凸显&#xff0c;汽车电商以其低成本的优势与高速的信息流通效率迅速发展。所谓汽车电商&#xff0c;即卖家与买家通过互联网的技术和手段&#xff0c;完成汽车售后各项服务的交易流程。根据数据显…

3.Linux文件管理命令-----ls显示文件名

14天学习训练营导师课程&#xff1a; 互联网老辛《 符合学习规律的超详细linux实战快速入门》 作用&#xff1a;ls 命令用于显示目录内容&#xff0c;类似于 DOS 下的 dir 命令&#xff0c;它的使用权限是所有用户。 用法&#xff1a; ls [选项]...[文件]...1.LS应用实例如下…

数据结构 - 树 堆

树、堆是用于频繁插入、排序的数据结构。他是一种排序数据结构而不是排序算法。 堆和树是有区别的 堆&#xff1a;特殊的完全二叉树。“特殊”&#xff1a;数值上特殊&#xff0c;父比子大/小。 1. 为什么用它 书上给的例子有点奇怪&#xff1a; 他的意思是说&#xff1a;“…

mysql学习笔记1:忘记密码

我使用的mysql版本为&#xff1a;5.6.50&#xff0c;操作系统为&#xff1a;win10 一、修改配置文件my.ini 1、在C:\ProgramData\MySQL\MySQL Server 5.6文件夹下找到my.ini配置文件 2、设置权限认证跳过 找到[mysqld]&#xff0c;在下面这行代码的下面加上 skip-grant-tab…