Opencv(一): 用Opencv了解图像

文章目录

思维导图

前言

我们每天浏览的图片、视频,在计算机眼中并非"画面",而是一串有规律的数字和数组。本文从底层原理到实操细节,逐点拆解计算机处理图像的核心逻辑,帮你建立"数字视角"理解图像。

一、图像的最小单元

像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征,一张

图片是由很多个像素组成的。

要理解计算机如何看图像,必须先吃透像素的3个核心属性:

1. 像素的本质

像素(Pixel = Picture Element)是图像的基本构成单元,每个像素都承担着"存储信息"的功能,具体包含两类关键数据:

  • 颜色信息:决定该像素显示什么颜色(如红色、蓝色,或灰度图中的明暗);
  • 位置信息:在图像中的具体坐标(如第3行第5列),确保像素按顺序排列成完整画面。

举个直观例子:一张1920×1080分辨率的图片,意味着它横向有1920个像素,纵向有1080个像素,总像素数为1920×1080=2,073,600个------每个像素都有自己的颜色和位置,共同组成我们看到的画面。

2. 像素的存储形式

计算机只能识别二进制(0和1),因此像素的信息会被转化为二进制数字存储,但我们日常查看时会以十进制或十六进制显示,核心规则如下:

  • 单通道(如灰度图):每个像素用8位二进制表示,对应十进制的0-255,共256种状态。其中,0代表纯黑色,255代表纯白色,1-254对应不同深浅的灰色(数值越大,颜色越亮);
  • 多通道(如RGB彩色图):每个像素由多个通道的数值组合而成,每个通道同样遵循0-255的范围,组合后可表示的颜色总数为255×255×255≈1678万种,足以覆盖人眼能识别的绝大多数颜色。

比如"纯红色"像素,在RGB模型中对应的十进制数值是(255,0,0),转化为二进制就是(11111111, 00000000, 00000000),这就是计算机存储该像素的"原始语言"。

二、图像的颜色体系

日常生活中99%的彩色图像都基于RGB颜色模型,它是计算机处理彩色信息的"通用标准",需要从"通道定义""混合规则""特殊注意事项"三个维度理解:

注意:在OpenCV中像素值的存储顺序是 BGR而不是RGB。 计算机处理图像本质上就是对三维数组中的像素值进行操作。

1. RGB三通道的定义

日常生活中常见的图像都是RGB三色图,R代表红色、G代表绿色、B代表蓝色。

RGB图是由很多个像素点构成的,每一个像素点都是由R、G、B三个颜色混合而

成的,几乎所有的颜色都可以通过这三种颜色合成。

而在计算机中,RGB三种颜色被称为RGB三通道,且每个通道的取值都是0-255,

根据这三个通道存储的像素值来对应不同的颜色。

RGB分别对应三种基础色光:Red(红色)、Green(绿色)、Blue(蓝色),这三种色光被称为"三原色光",其核心特性是:

  • 独立性:每个通道的数值独立控制对应色光的强度,互不干扰;
  • 叠加性:三种色光按不同强度叠加,可生成几乎所有可见颜色(这与颜料混合的"减法原理"不同,RGB是"加法混色")。

例如:

  • 红色(255,0,0)+ 绿色(0,255,0)= 黄色(255,255,0);
  • 红色(255,0,0)+ 蓝色(0,0,255)= 品红色(255,0,255);
  • 绿色(0,255,0)+ 蓝色(0,0,255)= 青色(0,255,255);
  • 红+绿+蓝(255,255,255)= 白色,(0,0,0)= 黑色。

2. 通道数值的物理意义

每个RGB通道的数值范围是0-255,这个范围并非随意设定,而是由"8位二进制"的存储能力决定(2^8=256,即0到255共256个等级),数值大小直接对应色光的"亮度":

  • 数值=0:该色光完全不发光,通道"关闭";
  • 数值=255:该色光发光强度最大,通道"满功率";
  • 数值介于0-255之间:色光强度按比例减弱,比如R=128代表红色亮度是最大值的50%。

