ExASIC
分享让工作更轻松

用python对比bmp图片

前两次我们介绍了《用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')

    # read bmp header
    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

    # read rgb data
    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_data1rgb_data2,然后用for循环逐个像素进行对比。

同时对不同的像素进行计数,当超过20时,就停止打印。类似MaxError的限制功能,方便Terminal里显示。

当所有的像素都一致就打印PASS。

if __name__ == '__main__':
    global height
    global width

    #
    # read image 1
    rgb_data1 = bmp_parse(sys.argv[1])

    #
    # read image 2
    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图片按像素对比的方法,方法简单实用。

阅读数:
更多文章:文章目录
解惑专区
(支持markdown插入源代码)
欢迎使用ExASIC订阅服务
仅用于ExASIC最新文章通知,方便及时阅读。
友情链接: IC技术圈问答ReCclayCrazyFPGA