当前位置: 首页 > article >正文

【图像处理入门】1. 数字图像的本质:从像素到色彩模型

作为图像处理的开篇,本文将带你拆解数字图像的底层逻辑:从模拟图像到数字信号的神奇转换,到像素世界的微观构成,再到彩色图像的编码奥秘。通过 Python 代码实战,你将亲手触摸图像的 “基因”—— 像素值,并学会用 OpenCV 和 Matplotlib 揭开图像的物理本质。


一、从照片到数字:图像的数字化过程

你手机里的照片是如何变成电脑能识别的文件?这需要经过采样量化两个关键步骤:

1. 模拟图像的数字化三步曲

  • 采样(Sampling):把连续的图像空间坐标离散化。想象用网格纸覆盖照片,每个网格交点就是一个采样点,网格密度决定了图像分辨率(如 1920×1080 表示横向 1920 个、纵向 1080 个采样点)。
  • 量化(Quantization):把连续的像素值转化为离散的整数值。每个采样点的颜色亮度被量化为 0-255 的整数(如 8 位量化有 256 个等级),量化精度用 “位深度” 表示(常见 8 位、16 位、24 位)。
  • 编码(Coding):将量化后的数值按特定格式存储(如 BMP、JPEG、PNG)。

2. 分辨率 vs 位深度:图像的两大 DNA

  • 分辨率:决定图像的细节丰富度(单位:像素 / 英寸,PPI)
    在这里插入图片描述

  • 位深度:决定颜色的表达能力

    • 灰度图像:位深度 = 8 → 256 级灰度(0 = 纯黑,255 = 纯白)
    • 彩色图像:常见 24 位(RGB 各 8 位)→ 1677 万种颜色

二、像素:图像的最小语言单位

每个像素包含位置(x,y 坐标)和颜色值两个核心信息,我们通过 Python 代码来直观感受:

1. 用 OpenCV 读取图像像素值

import cv2# 读取灰度图像(0表示灰度模式)
gray_img = cv2.imread('lena_gray.png', 0)# 读取彩色图像(默认BGR模式)
color_img = cv2.imread('lena_color.png', 1)# 查看图像尺寸(高, 宽)和通道数
print("灰度图尺寸:", gray_img.shape)     # (512, 512)
print("彩色图尺寸:", color_img.shape)   # (512, 512, 3)# 读取坐标(100, 100)的像素值
gray_pixel = gray_img[100, 100]         # 灰度值:0-255
color_pixel = color_img[100, 100]       # BGR值:[蓝, 绿, 红]的列表print("灰度像素值:", gray_pixel)       # 输出:189
print("彩色像素值:", color_pixel)       # 输出:[187, 179, 190]

2. 像素值的可视化:Matplotlib 显示图像

import matplotlib.pyplot as plt# 显示灰度图像(需手动设置cmap为灰度模式)
plt.subplot(121), plt.imshow(gray_img, cmap='gray')
plt.title('Gray Image'), plt.xticks([]), plt.yticks([])# 显示彩色图像(注意OpenCV的BGR需转为RGB)
rgb_img = cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB)
plt.subplot(122), plt.imshow(rgb_img)
plt.title('Color Image'), plt.xticks([]), plt.yticks([])plt.show()

三、彩色图像的三种 “语言”:色彩模型

现实中的颜色需要通过不同的数学模型转化为数字信号,以下是图像处理中最常用的三种模型:

1. RGB 模型:电子设备的通用语言

  • 原理:通过红(Red)、绿(Green)、蓝(Blue)三原色的不同强度叠加表示颜色
    • 黑色:[0, 0, 0]
    • 白色:[255, 255, 255]
    • 黄色:[0, 255, 255](注意 OpenCV 中顺序为 BGR!)
  • 应用场景:图像显示(显示器、相机)、图像存储(JPEG/PNG 默认格式)

2. HSV 模型:更符合人类视觉的模型

  • 三个通道
    • H(色调 Hue):颜色种类(0-180°,0 = 红色,60 = 黄色,120 = 绿色…)
    • S(饱和度 Saturation):颜色纯度(0%= 灰色,100%= 纯彩色)
    • V(明度 Value):颜色亮度(0%= 黑色,100%= 最亮)
  • 优势:调节色调 / 饱和度比 RGB 更直观,常用于图像分割(如提取红色物体)
