SI100B Spring 2025 EE Project

ASIC for Digital Image Processing

Tutorial 1
@Quanyu Chen
chenqy2022@shanghaitech.edu.cn

Contents

Contents

Project tutorial 1

0. About Project

Project tutorial 1

0. About Project

  1. 关于具体的 Project 内容,我们后面会发布一个完整的文档,并跟随课程进度逐步讲解。
  2. 关于 Gradescope:我们至多只对部分组件提出测试要求,主要考察大家功能实现的完整性。
  3. 关于 Project Report:这部分非常重要!
    1. 我们并不会要求你的电路和我们完成的 Reference 完全一致。
    2. 因此,在 Report 中,你需要详细展示你设计的电路和实现思路,以证明你的设计是正确的。
    3. 对于一个非信息学院的学生来说,这也是一个非常重要的素质。
  4. 虽然只需要在最后提交一份 Report,我们每周都会布置一些建议的任务,以帮助你们推进工作。

1. Background

Project tutorial 1

Introduction of DIP

在数字图像处理(Digital Image Processing, DIP)领域,高性能计算需求与日俱增,尤其是在医学影像诊断、电子显微镜成像等对精度与时效性要求严苛的场景中。随着图像分辨率的提升(如4K/8K医学影像、三维电子显微镜断层扫描),传统通用处理器(如CPU、GPU)在实时性、功耗和成本效率方面逐渐面临瓶颈。在此背景下,专用集成电路(Application-Specific Integrated Circuit, ASIC) 凭借其高度定制化、低延迟和高能效比的特性,成为推动DIP技术革新的关键驱动力。

Project tutorial 1

Application of DIP

医学影像系统(如CT、MRI、超声波)依赖复杂的图像重建、降噪、分割和三维可视化算法,而电子显微镜(如透射电镜TEM、扫描电镜SEM)则需要实时处理高分辨率的纳米级图像以捕捉动态过程。这些应用不仅要求海量数据的并行计算能力(如卷积、傅里叶变换、特征提取),还需满足严格的功耗约束(如便携式设备)或实时性要求(如手术导航中的动态成像)。ASIC通过硬件级算法映射,能够将关键计算任务(如滤波、边缘检测、深度学习推断)直接固化为物理电路,从而显著提升处理效率,同时降低能耗与硬件成本。

Project tutorial 1

For out project

在我们的 Project 中,我们将会带领大家接触最最简单的数字图像处理(如灰度转换、边缘检测)和一些相应的电路设计(如简单的卷积运算单元),旨在让大家对数字图像处理过程中的数据流有所了解——从原始图像输入、算法处理到硬件资源分配的完整链路。通过这一实践过程,您将逐步掌握:

  • 基础算法的硬件映射:如何将软件算法转化为硬件模块;
  • 数据流管理:图像处理中像素级数据的传输与处理策略;
  • 低功耗设计思想:在简单场景中理解功耗优化的核心逻辑;
  • 应用拓展思维:从基础模块出发,思考如何构建更复杂的医疗影像处理系统。

通过结合ASIC的定制化优势与DIP的前沿需求,本项目希望为初学者提供一个直观的入门窗口,理解“算法-硬件-应用”的协同关系,并为后续深入探索智能成像系统奠定基础。

2. Introduction to Images

Project tutorial 1

2. Introduction to Images

说在前面:

  • 本章内容主要是科普知识,并不会以任何考试形式考核大家;
  • 讲这些内容则主要处于以下考虑:
    • 了解这些知识有助于增强我们对图像处理的理解;
    • 这些内容在你购买电子产品的时候可能会对你有所帮助

请大家不要焦虑,享受学习的过程吧!

Project tutorial 1

2. Introduction to Images

2.1. 光的混合原理

#c

我们知道,色彩的三原色是红色、绿色和蓝色。我们可以通过混合这些颜色来获得其他颜色。类似的,我们可以通过混合不同的光来获得其他颜色。

光的三原色是红色、绿色和蓝色,这也就是“RGB”模型的由来。我们可以通过混合这些颜色来获得其他颜色。

Project tutorial 1

2. Introduction to Images

2.2. 如何显示图片?——显示器

显示器是我们最常用的显示设备之一。它的工作原理是通过控制每个像素的亮度来显示图像。

