数字图像处理(三:图像如果当作矩阵,那加减乘除处理了矩阵,那图像咋变):从LED冬奥会、奥运会及春晚等等大屏,到手机小屏,快来挖一挖里面都有什么

发布于:2025-07-20 ⋅ 阅读:(12) ⋅ 点赞:(0)

一、(准备工作:咋玩,用什么玩具)图像以矩阵形式存储,那矩阵一变、图像立刻跟着变?

你好! 从LED冬奥会、奥运会及春晚等等大屏,到手机小屏,快来挖一挖里面都有什么。

为了不拘束各位看官,把各种玩法给大家列出来

1. Python + Jupyter Notebook/Lab + 库 (NumPy, OpenCV, Matplotlib, scikit-image)

  • 完全控制矩阵: 你直接操作的就是图像对应的NumPy数组 (np.array)。每个像素值(R, G, B 或灰度)就是一个矩阵元素。
  • 实时可视化: 在Jupyter Notebook中,一行代码修改矩阵,下一行代码就能用matplotlib.imshow()或cv2.imshow()显示结果图像,变化立竿见影。
  • 强大的库: OpenCV (cv2) 和 scikit-image (skimage) 提供了几乎所有你能想到的图像处理操作(本质都是矩阵运算),并且你能看到它们内部是如何操作矩阵的(或者你自己用NumPy实现)。
  • 交互性 (可选): 结合ipywidgets库,可以创建滑块、按钮等交互控件,动态调整矩阵参数(比如卷积核系数、阈值、亮度增益),图像实时更新,效果极其直观。
    • 你可以实现翻转(np.flip)、旋转(np.rot90)、裁剪(切片[:, :])、颜色空间转换(cv2.cvtColor)、卷积滤波(cv2.filter2D 或手动实现)、阈值分割(np.where)等等。每一步操作后显示图像,变化过程清晰可见。

比如

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 1. 读取图像为NumPy矩阵 (BGR格式)
image = cv2.imread('your_image.jpg') # 矩阵 shape: (height, width, 3)

# 2. 显示原始图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # OpenCV是BGR, matplotlib用RGB
plt.title('Original Image (Matrix)')

# 3. 直接操作矩阵!例如,将红色通道(R)置零
modified_image = image.copy() # 避免修改原图
modified_image[:, :, 2] = 0 # 第3个维度索引2是OpenCV BGR中的R通道

# 4. 显示修改后的图像
plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(modified_image, cv2.COLOR_BGR2RGB))
plt.title('Matrix Changed (Red Channel Zeroed)')
plt.show()

2. MATLAB + Image Processing Toolbox

  • 优点: 如果你在学校或研究所有MATLAB可用,这也是一个非常好的选择。

    • 矩阵是核心: MATLAB本身就是为矩阵运算设计的语言。图像直接表示为矩阵(或高维数组)。
    • 强大的工具箱: Image Processing Toolbox 提供了极其丰富的图像处理函数和优秀的可视化工具 (imshow, imtool)。
    • 交互式工具: 像 imtool 允许你查看像素值、测量距离、调整窗宽窗位等,直接关联底层矩阵。
    • 丰富的文档和示例: 学习资源多。
  • 缺点:

    • 商业软件,需要许可证。
    • 不如Python生态开放和通用。

3. JavaScript + HTML5 Canvas + 浏览器

  • 优点: 如果你想创建一个网页应用或交互式演示来展示图像处理效果,这是最佳选择。库如p5.js可以简化Canvas操作。
    • 高度交互性和可视化: 非常适合构建在线的、交互式的图像处理演示。用户可以在网页上直接操作,效果实时反馈。
    • Canvas API: 可以通过ImageData对象直接访问和操作像素数据(就是一个巨大的Uint8ClampedArray,本质是RGBA一维数组,需要转换处理)。
  • 缺点:
    • 直接操作像素数组相对于NumPy操作多维矩阵来说,有时会更底层、更繁琐一些(需要自己处理索引计算)。
    • 对于复杂的数学运算和大型矩阵操作,性能可能不如Python或C++。
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const img = new Image();
img.onload = function() {
  // 绘制原图
  ctx.drawImage(img, 0, 0);
  // 获取图像矩阵数据 (RGBA)
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const data = imageData.data; // Uint8ClampedArray [R, G, B, A, R, G, B, A, ...]

  // 操作矩阵/像素数据:例如,反转颜色
  for (let i = 0; i < data.length; i += 4) {
    data[i] = 255 - data[i];     // Red
    data[i + 1] = 255 - data[i + 1]; // Green
    data[i + 2] = 255 - data[i + 2]; // Blue
    // Alpha (data[i+3]) 保持不变
  }

  // 将修改后的矩阵数据放回Canvas,图像立刻变化!
  ctx.putImageData(imageData, 0, 0);
};
img.src = 'your_image.jpg';

4. 专业的图像处理软件 (带脚本/插件功能)

  • 例如: GIMP (支持Python-Fu, Script-Fu), ImageJ/Fiji (Java宏, 脚本), Adobe Photoshop (JS脚本, 动作)
  • 优点
    • 提供直观的GUI界面进行常规操作。
    • 脚本/宏允许你编写代码自动化操作(本质上也是在操作像素矩阵)。
  • 缺点
    • 直接访问和可视化底层矩阵不如Python/NumPy或MATLAB方便和透明。
    • 脚本语言可能不如通用编程语言灵活。

二、(准备工作:玩具咋买咋装)图像以矩阵形式存储,那矩阵一变、图像立刻跟着变?

我是个懒蛋,懒得翻,所以就第一种了

  • 安装Anaconda(包含Python和Jupyter Notebook等科学计算库):https://www.anaconda.com/products/individual
  • 安装OpenCV和Matplotlib(如果Anaconda没有自带):
    在Anaconda Prompt中运行
    pip install opencv-python matplotlib scikit-image
    or
    pip install opencv-python matplotlib numpy scikit-image ipywidgets pillow
    

下次开始玩玩具吧,这次先撂了

如果想了解一些成像系统、图像、人眼、颜色等等的小知识,快去看看视频吧 :

  • GodWarrior、抖音号:59412983611
  • B站:宇宙第一AIYWM
    • 认准一个头像,保你不迷路:
      在这里插入图片描述

网站公告

今日签到

点亮在社区的每一天
去签到