# RGB转HSV
hsv_img = cv2.cvtColor(color_img, cv2.COLOR_BGR2HSV)

3. YUV 模型:视频编码的效率之选

  • 三个分量
    • Y:亮度(Luminance),决定图像明暗
    • U/V:色度(Chrominance),决定颜色信息
  • 优势:分离亮度和色度,压缩时可降低色度分辨率(节省带宽),广泛用于视频传输(如 H.264 编码)

四、灰度图像 vs 彩色图像:本质区别

特征灰度图像彩色图像
数据维度二维矩阵(高 × 宽)三维矩阵(高 × 宽 × 通道数)
颜色表示单通道 0-255 灰度值多通道颜色分量组合
存储空间小(512×512 图像约 256KB)大(同尺寸 RGB 图像约 768KB)
处理速度快(单通道计算量小)慢(需处理三个通道)
应用场景预处理(边缘检测、OCR)图像识别、视觉感知

五、动手实践:查看图像的 “基因序列”

尝试用代码完成以下任务(素材可使用经典的 Lena 图像):

  1. 读取任意彩色图像,输出中心像素的 BGR 值
  2. 将图像转换为 HSV 模式,调节 V 通道值观察亮度变化
  3. 计算图像的总像素数量(高 × 宽)和数据大小(字节数)
# 计算图像数据大小(假设是8位量化的RGB图像)
height, width, channels = color_img.shape
data_size = height * width * channels  # 单位:字节
print(f"图像数据大小:{data_size} Bytes ({data_size/1024:.2f} KB)")

总结

理解数字图像的本质是图像处理的第一步:

  • 图像是离散化的像素矩阵,分辨率和位深度决定了图像的 “先天素质”
  • 灰度图像是单通道的亮度矩阵,彩色图像通过不同色彩模型编码颜色信息
  • OpenCV 的imreadimshow是探索图像本质的显微镜,Matplotlib 则是观察图像的望远镜

下一篇我们将深入图像的基本操作,学会用代码对像素矩阵进行 “外科手术”—— 裁剪、缩放、通道操作。现在请打开你的 IDE,用print(img.shape)开启属于你的图像处理之旅吧!

思考:为什么相机拍摄的 JPEG 图像在 PS 中打开和用 OpenCV 读取的颜色可能不同?(提示:颜色空间转换)

相关文章:

【图像处理入门】1. 数字图像的本质:从像素到色彩模型

作为图像处理的开篇,本文将带你拆解数字图像的底层逻辑:从模拟图像到数字信号的神奇转换,到像素世界的微观构成,再到彩色图像的编码奥秘。通过 Python 代码实战,你将亲手触摸图像的 “基因”—— 像素值,并…...

(已解决:基于WSL2技术)Windows11家庭中文版(win11家庭版)如何配置和使用Docker Desktop

目录 问题现象: 问题分析: 拓展: 解决方法: 1、使用WSL2技术(亲测有效) 注意: 2、开启Hyper-V功能(未经亲测,待研究) 问题现象: 今天想在本…...

Ubuntu20.04部署KVM

文章目录 一. 环境准备关闭防火墙(UFW)禁用 SELinux更换镜像源检查 CPU 虚拟化支持 二. 安装KVM安装 KVM 及相关组件启动 libvirtd 服务验证安装创建虚拟机 一. 环境准备 4C8G,50G硬盘——VMware Workstation需要给虚拟机开启虚拟化引擎 roo…...

OpenCV CUDA 模块图像过滤------创建一个高斯滤波器函数createGaussianFilter()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::createGaussianFilter 是 OpenCV CUDA 模块中的一个工厂函数,用于创建一个高斯滤波器。这个滤波器可以用来平滑图像&#…...

计算机视觉与深度学习 | matlab实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据)

