Python 实战人工智能数学基础:图像处理应用

news2024/11/15 11:07:17

1.背景介绍

在许多计算机视觉任务中,图像处理占据了很重要的角色,尤其是在目标检测、特征提取、分类、跟踪等计算机视觉任务中。图像处理是一个复杂的过程,涉及到图像的采集、分析、存储、显示等环节。本文将讨论基于Python实现的图像处理的相关知识和技术。下面先介绍图像的定义、结构、属性及一些基本术语。

一、图像的定义、结构、属性及一些基本术语

  1. 图像的定义 在数学上,图像(image)是指空间中的点所组成的集合。图像由像素或灰度值表示。一幅图像通常可以看作是一个二维或三维矩阵。

  2. 图像的结构 图像由两个维度,即行数和列数。例如,彩色图像的像素点有三个颜色通道(红、绿、蓝)。在彩色图像中,每个像素点都有一个坐标值,描述这个像素点相对于整个图像的位置。

  3. 图像的属性

  • 边界:图像的边界是一个外形,它把图像分割成若干个区域。图像的边界可以是矩形、圆形、椭圆、弯曲等。
  • 直方图:直方图是图像的一维分布图,用以呈现灰度值或色调的分布情况。直方图能够直观地反映出图像的整体对比度、均匀性、均值等特性。
  • 模糊:图像模糊是指图像中的高频噪声被低频信号所掩盖而得来的效果。图像模糊的原因很多,比如光照变化、摄像机运动、恶劣天气、光污染等。
  • 空间域变换:在不同的空间域下,图像的视野范围不同,图像也会发生变化。
  • 几何变换:图像的几何变换是指改变图像的大小、旋转角度、放缩等,以达到图像编辑、图像质量评估、增强等目的。
  • 分割:图像的分割是图像识别、目标检测等任务的关键一步。图像的分割可以分为全局分割和局部分割。全局分割是指按照某种规则将整个图像划分成几个互不重叠的子区域。局部分割是指根据不同特征进行区域的分割。
  1. 一些基本术语
  • 坐标系:坐标系用来描述一个点或者图像区域在某种坐标下的位置。常用的坐标系有笛卡尔坐标系和球面坐标系。
  • RGB: 是一种三原色图片的色彩模型,其中R代表红色、G代表绿色、B代表蓝色。
  • 灰度图: 是黑白的图像,其中每一个像素的值对应的是该像素的亮度。
  • HSV: 是一种色彩模型,它把颜色划分为色调、饱和度、明度三个参数,分别对应红色、绿色、蓝色。
  • 颜色空间转换:是指从一种颜色空间转换到另一种颜色空间。常见的颜色空间有RGB、HSV、CMYK、YCbCr四种。
  • 拉普拉斯算子:是一个二阶微分算子,用于检测图像中的边缘。它的水平方向、垂直方向和对角线方向上的梯度都是1,中间的元素是0。
  • 中值滤波:是一种图像平滑方法。它用邻域内的中值代替当前像素的灰度值。
  • 锐化(Sharpen):是指将图像中的细节锐化,使其显得更加醒目。
  • 撕裂(Dilation):是指将图像中的细节向外扩张。
  • 膨胀(Erosion):是指将图像中的细节向里收缩。
  • 腐蚀(erosion):是指将图像中的噪声点排除掉,只保留边缘信息。

二、Python 的图像处理库

  1. OpenCV (Open Source Computer Vision Library) OpenCV (Open Source Computer Vision Library) 是目前最流行的开源计算机视觉库。该库提供了各种功能,如图像处理、计算机视觉、机器学习、自然语言处理等。它支持多种编程语言,包括 C++、Java、Python、MATLAB 和其他。OpenCV 库提供多个工具集用于解决日常生活中的常见计算机视觉问题。
  2. Pillow (Python Imaging Library) Pillow 是一个用来创建、编辑、保存、显示、分析和转换图像的 Python 模块。Pillow 提供了 Image 对象,并提供了一系列的方法用来对图像进行操作。
  3. Scikit-Image (scikit-learn for image processing) Scikit-Image 是基于 NumPy, SciPy, and matplotlib 的 Python 图像处理库。它提供多种函数来进行图像的读取、写入、裁剪、缩放、翻转、显示、转换等。还可以通过不同的算法来进行图像的分割、过滤、形态学处理、特征提取等。
  4. Keras with TensorFlow backend Keras 是用于构建和训练神经网络的高级 API。它具有可移植性、易用性、模块化设计和可扩展性。Keras 可以运行在 TensorFlow 或 Theano 上,为开发人员提供简单且高效的接口。它支持常见的数据结构,如张量、数组、字典等,并且支持加载、存储、归一化数据、监控训练过程、可视化结果等功能。

三、数字图像处理的一些基本技术

  1. 颜色模型转换
  • RGB 颜色模型转换为 YUV
  • YUV 颜色模型转换为 RGB
  • RGB 颜色模型转换为 HSV
  1. 图像拼接
  • 横向拼接
  • 纵向拼接
  1. 图像均衡化
  • 全局均衡化
  • 局部均衡化
  1. 图像滤波
  • 中值滤波
  • 双边滤波
  • 均值滤波
  • 高斯滤波
  1. 图像预处理
  • 直方图归一化
  • 标准化
  • 高斯噪声降低
  1. 图像增强
  • 对比度增强
  • 色调增强
  • 饱和度增强
  • 平滑
  • 锐化
  1. 图像融合
  • 抖动合并
  • 权重融合
  • 插值融合
  • 平均融合
  1. 图像分割
  • 阈值分割
  • K-Means 聚类
  • Mean Shift 聚类
  1. 形态学操作
  • 开运算
  • 闭运算
  • 顶帽运算
  • 底帽运算
  • 形态学梯度
  • 顶帽操作与底帽操作结合

四、Python 图像处理实践

下面我们通过实例,使用 Python 来实现一些常见的图像处理技术,包括图片缩放、拼接、锐化、均衡化、图片增强、形态学处理等。具体如下:

1. 图片缩放

from PIL import Image
import numpy as np

img = Image.open('lena_color.tif')    # 以 RGB 模式打开彩色图像

width = int(img.size[0] * 0.5)   # 宽度缩小一半
height = int(img.size[1] * 0.5)  # 高度缩小一半
img_small = img.resize((width, height), Image.ANTIALIAS)     # 使用 ANTIALIAS 选项进行放缩

img_arr = np.array(img).astype("uint8")      # 将图像转换为 Numpy array
img_small_arr = np.array(img_small).astype("uint8") 

print(f"Original size is {img.size}, new size is {img_small.size}")
print(f"Difference between original pixel values and resized small ones:\n{np.abs(img_arr - img_small_arr)}")  

2. 拼接图片

from PIL import Image
import os

path = 'images'       # 指定图片路径
files = sorted([os.path.join(path, f) for f in os.listdir(path)])    # 获取指定路径的所有图片文件

img_new = None          # 初始化空图像
for i, img in enumerate(imgs):
    print(f"{i+1}. Size of the current picture is {img.size}")
    if img_new == None:
        img_new = img   # 如果是第一张图片,直接赋值给 img_new
    else:
        img_new = Image.alpha_composite(img_new, img)    # 用 alpha 透明度模式拼接图片

if not os.path.exists('output'):      # 检查输出目录是否存在,不存在则创建
    os.mkdir('output')
    

3. 锐化图片

from PIL import ImageFilter, ImageEnhance

img = Image.open('lena_gray.tif').convert('L')    # 打开灰度图像并转换为灰度图像

filter_blur = img.filter(ImageFilter.GaussianBlur(radius=3))    # 高斯滤波降低噪声

enhancer = ImageEnhance.Sharpness(filter_blur)    # 创建 Sharpness 对象

sharped_img = enhancer.enhance(2.0)             # 锐化增强

if not os.path.exists('output'):               # 检查输出目录是否存在,不存在则创建
    os.mkdir('output')

sharped_img.save(os.path.join('output','sharped.tif'))    # 保存锐化后的图像

4. 均衡化图片

from skimage import data, exposure
import numpy as np
import matplotlib.pyplot as plt

img = data.moon()   # 读取月牙图像

increasing_hist = exposure.equalize_adapthist(img, clip_limit=0.03)   # 使用 CLAHE 直方图均衡化

fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(8, 3))         # 设置子图大小

ax[0].imshow(img, cmap='gray')        # 原始图像
ax[0].set_title('Original image')

ax[1].imshow(increasing_hist, cmap='gray')           # 均衡化图像
ax[1].set_title('Histogram equalized image')