如何控制像素的亮度?有两种不同的方案:

  1. 通过用不同颜色的“遮光片”遮挡背景的白光,最终显示出不同的颜色——LCD 显示器
  2. 通过控制每个像素的亮度来显示图像——OLED 显示器
Project tutorial 1

2. Introduction to Images

LCD 显示器

放大镜下面的 LCD 液晶面板如下图中所显示的样子。

在液晶面板上面再加上一个彩色的滤光膜。滤光膜上每一份像素点RGB三种颜色组成,分成独立的三个点的子像素(SubPixel),然后把邻近的三个子像素,当作一个显示的基本单位,也就是显示像素 Pixel。这一个 Pixel,就可以拥有不同的色彩变化了。便可以正确的显示画面。

#c

Project tutorial 1

2. Introduction to Images

LCD vs OLED

  • 与 LCD 显示器不同,OLED 显示器的每个像素点都可以独立发光,因此它们的亮度和颜色可以更精确地控制。
  • 除此之外,OLED 还拥有更多的优点,这都是由于其发光完全由自身器件控制(而非靠“滤光”操作控制)导致的。
  • 总之,其优势包括:更高的对比度,更快的响应时间,更低的功耗,更薄的设计......

#c

Project tutorial 1

2. Introduction to Images

2.3. 图片的色彩空间

为了表示一张图片,我们有很多不同的方式,但无论如何我们都要能用某种方式来“编码”图片的颜色。这种编码方式就是“色彩空间”。

色彩空间是一个数学模型,用于描述颜色的表示方式。它定义了颜色的范围、亮度、饱和度等属性。常见的色彩空间包括 RGB、HSV 等。

Project tutorial 1

2. Introduction to Images

2.3. 图片的色彩空间

RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R),绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。

RGB 颜色空间是图像处理中最基本、最常用、面向硬件的颜色空间,比较容易理解。

但是人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,所以 RGB 颜色空间是一种均匀性较差的颜色空间。如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。所以,RGB 颜色空间适合于显示系统,却并不适合于图像处理。

Project tutorial 1

2. Introduction to Images

2.3. 图片的色彩空间

基于上述理由,在图像处理中使用较多的是 HSV 颜色空间,它比 RGB 更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。

在 HSV 颜色空间下,比 RGB 更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。

#c
#c

Project tutorial 1

2. Introduction to Images

  • Hue(色调、色相),相当于基调,是下图的俯视图得到的圆,圆上不同位置的颜色基调不同,把颜色分成了 360° ,每个位置有不同的颜色基调;
  • Saturation(饱和度、色彩纯净度):纯度,沿着俯视图得到的圆的半径看,因为圆弧上的点代表该处的颜色的基调,那么半径上就是从纯白色到该基调颜色过渡过程中不同位置的纯度,在圆心处纯度为0,在圆弧上(该色调)纯度为100;
  • Value(明度):亮度,沿着圆柱的高来看,圆柱表面上平行于圆柱轴上的点的颜色基调相同,纯度也相同,但是明暗程度不同。同时,该圆柱的半径也不同,相当于磁盘的柱面。

#c

Project tutorial 1

2. Introduction to Images

2.4. 色域

首先,色域(color gamut)或者色彩空间(color space)基本是一个意思,表示颜色的集合,描述的是色彩覆盖范围。

最常见的是sRGB,通常看到的sRGB色域长这样↓

#c

Project tutorial 1

2. Introduction to Images

2.4. 色域

上图对大部分人而言可能很陌生,但是只要换一个角度去看,把视角改为俯视,就能看到我们熟悉的色域图。

背景里的那个灰色的“大饼”,是全色域,是人眼能够感知到的所有色彩的集合。

#c

Project tutorial 1

2. Introduction to Images

2.4. 色域

通常而言,我们形如一个显示器的色彩显示效果,其一大衡量标准就是它的色域覆盖率。色域覆盖率越高,显示器显示的颜色就越丰富,显示效果就越好。

  • 色域覆盖率以 sRGB 为基准,通常以百分比表示(如:100% sRGB);
  • 所谓“广色域”简而言之就是:比sRGB色域覆盖范围/空间体积更大的色域
  • 总之,sRGB 虽然常见,但仍然有局限性(例如:无法覆盖印刷所需要的颜色),因此产生了各种广色域标准(如 Adobe RGB、DCI-P3、Rec. 2020 等),它们的色域覆盖率都比 sRGB 更高。

