前两次我们介绍了《用python生成bmp图片》和《用python读取bmp图片》。在做IC验证时,经常需要对比refmodel和rtl的输出的图片是否一致,如果一致就输出PASS。不一致就输出不一致的坐标和颜色值的详细log。下面我们就来看看一种实现方法。
读bmp到内部数组
基于上次的读取bmp的方法,我们封装成函数def bmp_parse(image_name)
,函数返回一个三维数组rgb_data_3d_list
。
import struct
import numpy
import array
import sys
class bmp:
"data structure"
def __init__(self, tp):
def print_bmp_header(self):
def bmp_parse(image_name):
global height
global width
print("open image : {}".format(image_name))
f = open(image_name, 'rb')
bmp_header_b = f.read(0x36)
bmp_header_s = struct.unpack('<2sI2H4I2H6I', bmp_header_b)
image = bmp(bmp_header_s)
print("width: {}".format(image.width))
print("height: {}".format(image.height))
height = image.height
width = image.width
bmp_rgb_data_b = f.read()
list_b = array.array('B', bmp_rgb_data_b).tolist()
rgb_data_3d_list = numpy.reshape(list_b, (image.height, image.width, 3)).tolist()
return rgb_data_3d_list
实现对比功能
先读进两幅图片,得到两组rgb数据rgb_data1
和rgb_data2
,然后用for循环逐个像素进行对比。
同时对不同的像素进行计数,当超过20时,就停止打印。类似MaxError的限制功能,方便Terminal里显示。
当所有的像素都一致就打印PASS。
if __name__ == '__main__':
global height
global width
rgb_data1 = bmp_parse(sys.argv[1])
rgb_data2 = bmp_parse(sys.argv[2])
error_count = 0
msg_header_flag = 0
for row in range(height):
for col in range(width):
if(rgb_data1[row][col] != rgb_data2[row][col]):
if(msg_header_flag == 0):
msg_header_flag = 1
print("[row][col] image1 image2")
print("------------------------")
print("[{:0>3d}][{:0>3d}] {:0>2x}{:0>2x}{:0>2x} {:0>2x}{:0>2x}{:0>2x}".format(row,
col,
rgb_data1[row][col][2],
rgb_data1[row][col][1],
rgb_data1[row][col][0],
rgb_data2[row][col][2],
rgb_data2[row][col][1],
rgb_data2[row][col][0]))
if(error_count >= 19):
print("Error: only print 20 different pixels")
sys.exit()
else:
error_count += 1
print("PASS!!!")
随意找两幅图片,进行对比的结果如下:
$ python3 bmpdiff2.py 1.bmp 4.bmp
open image : 1.bmp
width: 240
height: 320
open image : 4.bmp
width: 240
height: 320
[row][col] image1 image2
------------------------
[000][000] 000000 d09080
[000][001] 000000 d09080
[000][002] 000000 d09060
[000][003] 000000 c08060
[000][004] 000000 c07060
[000][005] 000000 b06040
[000][006] 000000 b04020
[000][007] 000000 b03020
[000][008] 000000 801000
[000][009] 000000 600000
[000][010] 000000 600000
[000][011] 000000 600000
[000][012] 000000 600000
[000][013] 000000 600000
[000][014] 000000 600000
[000][015] 000000 700000
[000][016] 000000 700000
[000][017] 000000 800000
[000][018] 000000 800000
[000][019] 000000 900000
Error: only print 20 different pixels
当然,你还可以加一个选项,把所有的差异信息保存到log文件,方便批量仿真。
总结
这篇文章实现了一种两幅bmp图片按像素对比的方法,方法简单实用。