以下是一个基于MATLAB的ARIMA-WOA-CNN-LSTM时间序列预测框架。由于完整代码较长,此处提供核心模块和实现思路,完整源码和数据可通过文末方式获取。 1. 数据准备(示例数据) 使用MATLAB内置的航空乘客数据集: % 加载数据 data = readtable(airline-passengers.csv); data …...

可视化图解算法43:数组中的逆序对

1. 题目 ​牛客网 面试笔试TOP101 描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007 数据范围&…...

【Python】使用Python实现调用API获取图片存储到本地

使用Python实现调用API获取图片存储到本地 目录 使用Python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现5、结果查看 1、项目概述 开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始…...

腾讯2025年校招笔试真题手撕(一)

一、题目 有n 把钥匙,m 个锁,每把锁只能由一把特定的钥匙打开,其他钥匙都无法打开。一把钥匙可能可以打开多把锁,钥匙也可以重复使用。 对于任意一把锁来说,打开它的钥匙是哪一把是等概率的。但你无法事先知道是哪一把…...

Vue3 与 Vue2 区别

一、Vue3 与 Vue2 区别 对于生命周期来说,整体上变化不大,只是大部分生命周期钩子名称上 “on”,功能上是类似的。不过有一点需要注意,组合式API的Vue3 中使用生命周期钩子时需要先引入,而 Vue2 在选项API中可以直接…...

java集合详细讲解

Java 8 集合框架详解 Java集合框架是Java中最重要、最常用的API之一,Java 8对其进行了多项增强。下面我将全面讲解Java 8中的集合框架。 一、集合框架概述 Java集合框架主要分为两大类: Collection - 单列集合 List:有序可重复Set&#xf…...

嵌入式学习笔记 - STM32 U(S)ART 模块HAL 库函数总结

一 串口发送方式: ①轮训方式发送,也就是主动发送,这个容易理解,使用如下函数: HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); ②中断方式发送&#xff…...

【VLNs篇】04:SayNav-为新环境中的动态规划到导航进行大型语言模型的基础构建

栏目内容论文标题SayNav: 为新环境中的动态规划到导航进行大型语言模型的基础构建 (SayNav: Grounding Large Language Models for Dynamic Planning to Navigation in New Environments)研究问题自主代理在未知环境中执行复杂导航任务(如MultiON)时&…...

MySQL中添加一个具有创建数据库权限的用户

要在MySQL中添加一个具有创建数据库权限的用户,可按以下步骤操作: 1. 登录MySQL 使用拥有足够权限(一般是root用户 )的账号登录到MySQL数据库。在命令行输入: mysql -u root -p然后输入对应的密码,即可进…...

oracle使用SPM控制执行计划

一 SPM介绍 Oracle在11G中推出了SPM(SQL Plan management),SPM是一种主动的稳定执行计划的手段,能够保证只有被验证过的执行计划才会被启用,当由于种种原因(比如统计信息的变更)而导致目标SQL产生了新的执…...

[Java实战]Spring Boot整合Seata:分布式事务一致性解决方案(三十一)

[Java实战]Spring Boot整合Seata:分布式事务一致性解决方案(三十一) 引言 在微服务架构中,业务逻辑被拆分为多个独立的服务,每个服务可能拥有独立的数据库。当需要跨服务操作多个数据库时,如何保证数据的…...

Openwrt下使用ffmpeg配合自建RTSP服务器实现推流

目前在Openwrt下时mjpg_streamer实现UVC摄像头转网络摄像头的方案很多,这种方案视频服在路由模组中,在局域网中使用很方便。但是对于需要远程监控管理的情况,mjpg_streamer不适应,因为不在局域网中的播放器无法访问到路由模组中的…...

MySQL 索引的增删改查