#c

3. Start with Image Operations

Project tutorial 1

3. Start with Image Operations

What is our goal and what should we do

在设计任何图像处理硬件单元之前,必须通过软件建模验证算法逻辑与数据流可行性。软件建模的粒度决定了硬件设计的精度与复杂度:功能级建模(Functional-Level Modeling)仅关注算法逻辑的正确性(如是否能正确实现边缘检测),而周期级建模(Cycle-Accurate Modeling)则需精确模拟硬件时序行为(如每个操作消耗的时钟周期)。本项目采用渐进式建模策略——先通过高级语言(如Python)验证算法功能,再逐步细化为硬件描述语言(如Verilog/VHDL)并最终映射到物理电路。

我们的目标是设计图像处理的硬件单元,因此,我们需要先学会如何使用软件来处理图像。

Project tutorial 1

3. Start with Image Operations

3.1. How are images stored in a computer?

图像通常以两种格式存储

  • 灰度格式:即每个像素对应一个值(称为“灰度值”),表示该像素的颜色(黑/白的程度);
  • RGB格式:每个像素对应若干个值,来表示每个像素有多少“对应颜色”的成分。
Project tutorial 1

3. Start with Image Operations

3.1.1. 灰度格式(黑白图像)

#c
这是数字8的图像,我们进一步放大并且仔细观察,会发现图像变得失真,并且你会在该图像上看到一些小方框。

#c

Project tutorial 1

3. Start with Image Operations

3.1.1. 灰度格式(黑白图像)

图像在计算机中实际上以数组形式存储。

图像的尺寸就是图像的宽度()和高度(),用这两个轴上的上像素(Pixel)数来计算。

此图像的尺寸将为 。

#c

Project tutorial 1

3. Start with Image Operations

3.1.1. 灰度格式(黑白图像)

这些像素中的每一个都表示为数值,而这些数字称为像素值。这些像素值表示像素的强度。对于灰度或黑白图像,我们的像素值范围是0到255。

接近零的较小数字表示较深的阴影,而接近255的较大数字表示较浅或白色的阴影。

因此,计算机中的每个图像都以这种形式保存,其中你具有一个数字矩阵,该矩阵也称为Channel。

特别的,灰度图像的通道数为1——为单通道图像,即灰度图像的形状为 (Height, Width)

Project tutorial 1

3. Start with Image Operations

#c

3.1.3. RGB格式(彩色图像)

我们知道几乎所有颜色都可以从三种原色:红色,绿色和蓝色 生成。

彩色图像实际上就是由三张“灰度图像”组成的。每个通道都表示为一个数字矩阵,分别表示图像在红色、绿色和蓝色三个通道上的灰度。

Project tutorial 1

3. Start with Image Operations

3.1.3. RGB格式(彩色图像)

在 RGB模型 中,每个像素的颜色都由这三种基本颜色组合而成。因此,一个图像在二维平面上看似只有一个像素,实际是由三个不同颜色(不同通道)的像素混合组成。

这里的 R/G/B 三种颜色,就认为是彩色图片的三个通道,如下图所示。
#c

Project tutorial 1

3. Start with Image Operations

3.1.3. RGB格式(彩色图像)

最后,所有这些通道或所有这些矩阵都将叠加在一起,这样,当图像的形状加载到计算机中时,它的形状为 (Height, Width, 3)

其中Height是整个高度上的像素数,Width是整个宽度上的像素数,3表示通道数,在这种情况下,我们有3个通道R,G和B。

Project tutorial 1

3. Start with Image Operations

3.1.3. 像素数据格式

  • 数值范围:

    • 0-255(Int8):默认的8位无符号整型(dtype=np.uint8),适用于大多数图像文件的读写;
    • 0-1(Float):浮点型(dtype=np.float32),常用于归一化处理(如:作为深度学习输入)。
    # 将int8图像转为浮点数图像
    img_float = img_bgr.astype(np.float32) / 255.0  # 归一化到[0,1]
    
Project tutorial 1

3. Start with Image Operations

