zigzag扫描(Z字形扫描zigzag二维矩阵python实现)

发布时间:2025-12-10 19:29:42 浏览次数:10

Z字形扫描zigzag二维矩阵python实现-

Z字形扫描zigzag二维矩阵python实现在对图像进行dct变换后,原图像的高频分量集中在左上,低频部分集中在右下。在此情况下,将图像将成一维,用简单的逐行逐列效果不会很好,故需用Z字形扫描的方式进行展开。下图给出了奇数行列和偶数行列的情况示意图(仅供参考,行列数可以不相等,但一般图像处理里,分块都是8*8的小块)。下面给出了代码,注释写得比较清楚。请结合图像理解。几个关键点:1、在不考虑边界时,根据行和列数和是奇数还是偶数来区分前面的方向是右上还是左下;2、在考虑边界时,需要转弯,转弯时需要判断是哪个边界、或者顶点位置;

在对图像进行 dct 变换后,原图像的高频分量集中在左上,低频部分集中在右下。在此情况下,将图像将成一维,用简单的逐行逐列效果不会很好,故需用Z字形扫描的方式进行展开。下图给出了奇数行列和偶数行列的情况示意图(仅供参考,行列数可以不相等,但一般图像处理里,分块都是8*8的小块)。

下面给出了代码,注释写得比较清楚。请结合图像理解。几个关键点:
1、在不考虑边界时,根据行和列数和是奇数还是偶数来区分前面的方向是右上还是左下;

2、在考虑边界时,需要转弯,转弯时需要判断是哪个边界、或者顶点位置;

在将情况讨论后,发现代码其实是可以合并的。这里为了方便理解,不进行合并

import numpy as np''' define  : zigzag 扫描    input   : 二维矩阵, shape: (row, col)    output  : 列表, shape: (row*col,)    variable: k 列表序号, i 行序号, j 列序号, row 行数, col 列数    method  : 假设 (0, 0) 在左上角, (row-1, col-1) 在右下角的情况. 考虑非边界的情况, 只有右上/左下两个方向.              以从 (0, 0) 先向右(下)为例, 则会有 i+j 为偶数时右上(左下)前进, 为奇数时左下(右上)的情况前进.              如果遇到边界, 某个方向收到限制, 移动允许的直线方向'''def zigzag(data):    row = data.shape[0]    col = data.shape[1]    num = row * col    list = np.zeros(num,)    k = 0    i = 0    j = 0    while i < row and j < col and k < num:        list[k] = data.item(i, j)        k = k + 1        # i + j 为偶数, 右上移动. 下面情况是可以合并的, 但是为了方便理解, 分开写        if (i + j) % 2 == 0:            # 右边界超出, 则向下            if (i-1) in range(row) and (j+1) not in range(col):                i = i + 1            # 上边界超出, 则向右            elif (i-1) not in range(row) and (j+1) in range(col):                j = j + 1            # 上右边界都超出, 即处于右上顶点的位置, 则向下            elif (i-1) not in range(row) and (j+1) not in range(col):                i = i + 1            else:                i = i - 1                j = j + 1        # i + j 为奇数, 左下移动        elif (i + j) % 2 == 1:            # 左边界超出, 则向下            if (i+1) in range(row) and (j-1) not in range(col):                i = i + 1            # 下边界超出, 则向右            elif (i+1) not in range(row) and (j-1) in range(col):                j = j + 1            # 左下边界都超出, 即处于左下顶点的位置, 则向右            elif (i+1) not in range(row) and (j-1) not in range(col):                j = j + 1            else:                i = i + 1                j = j - 1        return listif __name__ == "__main__":    data = np.matrix([[1,2,6],[3,5,7],[4,8,9]])    print(data)    result = zigzag(data)                # np.array 格式的输出    print(result)    result_list = result.tolist()    print(result_list)                    # python里 list 的格式输出

是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活CLion DataGrip DataSpell dotCover dotMemory dotTrace GoLand PhpStorm PyCharm ReSharper ReShaC++ Rider RubyMine WebStorm 全家桶 刷新

【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477