【计算机视觉】数字图像处理基础知识(模拟和数字图像、采样量化、像素的基本关系、灰度直方图、图像的分类)

一、图像的基本概念

  • 图像(image):图像这个简单单词其实包含两方面含义:

    1. “图”:是指物体反射光or透射光的分布
    2. “像”:接收和记录其分布所得到的结果(如:人的视觉系统所接收“图”在人脑中形成的映像或认识)

    根据第二点的不同,我们可以将图像分为:模拟图像、数字图像

  • 模拟图像(Analog image):成像过程是连续的。 模拟图像的成像过程和结果记录是基于化学反应的,如传统照相方法所用到的“胶片”就是一种物理介质,这个过程涉及到光敏材料对光的响应,是一种化学反应过程!。这种成像过程和记录结果是连续的,没有固定的分辨率限制,可以达到非常精细的水平。对模拟图像的处理和编辑通常需要用到物理和化学方法

  • 数字图像(Digital image):成像过程是从连续到离散,成像结果就是离散的。它是基于传感器的。在前面博客中对数字图像的成像已经进行了详尽的介绍:【计算机视觉】图像的获取和表示——图像传感器技术|主要参数解析、成像原理剖析、传感器处理
    在这里插入图片描述
    由下图可以看到,数字图像是由模拟图像进行采样、量化得到的。它以像素为最小单位存储在计算机等数字电路中,这个过程也称为:图像的数字化。

    在这里插入图片描述

  • 像素(pixel): 由上文我们知道,数字图像其实是用一个矩阵的形式存储在数字电路中的,这个矩阵中的一个个不可再分的小方格(元素)其实就代表一个像素,它包含了这个位置的图像颜色信息在这里插入图片描述

二、数字图像的获取与显示

数字图像的获取无非是要考虑如何将模拟图像(连续图像,图像在二维坐标空间中颜色连续变化,像点无限稠密不可分割)转换为可以被计算机存储和处理的数字图像,也就是数字!!!
在这里插入图片描述
学过数电和模电or信息号系统的同学其实也对此比较熟悉了,其实这本质就是一个数模转换的过程:二维的模拟信号转换为二维的数字信号

接下来就围绕着对于数字图像的获取的:采样和量化两个步骤详细展开讲解:

2.1:采样

在这里插入图片描述
采样的过程如上图,形象点来说就是,我们怎么把这个二位模拟图像用二维矩阵的形式(方格)进行划分开。

  • 当采样的行/列间隔越大,得到的像素(就是小方格)数也就越多,那么二维矩阵就越大,图像的信息也就越多,这个时候也就是我们常听说的:图像分辨率高、质量高;
  • 当采样的行/列间隔小,也就是说得到的像素数很少,那么我们知道的图像信息也就越少(因为一个像素点只能代表一种颜色亮度信息),那么此时:图像分辨率低、质量低
    在这里插入图片描述

那么如何能够合理的进行图像的采样,从而保证不会丢失太多图像信息,从而将原始图像不失真的存储下来呢?——采样的规则:采样定理

在这里插入图片描述

图像的频率?
学过信号与系统的我们知道,图像其实也是一种信号(二维的),是信号也会有频率
在这里插入图片描述
关于图像处理和分析方面,很多可以从它的频域出发,这点在前面傅里叶变换那篇博客中详细讲过:傅里叶变换和其图像处理中的应用

2.2:量化

上面采样,我们只是把模拟图像划分为了二维矩阵,但是二维矩阵中像素值如何确定呢?确定图像像素值的过程,也就是我们所说的:量化,是将连续量进行离散化的过程
在这里插入图片描述

如上图所示,我们将一个连续变换的图像,将其进行离散化为0~255256个灰度值中的离散整数(通常称为8bit量化级别)。假如我们只离散化为0,1两个黑白灰度级别,那么该图像则变成了黑白图像。

关于量化级别

  • 量化级别越高,相当于你可以选的颜色值越多(形象表示就是你画画时调色盘上的颜色越多),那么你图像肯定信息越复杂丰富、分辨率高、质量高
  • 量化级别越低,相反,图像质量和效果肯定就越差
    在这里插入图片描述

2.3:非均匀采样、量化

上面讲的采样频率、量化级别,对于一张图片来说是确定的唯一的,这种采样和量化其实就是:均匀的采样和量化。但是实际过程中也可以进行非均匀的采样和量化:

  • 在图像细节丰富的地方,减小采样间隔(增大采样频率),获得更多的图像信息
  • 在图像变化缓慢的地方,粗采样(采样间隔大)
  • 在图像灰度/颜色值变化比较剧烈的地方,量化级别可以减少
  • 在图像灰度变化缓慢的地方,灰度级别可以增多(避免出现假轮廓线性

三、像素间的基本关系

3.1:邻域

  • 4邻域:设位于图像坐标(x,y)像素点P,其上下左右邻域分别为:(x+1,y);(x-1,y);(x,y+1);(x,y-1),每个像素据P一个像素距离。这四个像素称为P的4邻域,记为N4(P)。如图3-10所示:
  • D邻域:像素P(x,y)的四个对角相邻像素坐标是:(x+1,y+1),(x+1,y-1),(x+1,y+1),(x-1,y-1)。这四个像素称为P的D邻域,记为ND(P)。如图3-11所示:
  • 8邻域:N4§与ND§合称为p的8邻域,记为N8(pP)。当P点位于边界时,N4§,ND§,N8§中的某些点是位于图像之外的。如图3-12所示:
    在这里插入图片描述

3.2:像素的邻接性和连通性

像素的连通(邻接)性是描述图像的 区域、边界(边缘) 的重要概念,在以像素级别的分割、聚类、边缘检测中应用。

两个像素连通的2个必要条件是:

  • 两个像素邻接(一个像素在另外一个像素的邻域内)
  • 两个像素值之间是否满足某种相似性(相等)

根据第一个条件中邻接的邻域不同,又可以将邻接分为以下几种:
在这里插入图片描述

对于具有值v的像素P和Q,如果:Q在集合N4(P)中,或Q在集合ND(P)中,并且N4(P)与N4(Q)的交集没有v值的像素。则称P和Q这两个像素是混合邻接(连通)的,也称为 m邻接(连通) 的,即4邻接和D邻接的混合邻接。如下图所示:

在这里插入图片描述

混合邻接的作用?看下图3-18可以看到,当适用8邻接时,中间像素到达右下角像素有两条路径(分别可以理解为4邻域和8邻域),这两条路径的存在也就是在一些教材里看到的“二义性”,在图像的边缘检测中是不愿意发生这种情况的。

3-19中使用了m邻接后,可以看到路径只剩下一个。M邻接本质是消除了8邻接多余的连接路径,更通俗的理解是:当像素间同时存在4邻接和8邻接时,优先采用4邻接,屏蔽和一个像素同时存在4邻接的两个像素之间的8邻接。

在这里插入图片描述

⭐三种邻接的关系可总结为:

1)4邻接必8邻接,而8邻接不一定4邻接
2)m邻接必8邻接,而8邻接不一定m邻接。

3.3:路径

1条从坐标(x,y)的像素P到坐标(s,t)的像素Q的路径,是特定的坐标序列,其坐标为:(xo,yo),(x1,y1),…(xn,yn)。其中,(xo,yo)=(x,y),(xn,yn)=(s,t)(x,y)邻接于(xi-1,yi-1),1≤i≤n,n是路径的长度。

可以用定义邻接的方法定义如图3-20所示的8-路径,图3-21所示的m-路径和图3-22所示的4-路径。
在这里插入图片描述

3.4:连通集和距离

  • 通路的定义:
    一条从具有坐标(x,y)的像素p,到具有坐标(s,t)的像素q的通路,是具有坐标(x0,y0),(x1,y1),…,(xn,yn)的不同像素的序列。其中,(x0,y0) = (x,y),(xn,yn) = (s,t),(xi,yi) 和(xi-1,yi-1)是邻接的,1 ≤ i ≤ n,n是路径的长度。如果(x0,y0) = (xn,yn) ,则该通路是闭合通路.

  • 距离
    像素之间距离的定义—对于像素p、q和z,分别具有坐标(x,y),(s,t)和(u,v),如果
    (1) D(p,q) ≥ 0 (D(p,q)=0,当且仅当p =q),
    (2) D(p,q) = D(q,p)
    (3) D(p,z) ≤ D(p,q) + D(q,z
    则称D是距离函数或距离度量

    1. 欧式距离定义— 像素p(x,y)和q(s,t)间的欧式距离定义如下:
      在这里插入图片描述
    2. D4距离(城市距离)—像素p(x,y)和q(s,t)之间的D4距离定义为:D4(p,q) = |x – s| + |y – t|
      D4距离举例:
      具有与(x,y)距离小于等于某个值r的那些像素形成一个菱形,
      例如,与点(x,y)(中心点)D4距离小于等于2的像素,形成右边
      固定距离的轮廓
      具有D4 = 1的像素是(x,y)的4邻域
      在这里插入图片描述
    3. D8距离(棋盘距离)像素p(x,y)和q(s,t)之间的D8距离
      定义为:D8(p,q) = max(|x – s| ,|y – t|)
      D8距离举例
      具有与(x,y)距离小于等于某个值r的那些像素形成一个正方形,例如,与点(x,y)(中心点)D8距离小于等于2的像素,形成右边固定距离的轮廓,具有D8 = 1的像素是(x,y)的8邻域。
      在这里插入图片描述

四、灰度直方图

图像特征的一种表示方式,横坐标对应划分的相应的灰度量化级别,纵坐标表示对应级别的像素数量。

在这里插入图片描述

灰度直方图的绘制代码如下:

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('kitten.jpg', cv2.IMREAD_GRAYSCALE)# 计算直方图
hist = cv2.calcHist([image], [0], None, [256], [0, 256])# 绘制直方图
plt.figure()
plt.title('Grayscale Histogram')
plt.xlabel('Bins')
plt.ylabel('# of Pixels')
plt.plot(hist)
plt.xlim([0, 256])
plt.show()

实际工作中,也可以利用三维直方图来综合反映图像灰度分布和邻域空间相关信息。以及灰度图像各分量间的关系。
在这里插入图片描述
三维灰度直方图的绘制:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import cv2
import numpy as np# 2. 绘制图像的三维灰度直方图
# Replace 'input_image.jpg' with the actual path to your image file
image = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)
if image is None:print("Error: Image not found or unable to read.")
else:x_pos, y_pos = np.meshgrid(range(image.shape[1]), range(image.shape[0]))x_pos = x_pos.flatten()y_pos = y_pos.flatten()z_pos = np.zeros(x_pos.shape)z_val = image.flatten()fig = plt.figure(figsize=(8, 6))ax = fig.add_subplot(111, projection='3d')# Use bar3d to draw the bars for each pixelax.bar3d(x_pos, y_pos, z_pos, 1, 1, z_val, shade=True)ax.set_title('3D Graylevel Histogram')ax.set_xlabel('X axis')ax.set_ylabel('Y axis')ax.set_zlabel('Gray Level')plt.show()

五、图像的分类

5.1:二值图像(黑白图像)

上文在讲到量化级别的时候也讲到,如果只有0,1黑白两个量化级别,那么这个图像其实就是二值图像,它的像素值可以只用1bit来存储。

以下是根据阈值划分,将灰度图像转换为二值图像的代码:

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('kitten.jpg', cv2.IMREAD_GRAYSCALE)# 使用Otsu的二值化
ret, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 显示二值图像
plt.imshow(binary_image, cmap='gray')
plt.title('Binary Image')
plt.axis('off') # 不显示坐标轴
plt.show()

5.2:灰度图像

灰度图像的这个“灰度”,其实只得就是这个像素的明暗程度信息,通常将其量化为0~255,即一个像素用1byte即可存储该像素点的灰度信息。很多彩色RGB三通道的图像无法处理,就需要转化为灰度图像进行处理。

下面给出彩色图像转灰度图像的代码:

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('kitten.jpg')# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 显示灰度图像
plt.imshow(gray_image, cmap='gray')
plt.title('Grayscale Image')
plt.show()

5.3:彩色图像

彩色图像除了含有明暗亮度信息以外,还需要含有颜色信息。最常见的就是在RGB彩色空间中表示的颜色信息:

在RGB彩色空间中,一幅彩色数字图像的各个像素的信息由RGB三原色信息构成,其中R(红)、G(绿)、B(蓝)是由不同的灰度级来描述的,三者共同决定了像素的亮度和色彩。值得注意的是,RGB三通道图像并非红绿蓝三色,而是三个灰度图像。如图所示:
在这里插入图片描述

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('kitten.jpg')# 分离RGB通道
channels = cv2.split(image)# 设置图像标题
titles = ['Red Channel', 'Green Channel', 'Blue Channel']# 显示每个通道的灰度图像
plt.figure(figsize=(10, 3))
for i in range(3):plt.subplot(1, 3, i+1)plt.imshow(channels[i], cmap='gray')plt.title(titles[i])plt.axis('off') # 不显示坐标轴
plt.show()