3.1.3. 像素数据格式

  • 图像的通道(Channels):根据图像种类的不同
    • 单通道(Gray):形状为(Height, Width);
    • 三通道(RGB/BGR):形状为(Height, Width, 3);
    • 四通道(RGBA/BGRA):形状为(Height, Width, 4),含透明度(Alpha)通道。
  • 获取图像信息:
    • 通过img.shape获取图像尺寸(如(480, 640, 3)表示480行、640列的彩色图像);
    • 通过img.dtype查看数据类型(如uint8)。
Project tutorial 1

3.2. Image I/O in Python

cv2 and matplotlib

在这一部分,我们将介绍如何使用Python中的cv2和matplotlib库来进行图像的输入输出(I/O)操作。我们将学习如何读取、显示和保存图像,并了解这两个库之间的区别。

Project tutorial 1

3.2. Image I/O in Python

3.2.1. OpenCV 库基础

OpenCV(Open Source Computer Vision Library)是DIP领域最常用的开源库,支持多种图像格式(BMP、PNG、JPEG等)的快速处理。其核心数据结构为numpy.ndarray,图像以多维数组形式存储。以下代码片段实现图像的基本I/O操作:

import cv2  

# 读取图像(彩色图像默认为 BGR 格式)  
img = cv2.imread('input.jpg')  # 返回值为numpy数组,形状为 (Height, Width, Channels)  

# 保存图像  
cv2.imwrite('output.jpg', img)  # 自动根据文件扩展名选择编码格式  
Project tutorial 1

3.2. Image I/O in Python

3.2.1. OpenCV 库基础

  • 若文件路径包含中文或特殊字符,需使用 cv2.imdecode() 替代 cv2.imread() ;
  • cv2.imread() 的第二个参数可指定读取模式:
    • cv2.IMREAD_COLOR(默认,读取彩色图像)
    • cv2.IMREAD_GRAYSCALE(读取灰度图像)
    • cv2.IMREAD_UNCHANGED(保留原始通道,如含透明度的PNG)
Project tutorial 1

3.2. Image I/O in Python

3.2.3. Matplotlib 库基础

Matplotlib makes easy things easy and hard things possible!

  • Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。
  • Matplotlib 可以用来绘制各种静态,动态,交互式的图表。
  • Matplotlib 是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。
  • Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。 (Reference: Matplotlib)

Matplotlib是Python中用于数据可视化的标准库,其pyplot模块支持图像显示功能,但默认以RGB格式解析图像。与OpenCV结合使用时,需要进行一次图像通道的转换

Project tutorial 1

3.2. Image I/O in Python

import cv2  
import matplotlib.pyplot as plt  

img_bgr = cv2.imread('input.jpg')  # 读取图片
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)  # 转换颜色空间(BGR -> RGB)  

# 使用Matplotlib显示图像  
plt.figure(figsize=(8, 4))  
plt.subplot(1, 2, 1)  
plt.imshow(img_bgr)  
plt.title("BGR (OpenCV Default)")  
plt.axis('off')  
plt.subplot(1, 2, 2)  
plt.imshow(img_rgb)  
plt.title("RGB (Matplotlib Default)")  
plt.axis('off')  
plt.show()  
Project tutorial 1

3.2. Image I/O in Python

3.2.3. Matplotlib 库基础

  • cv2.cvtColor()用于颜色空间转换,cv2.COLOR_BGR2RGB表示从BGR转换为RGB;
    • 若直接用plt.imshow(img_bgr),Matplotlib会将BGR误认为RGB,导致颜色失真;
  • plt.figure(figsize=(8, 4))设置图像大小;
  • plt.subplot()用于创建子图,参数为(行数, 列数, 当前子图索引);
  • plt.axis('off')用于隐藏坐标轴;
  • plt.imshow()支持多种色彩映射(如灰度图用cmap='gray')。
Project tutorial 1

3.3. Tasks

  1. 使用 cv2 库读取一张彩色图像,使用 matplotlib 库展示图像。
  2. 使用 cv2 库将 BGR 通道转换成 RGB 通道。
  3. 提取图像的单一颜色通道(如红色通道)并单独显示。
  4. 把图像中心的若干个像素(如:10 * 10)设置为黑色;把图像前 10 行设置为白色,然后保存图像。

请跟随 Project_Week_1 中的 01_ImageOperations.ipynb 中的指示进行操作吧!

Optional Themes: ShanghaiTech_Tutorial / NaiLoong / QYGG