单元一

第3课 创建小图:shape 与通道

读懂 shape
任务场景:读懂 shape
shape
原理图:(H, W, C)

一、任务目标

拿到一张图先问:多高、多宽、几个通道?读懂 shape,才不会把宽高写反、把颜色调乱。

二、核心概念讲清楚

彩色图 shape 常为 (H, W, C):高、宽、通道。灰度图常为 (H, W)。注意顺序是高在前。

  • H:行数(高度)
  • W:列数(宽度)
  • C:通道数,彩色多为 3
1得到 img数组或读入
2打印 shape看三个数
3对照含义高宽通道
4再切片/缩放用对下标

三、跟着想一遍(小例子)

shape=(120,160,3) 表示高 120、宽 160、三通道。

易错:把 (宽,高) 写反导致 resize 变形。

正确:记住 OpenCV 里 shape 先高后宽;resize 参数却常是 (宽,高)。

想一想:为什么 resize 的尺寸参数顺序容易和 shape 搞混?

四、算法思路

任务:拿到一张图先问:多高、多宽、几个通道?读懂 shape,才不会把宽高写反、把颜色调乱。 先想清楚:输入是什么、处理后得到什么、屏幕上应出现什么。

本课主要用到:图像输入、图像预览/对照区。

  1. 1明确任务「创建小图:shape 与通道」:运行后你希望看到什么结果(文字、图形或计算结果)。
  2. 2确认输入:演示图/上传照片/摄像头抓一帧,得到一张可用的 BGR 图。
  3. 3用 print 核对 shape/检测数量等关键信息,并对照图像页预览。
  4. 4对照参考代码跑通后,只改一个参数,观察结果如何变化。

流程示意(可对照左侧文字)

任务:创建小图:sh…确认输入:演示图/上传照片…用print核对shape…对照参考代码跑通后,只改一…

五、语句功能讲解

下面只列出本课首次出现的语句/函数。已在前面课讲过的不再重复;先认新语句,再对照参考代码。

语句作用本课用法
rectangle()画矩形标注检测框或感兴趣区域。

六、知识点讲解

图像 shape给出高、宽与通道数;彩色 BGR 常见为 3 通道,灰度通常为 2 维(无单独通道维)或通道为 1。

先弄清本课输入与输出,再进编程练习对照现象。

七、编程练习

先理解概念,再在下方 Mixly 运行(opencv-python);没有摄像头可用演示图或上传照片。请先读本页「四、算法思路」与「五、知识讲解」,再点载入。

看高、宽、通道。

参考代码(对照抄写到下方 Mixly)
import cv2
import numpy as np

def show_bgr(img, title="预览"):
    """显示到 Mixly「OpenCV」页签右侧对照区(灰度会先转成 BGR)"""
    if img is None:
        return None
    vis = img
    if len(getattr(img, "shape", ())) == 2:
        vis = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
    try:
        from js import window
        push = getattr(window, "__ailessonsShowCvResultB64", None)
        if push:
            ok, buf = cv2.imencode(".jpg", vis, [int(cv2.IMWRITE_JPEG_QUALITY), 88])
            if ok:
                import base64
                push(base64.b64encode(buf.tobytes()).decode("ascii"), str(title or "处理结果"))
    except Exception as e:
        print("对照区显示跳过:", e)
    try:
        cv2.imshow(vis, title)
    except Exception:
        try:
            cv2.imshow(title, vis)
        except Exception as e:
            print("图像页显示跳过:", e)
    return None

img = np.zeros((80, 120, 3), dtype=np.uint8)
cv2.rectangle(img, (10, 10), (50, 60), (0, 200, 255), -1)
h, w, c = img.shape
print("高:", h, "宽:", w, "通道:", c)
show_bgr(img, "色块示意")

八、课堂练习

选出你认为正确的一项,再点「检查」。

  1. shape 为 (100, 200, 3) 时宽是?

九、本节小结

会读 shape。