5.4:矢量图

矢量图其实本质上就和以上的图像不属于一类了,它不是由像素的形式进行存储和处理。它是一种使用数学公式来描述图像,进而在屏幕上将图像绘制出来的一种手段。

矢量图使用数学方程式来描述图像中的线条和曲线,它定义了图像中所有形状的点、线和曲线的几何和颜色属性。这些数学方程允许矢量图在任何分辨率和任何尺寸下缩放而不会失真。

5.5:索引图像

索引图像无非就是从RGB图像中选取一些颜色,作为图像的调色板。学过K-means的应该可以理解,先用k-means对图像颜色聚成几类(一个新的调色板),然后用这些颜色对图像像素进行重新映射。

在这里插入图片描述

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

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

相关文章

LLVM入门教学——SanitizerCoverage插桩(Linux)

1、介绍 LLVM 的 SanitizerCoverage 是一种代码覆盖工具,设计用于支持基于 fuzzing 的测试和其他安全相关工具。SanitizerCoverage 在编译时插桩代码,以在运行时收集覆盖信息,从而帮助识别未覆盖的代码路径,提高测试的有效性和全…

算法-随机快排及荷兰国旗优化

文章目录 算法介绍 :1. 随机快排解析2. 荷兰国旗问题3. 随机快排优化4. 总结随机快排 算法介绍 : 随机快速排序和传统的快速排序的逻辑本质是一致的,都是找到一个值作为划分的中间位置,左边数值均小于该数值,右边数值均大于该数值,但是与传统的快排又不一致的是,我们的这个位置…

国内的期权模拟账户怎么申请?

国内的期权模拟账户可以在券商和期权分仓平台处申请开通,期权相比于股票具有杠杆投资、风险控制等新特性。 期权模拟交易客户端能够提供期权的开平仓交易、备兑开仓/平仓、行权等交易指令,下文为大家介绍国内的期权模拟账户怎么申请&#xff…

2024 cicsn Ezheap

文章目录 检查 libc2.35利用adddeleeditshow 思路exp结果 检查 libc2.35 利用 add 0x80个chunk&#xff0c;遍历选一个没有被用的&#xff0c;输入的size<0x501,然后malloc后会清零安装输入的size&#xff0c;然后输入内容&#xff0c;长度也是输入的size dele 指定索引…

第十六课,海龟画图:设置画笔颜色、宽度函数,移动画笔函数

一&#xff0c;turtle.color()&#xff1a;画笔颜色函数 这个函数能设置画笔画出来的颜色&#xff0c;当然&#xff0c;使用它之前你需要认识有哪些“颜料”可供你选择&#xff0c;turtle库的color()函数可以选择以下颜色&#xff1a; "white" 白色&#xff08;建议…

3步轻松月入过万,APP广告新模式大揭秘!

万万没想到&#xff1a;用这个APP广告模式&#xff0c;月入过万竟然如此简单&#xff01; 在移动应用开发的世界里&#xff0c;变现一直是一道难题。 许多APP开发者和产品经理为了提高收益、增强用户黏性&#xff0c;不断尝试各种策略。 然而&#xff0c;很多时候&#xff0c…

2024-6-1 石群电路-20

2024-6-1&#xff0c;星期六&#xff0c;18:24&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。已经到学校啦&#xff0c;本来打算今天休息一天不更了&#xff0c;但是觉得可以更新完再休息&#xff0c;没有这么累&#xff0c;哈哈哈哈&#xff0c;这就不得不说…

阿里云部署nodejs

目录 1、安装node.js 1-1 进入opt/software 1-2 下载node.js安装包 1-3 解压 2 配置环境变量 2-1 vim中配置环境变量 2-2 命令行中保存环境变量 2-3 检查安装版本 2-3 更换镜像 3、上传node.js项目 1-1 启动项目 1-2 配置对应的安全组 ​编辑 4、pm2启动多个node项…

Linux目录的基本结构(RHEL8系统基本使用之文件操作)

