数字图像处理(三:图像如果当作矩阵,那加减乘除处理了矩阵,那图像咋变):从LED冬奥会、奥运会及春晚等等大屏,到手机小屏,快来挖一挖里面都有什么
数字图像处理(三)
- 一、(准备工作:咋玩,用什么玩具)图像以矩阵形式存储,那矩阵一变、图像立刻跟着变?
- 1. Python + Jupyter Notebook/Lab + 库 (NumPy, OpenCV, Matplotlib, scikit-image)
- 2. MATLAB + Image Processing Toolbox
- 3. JavaScript + HTML5 Canvas + 浏览器
- 4. 专业的图像处理软件 (带脚本/插件功能)
- 二、(准备工作:玩具咋买咋装)图像以矩阵形式存储,那矩阵一变、图像立刻跟着变?
一、(准备工作:咋玩,用什么玩具)图像以矩阵形式存储,那矩阵一变、图像立刻跟着变?
你好! 从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]; // Reddata[i + 1] = 255 - data[i + 1]; // Greendata[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
- 认准一个头像,保你不迷路:
- 认准一个头像,保你不迷路: