在MATLAB中有blkproc (blockproc)对数据处理, 在python下没找到对应的Function,
这里利用numpy 的split(hsplit和vsplit) 对数据分块处理成8x8的小块, 然后在利用OpenCV的dct函数做变换, 同时利用idct 验证数据变换是否正确.
import numpy as np
import cv2
a = np.arange(256).reshape((16,16))
print("ori data: \n{}".format(a))
m,n = a.shape
print(m,n)
# Y = np.zeros(256).reshape((16,16))
hdata = np.vsplit(a,n/8) # 垂直分成高度度为8 的块
for i in range(0, n//8):
blockdata = np.hsplit(hdata[i],m/8)
#垂直分成高度为8的块后,在水平切成长度是8的块, 也就是8x8 的块
for j in range(0, m//8):
block = blockdata[j]
print("block[{},{}] data \n{}".format(i,j,blockdata[j]))
Yb = cv2.dct(block.astype(np.float))
print("dct data\n{}".format(Yb))
iblock = cv2.idct(Yb)
print("idct data\n{}".format(iblock))
以下是最后个8x8块的数据:
block[1,1] data