ax[2].hist(increasing_hist.flatten(), bins=256, range=[0, 256], histtype='stepfilled', color='black')
ax[2].set_xlim([0, 256])                  # 设置 x 轴刻度范围
ax[2].set_ylim([0, np.max(increasing_hist)*1.1])                # 设置 y 轴刻度范围
ax[2].set_xlabel('Pixel intensity')
ax[2].set_ylabel('Number of pixels')
ax[2].set_title('Histogram of the histogram equalized image')

plt.tight_layout()            # 自动调整子图间距
plt.show()                    # 显示图像

5. 图像增强

from PIL import ImageEnhance
from skimage import data

img = data.coins()                 # 读取硬币图像

enhancers = [ImageEnhance.Brightness(img),
             ImageEnhance.Color(img),
             ImageEnhance.Contrast(img)]

fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(6, 8))    # 设置子图布局

titles = ["Brightness", "Color", "Contrast"]                      # 设置子图标题
images = [(enhancers[j*2]).enhance(1.5 + j) for j in range(3)]    # 设置增强因子列表

for i, im in enumerate(images):                                  # 遍历增强后图片
    row, col = divmod(i, 2)                                      # 根据索引计算子图的行列坐标
    axes[row][col].imshow(im)                                    # 在子图中绘制图像
    axes[row][col].set_axis_off()                                # 关闭坐标轴
    axes[row][col].set_title(titles[row])                          # 添加子图标题

plt.tight_layout()                                              # 自动调整子图间距
plt.show()                                                      # 显示图像

6. 形态学处理

from scipy import ndimage
import matplotlib.pyplot as plt

img = np.zeros((100, 100)).astype("uint8")                         # 创建 100x100 黑色图像
img[:50,:] = 255                                                  # 第 1/4 置为白色
img[:, :50] = 255                                                 # 第 1/4 置为白色
img[50:, :] = 255                                                 # 第 1/4 置为白色
img[:, 50:] = 255                                                 # 第 1/4 置为白色

eroded_img = ndimage.binary_erosion(img).astype("uint8")           # 腐蚀处理

dilation_img = ndimage.binary_dilation(img).astype("uint8")       # 膨胀处理

gradient_img = eroded_img - dilation_img                           # 形态学梯度

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 8))         # 设置子图布局

axes[0][0].imshow(img, cmap="gray")                               # 原始图像
axes[0][0].set_title('Original binary image')                    

axes[0][1].imshow(eroded_img, cmap="gray")                        # 腐蚀图像
axes[0][1].set_title('Eroded image')                           

axes[1][0].imshow(dilation_img, cmap="gray")                       # 膨胀图像
axes[1][0].set_title('Dilated image')                            

axes[1][1].imshow(gradient_img, cmap="gray")                       # 形态学梯度图像
axes[1][1].set_title('Morphological gradient')                  

plt.tight_layout()                                               # 自动调整子图间距
plt.show()                                                       # 显示图像

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码免费领取保证100%免费

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

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

相关文章

Solana主网使用自定义的RPC进行转账

1、引言 如果用 browser 连接主网的 RPC server 会收到 error code 403 message 為 Access forbidden, contact your app developer or supportrpcpool.com. 错误,因为主网的 RPC server 会检查 HTTP Header 如果判断出來是 browser 就会报告 403 錯誤。 要解決这…

2024年第十五届蓝桥杯C/C++B组复盘(持续更新)

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 试题A:握手问题问题描述思路 试题B:小球反弹问题描述思路…

函数与结构体

P2415 集合求和 题目描述 给定一个集合 s(集合元素数量≤30),求出此集合所有子集元素之和。 输入格式 集合中的元素(元素≤1000) 输出格式 s 所有子集元素之和。 输入输出样例 输入 2 3 输出 10 说明/提示【样…

Flutter - flutter_gen 资源管理

引言: 在开发 Flutter 应用时,我们经常需要使用各种静态资源,如图片、字体和音频等。如何有效地管理和加载这些资源呢?本篇博客将以图片为例带你解密 Flutter 项目中是如何管理资源地。 assets 加载资源 具体文件名引入 在工程…

软件杯 深度学习卷积神经网络的花卉识别

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基…

L1-041 寻找250

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。 输出格式: 在一行中输出第一次…

postman接口测试(入门到精通)

下载: postman官方地址 测试外部接口:测试被测系统和外部系统之间的接口。(只需要测试正例即可) 测试内部接口: 1.内部接口只提供给内部系统使用。(只需要测试正例即可) 2.内部接口提供给外…

Gradle 实战 - 插件-ApiHug准备-工具篇-015

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