MySQL 索引的增删改查 1 建表时创建索引 [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [别名] (字段名 [(长度)] [ASC|DESC] )主键直接写: PRIMARY KEY (Id)例如: CREATE TABLE people (id int NOT NULL PRIMARY KEY AUTO_INCREMENT,last_name varchar(10)…...

MySQL Host 被封锁解决方案(全版本适用 + Java 后端优化)

引言 MySQL 中 “Host is blocked because of many connection errors” 是生产环境常见问题,若处理不当会导致服务中断。本文结合 MySQL 官方文档(5.5/8.0)、Java 后端最佳实践及企业级经验,提供从 “快速解封” 到 “根源优化”…...

wifi 如果检查失败,UI 就会出现延迟或缺失打勾的现象。

问题:connectedSsid 的初始化依赖 onCreate 中的状态检查,如果检查失败,UI 就会出现延迟或缺失打勾的现象。 WIFI界面上上的一个标识代表成功连接。重启后出现偶尔不打勾的情况。 原始代码: // if (connectedSsid !…...

点云(point cloud):自动驾驶的“三维扫描图“

点云(Point Cloud):就是用很多“点”来表示一个物体或场景的三维形状和结构。(用点描绘的3D画,好比素描,但不是用线条勾勒,而是“点点点点”拼出物体形状) 观察这幅图像,…...

Redis 中如何保证缓存与数据库的数据一致性?

在 Redis 中保证缓存与数据库的数据一致性是一个关键问题,尤其是在高并发环境下。由于缓存和数据库是两个独立的数据存储系统,它们之间的数据同步存在延迟和不确定性,因此需要采取一系列策略来保证数据的一致性。以下是几种常用的方法和策略&…...

Oracle RAC节点时间差异同步测试

前言: Oracle Real Application Clusters (RAC) 集群依赖于各节点间的心跳检测与缓存融合等机制,这些机制对节点间的时钟同步性有极高的要求。如果集群内不同节点之间存在显著的时间偏差,可能会导致整个集群运行异常。在较早版本的RAC中&…...

python 打卡DAY27

##注入所需库 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import random import numpy as np import time import shap # from sklearn.svm import SVC #支持向量机分类器 # # from sklearn.neighbors import KNeighborsClassifier …...

位运算及其算法

计算机中的所有数在内存中都是以二进制形式进行存储的 ,位运算就是直接对整数二进制位进行操作,有些时候在程序中使用位运算进行操作,会得到极高的便利性。 有符号整数与无符号整数 我们以int整型为例,每个int占4个字节32个bit位…...

flutter getx路由管理、状态管理、路由守卫中间件、永久储存get_storage

一个简单的路由跳转、状态管理 目录 lib/ ├── main.dart ├── routes/index.dart // 路由表 ├── middlewares/auth_middleware.dart // 登录守卫 ├── pages/ │ ├── home_page.dart │ ├── login_page.dart │ └── profile_page.dart └─…...

贪心算法之跳跃游戏问题

问题背景 本文背景是leetcode的一道经典题目:跳跃游戏,描述如下: 给定一个非负整数数组 nums,初始位于数组的第一个位置(下标0)。数组中的每个元素表示在该位置可以跳跃的最大长度。判断是否能够到达最后…...

Dockers Compose常用指令介绍

Dockers Compose常用指令 1、常用指令介绍 1.1、version 指令 顶级一级指令,指定 compose 指定文件格式版本 version: "3.8" services: 不同版本支持的功能不同。常用版本有 ‘2’, ‘3’, ‘3.8’ 等。 1.2、services 指令 顶级一级指令&#xff0…...

YOLOv11 性能评估与横向对比

在第二章中,我们深入剖析了 YOLOv11 的核心技术,从骨干网络、颈部网络到头部,再到损失函数、数据增强和训练策略的创新,揭示了其高性能背后的奥秘。然而,理论的强大最终需要通过严谨的实验数据来验证。本章将详细阐述 …...

kafka在线增加分区副本数

1、问题来源 线上有一个物联网项目依赖kafka集群中指定主题消费,前些天kafka集群中的某一台机器出现了故障,导致kafka这个主题的数据一直无法消费,经查发现为了保证消息的顺序性此主题仅设置了一个分区,但是副本也仅有一个&#…...

Unity 如何使用Timeline预览、播放特效

在使用unity制作和拟合动画时,我们常用到Timeline,前后拖动滑轨,预览动画正放倒放非常方便。如果我们想对特效也进行这个操作,可以使用下文的步骤。 至此,恭喜你又解锁了一个新的技巧。如果我的分享对你有帮助&#xf…...