我们在"画图"软件或设计工具中看到的"十六进制颜色码"(如#FF0000),本质就是RGB数值的简写:FF对应十进制255(红色通道),00对应0(绿色通道),00对应0(蓝色通道),即纯红色。

3. 灰度图与单通道

灰度图是RGB图像的"简化形式",它仅保留"亮度信息",舍弃"颜色信息",对应计算机中的"单通道"存储:

  • 存储维度:仅用二维数组表示,维度为"图像高度(行数)× 图像宽度(列数)";
  • 数值意义:每个位置的数值(0-255)直接代表该像素的亮度,0=纯黑,255=纯白,中间数值对应不同灰度(如128=中灰色);
  • 应用场景:文字识别、边缘检测等场景中,灰度图能减少计算量(无需处理3个通道),同时保留关键的轮廓信息。

三、存储图像的核心

很多人误以为图像是"可视化的图片文件",但在计算机内存中,它的本质是多维数组------所有图像处理(如裁剪、调色、滤波),最终都是对数组中数值的修改。

1. 不同类型图像的数组维度

我们以"7×7像素"的图像(横向7列,纵向7行)为例,拆解不同图像的数组结构:

图像类型 数组维度 维度含义 示例(数组形状) 每个元素的意义
灰度图 二维数组 高度(行)× 宽度(列) (7, 7) 单个0-255的亮度值
RGB彩色图 三维数组 高度(行)× 宽度(列)× 3(RGB通道) (7, 7, 3) 长度为3的列表,分别对应R、G、B值(如[255,0,0])

举个具体例子:一张7×7的RGB彩色图,数组中"第2行第3列"的元素是[255,0,0],意味着该位置的像素是纯红色------其中"第2行第3列"是像素的位置,[255,0,0]是像素的颜色信息。

2. OpenCV的BGR通道顺序

在实际编程中,有一个极易踩坑的细节:OpenCV库存储RGB图像时,通道顺序是BGR(蓝→绿→红),而非常规的RGB

这意味着:

  • 当你用OpenCV读取一张"纯红色"图片时,计算机内存中存储的数组元素是[0,0,255](B=0, G=0, R=255),而非[255,0,0];
  • 若直接用OpenCV显示读取的图像,颜色会出现"反转"(如红色变蓝色),需通过cv2.cvtColor(img, cv2.COLOR_BGR2RGB)将BGR转为RGB,才能正常显示颜色。

这个细节的根源是OpenCV的历史设计,但作为初学者必须牢记,否则会导致后续实验或项目中颜色处理异常。

四:实验现象

注意:输出的名字不要写重复的,不然会覆盖之前的图像
代码核心逻辑解析

cpp 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 创建一个空白的 700x700 彩色图像
image = np.zeros((700, 700, 3), dtype=np.uint8)

# 绘制黑色边框,每个 100x100 像素的块周围
block_size = 100
for i in range(0, 700, block_size):
    for j in range(0, 700, block_size):
        top_left = (j, i)
        bottom_right = (j + block_size - 1, i + block_size - 1)

        # 绘制 X 型图案,将两个对角线方向的块填充为红色
        if ((i // block_size == j // block_size) or (i // block_size + j // block_size == 6)) and (i != 0) and (i != 600):
            cv2.rectangle(image, top_left, bottom_right, (0, 0, 255), -1)  # 使用 -1 填充矩形为红色
        else:
            cv2.rectangle(image, top_left, bottom_right, (255, 255, 255), 2)  # 绘制其他块的白色边框

# 将 BGR 通道顺序转换为 RGB 顺序,用于 Matplotlib 显示
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 在 Jupyter Notebook 中显示图像
plt.imshow(image_rgb)
plt.title('Original Image')
plt.axis('off')  # 不显示坐标轴
plt.show()

# 拆分彩色通道
b, g, r = cv2.split(image)

# 创建空白图像,用于每个通道
blue_channel = np.zeros((700, 700, 3), dtype=np.uint8)
green_channel = np.zeros((700, 700, 3), dtype=np.uint8)
red_channel = np.zeros((700, 700, 3), dtype=np.uint8)

# 分配颜色通道数据
blue_channel[:, :, 0] = b
green_channel[:, :, 1] = g
red_channel[:, :, 2] = r

# 将 BGR 通道顺序转换为 RGB 顺序,用于 Matplotlib 显示
blue_channel_rgb = cv2.cvtColor(blue_channel, cv2.COLOR_BGR2RGB)
green_channel_rgb = cv2.cvtColor(green_channel, cv2.COLOR_BGR2RGB)
red_channel_rgb = cv2.cvtColor(red_channel, cv2.COLOR_BGR2RGB)

# 在 Jupyter Notebook 中显示拆分的颜色通道
plt.subplot(131)
plt.imshow(blue_channel_rgb)
plt.title('Blue Channel')
plt.axis('off')

plt.subplot(132)
plt.imshow(green_channel_rgb)
plt.title('Green Channel')
plt.axis('off')

plt.subplot(133)
plt.imshow(red_channel_rgb)
plt.title('Red Channel')
plt.axis('off')

plt.tight_layout()
plt.show()

输出结果为:

五.总结

本文从图像的基础构成到计算机存储逻辑,再到实验实操,拆解了计算机 "看" 图像的核心逻辑:像素是图像的最小单元,通过 0-255 的数值存储颜色与亮度;RGB 三通道以加法混色原理生成彩色,灰度图则用单通道简化存储亮度;而计算机本质是将图像以多维数组形式处理,OpenCV 的 BGR 通道顺序是实操中需重点注意的细节。

相关推荐
m0_650108244 小时前
【论文精读】Animate Anyone:实现角色动画的一致性与可控性图像到视频合成
计算机视觉·扩散模型·论文精读·图像到视频合成·角色动画·姿态引导器·可控生成
墨香幽梦客4 小时前
掌控制造脉络:电子元器件行业常用ERP系统概览与参考指南
大数据·人工智能
B站_计算机毕业设计之家4 小时前
基于python人脸识别系统 人脸检测 实时检测 深度学习 Dlib库 ResNet深度卷积神经网络 pyqt设计 大数据(源码)✅
python·深度学习·目标检测·计算机视觉·信息可视化·人脸识别·1024程序员节
大模型知识营地4 小时前
详解 astream 方法与 stream_mode,构建高级人机交互 Agent
人工智能
知行力6 小时前
百度PaddleOCR-VL:基于0.9B超紧凑视觉语言模型,支持109种语言,性能超越GPT-4o等大模型
人工智能·百度·1024程序员节
deephub6 小时前
vLLM 性能优化实战:批处理、量化与缓存配置方案
人工智能·python·大语言模型·1024程序员节·vllm
云飞云共享云桌面6 小时前
东莞精密机械制造工厂5个SolidWorks设计共享一套软件
运维·服务器·网络·人工智能·自动化·制造
Theodore_10226 小时前
机器学习(9)正则化
人工智能·深度学习·机器学习·计算机视觉·线性回归·1024程序员节
莫叫石榴姐6 小时前
半导体晶圆制造关于设备制程几个核心概念及映射关系
人工智能·机器学习·制造