1.Linux的目录树结构 2.各目录的功能介绍 3.理解文件路径表示方法 Who&#xff1f;——>当前登录的用户 Where?——>路径 我要在哪儿创建文件&#xff1f; 我要删除什么地方的什么文件&#xff1f; 我所要查看的文件在哪里&#xff1f; What?——>操作命令 Ho…

Ultralytics x SwanLab:可视化YOLO模型训练

Ultralytics是YOLO官方团队推出的CV训练与推理框架&#xff0c;不仅支持目标检测任务&#xff0c;还支持分割、姿态识别、分类等更多任务。 SwanLab是一个深度学习实验管理与训练可视化工具&#xff0c;由西安电子科技大学团队打造&#xff0c;融合了Weights & Biases与Ten…

java web爬虫

目录 读取本地文件 从网站读取文件 java爬虫 总结 读取本地文件 import java.io.File; import java.io.PrintWriter; import java.util.Scanner;public class ReplaceText {public static void main() throws Exception{File file new File("basic\\test.txt"…

vue3:插槽、具名插槽、条件插槽、作用域插槽、具名作用域插槽 一次性搞清楚 --- 通俗易懂

1、插槽的使用&#xff1a; ~父组件index.vue&#xff1a; <h3>我是父组件testSlot</h3> <!-- 调用子组件alertBox测试插槽 --> <alertBox></alertBox> <alertBox>Something good will be happened. /alertBox> <br> ~alertBo…

钓虾馆计时计费怎么用,佳易王钓虾馆钓鱼场计时器工具软件操作教程

钓虾馆计时计费怎么用&#xff0c;佳易王钓虾馆钓鱼场计时器工具软件操作教程 一、前言 以下软件操作教程以&#xff0c;佳易王钓虾馆钓鱼场计时计费软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 可以多种单价计费方式&#xff0c;在系统…

Elasticsearch 认证模拟题 - 4

一、题目 生成快照&#xff0c;或快照生命周期 1.1 考点 快照生命周期&#xff08;最好通过界面化配置&#xff09;创建仓库创建快照 &#xff08;因为这个需要部署共享文件&#xff0c;所以这个我就在虚拟机上简单操作一下&#xff09; 注&#xff1a; 部署共享文件系统可…

【开发利器】使用OpenCV算子工作流高效开发

学习《人工智能应用软件开发》&#xff0c;学会所有OpenCV技能就这么简单&#xff01; 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV实验大师Python SDK 基于OpenCV实验大师v1.02版本提供的Python SDK 实现工作流导出与第三方应用集…

MySql全文索引+Ngram

一、关于Ngram 1.1 什么是ngram MySQL 内置的全文解析器使用单词之间的空格作为分隔符&#xff0c;这对于不使用空格做分隔符的语言是一种限制。为了解决这一限制&#xff0c;MySQL提供了一个支持中文、日文和韩文&#xff08;CJK&#xff09;的ngram全文解析器。ngram 全文解…

图像加雾算法的研究与应用

目录 前言 一、图像加雾 1、基于传统方法的雾图合成 2、基于深度学习的雾图合成 3、基于Lightroom Classic实现软件加雾 4、基于深度图的方法实现加雾 二、开源的数据集 三、参考文章 前言 在去雾任务当中&#xff0c;训练和评估去雾算法需要大量的带有雾霾和无雾霾的…

聊聊几种常见的分布式Session解决方案

highlight: xcode theme: vuepress 问题引入&#xff1a;什么是分布式Session&#xff1f; 分布式 Session 是指在多台服务器之间共享和管理用户的会话数据&#xff0c;使得用户的会话状态能够在不同的服务器上保持一致。这样&#xff0c;无论用户的请求被路由到哪台服务器&…

【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、变量1.1 基础知识1.2 包级变量的声明形式深入解析&#x1f4cc; 声明并同时显式初始化&#x1f4cc; 声明但延迟初始化&#x1f4cc; 声明聚类与就近原则 1.3 局部变量的声明形式深入探讨&#x1f4cc; 延迟初始化的…

你认识nginx吗,nginx是做什么的,nginx可以做什么 --1)nginx介绍

一.Nginx 介绍 Nginx&#xff08;发音同engine x&#xff09;是一个异步框架的 Web 服务器&#xff0c;也可以用作反向代理&#xff0c;负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建&#xff0c;并于2004年首次公开发布。同名公司成立于2011年&#xff0c;以提供支持。…