Unity 人形骨骼动画模型嘴巴张开

最近搞Daz3D玩,导入后挂上动画模型嘴巴张开,其丑无比。 Google了一下,得知原因是Unity没有对下巴那根骨骼做控制,动画系统就会把它放到默认的位置,嘴巴就张开了。找到了3种解决办法。 1.移除动画中对下巴这个骨骼的转…

【深度学习】YOLO-World: Real-Time Open-Vocabulary Object Detection,目标检测

介绍一个酷炫的目标检测方式: 论文:https://arxiv.org/abs/2401.17270 代码:https://github.com/AILab-CVC/YOLO-World 文章目录 摘要Introduction第2章 相关工作2.1 传统目标检测2.2 开放词汇目标检测 第3章 方法3.1 预训练公式&#xff1a…

C语言中的数据结构--链表的应用2(3)

前言 上一节我们学习了链表的应用,那么这一节我们继续加深一下对链表的理解,我们继续通过Leetcode的经典题目来了解一下链表在实际应用中的功能,废话不多说,我们正式进入今天的学习 单链表相关经典算法OJ题4:合并两个…

【前端工程化指南】什么是版本控制系统?

什么是版本控制系统 想必大家在多人开发时一定会遇到这样的问题: 每次集中合并大家的代码都要通过U盘、网盘等各类传输工具集中代码,非常麻烦。在多人同时修改同一文件或相同部分代码时,可能会产生冲突,开发人员需要手动比较代码…

自编译支持CUDA硬解的OPENCV和FFMPEG

1 整体思路 查阅opencv的官方文档,可看到有个cudacodec扩展,用他可方便的进行编解码。唯一麻烦的是需要自行编译opencv。 同时,为了考虑后续方便,顺手编译了FFMPEG,并将其与OPENCV绑定。 在之前的博文“鲲鹏主机昇腾A…

《系统分析与设计》实验-----需求规格说明书 哈尔滨理工大学

文章目录 需求规格说明书1.引言1.1编写目的1.2项目背景1.3定义1.4参考资料 2.任务概述2.1目标2.2运行环境2.3条件与限制 3.数据描述3.1静态数据3.2动态数据3.3数据库介绍3.4数据词典3.5数据采集 4.功能需求4.1功能划分4.2功能描述…

arxiv文章导出的bibtex格式是misc导致latex引用不正确

问题 在arxiv官网上右下角导出bibtex,发现是misc格式,然后我用的是springer的期刊latex模板,发现引用不正确。 引用效果如下,就只有一个2024。 解决方案: 把上面那个bibtex手动改成下面这个。 article{liu2024in…

SpringCloud实用篇(四)——Nacos

Nacos nacos官方网站:https://nacos.io/ nacos是阿里巴巴的产品,现在是springcloud的一个组件,相比于eureka的功能更加丰富,在国内备受欢迎 nacos的安装 下载地址:https://github.com/alibaba/nacos/releases/ 启动…

【寒假集训营总结笔记——7道优质好题】

牛客寒假集训营总结笔记——7道优质好题 一、Trie树的应用: 题目链接:Tokitsukaze and Min-Max XOR 1、题意 2、题解 1、首先这道题的答案和元素本身的顺序是无关的,因为假如你选择了一些数字,它是默认必须排好序才能记作是答案…

docker特殊问题处理3——docker-compose安装配置nacos

最近几年随着大数据和人工智能持续大热,容器化安装部署运维已经走进了各个中小公司,也得已让众多开发者能上手实际操作,不过说真心话,“万物皆可容器化”的理念越来越深入人心。 而如何使用docker-compose安装,配置&a…

mxnet安装

ChatGPT 安装 MXNet 是一个非常直接的过程,可以通过几种方法实现,包括使用Python的包管理工具pip安装预编译的二进制包,或者从源代码编译。以下是使用pip安装MXNet的基本步骤:1. 首先,确保已经安装了Python和pip。通常…

ELK(Elasticsearch+Logstash+Kibana)日志分析系统

目录 前言 一、ELK日志分析系统概述 1、三大组件工具介绍 1.1 Elasticsearch 1.1.1 Elasticsearch概念 1.1.2 关系型数据库和ElasticSearch中的对应关系 1.1.3 Elasticsearch提供的操作命令 1.2 Logstash 1.2.1 Logstash概念 1.2.2 Logstash的主要组件 1.2.3 Logsta…