第三十七章 image图像对比实验
在上一章节中,介绍了image模块中图像色块追踪方法给的使用,本章将继续介绍image模块中图像对比方法的使用。通过本章的学习,读者将学习到image模块中图像对比的使用。 本章分为如下几个小节: 37.1 image模块图像对比方法介绍 37.2 硬件设计 37.3 程序设计 37.4 运行验证
37.1 image模块图像对比方法介绍 image模块为Image对象提供了difference()方法,用于计算两个图像的差值绝对值,difference()方法如下所示: image.difference(image, mask) difference()方法计算两个图像的差值的绝对值,并返回一个image对象,返回的图像中较暗的部分,即两个对比图像差别不大的部分,返回图像中较亮的部分,即两个对比图像中相差较大的部分。 image指的是与image对象比较的另一个image对象。 mask指的是另一个用作绘图操作的像素级掩码的图像,掩码应该是一个只有黑色和白色像素的图像,并且因该与所处理的Image对象具有相同的大小,仅有掩码中设置的像素会被修改。 difference()方法会返回经过处理的Image对象。 difference()方法的使用示例如下所示: import image img1 = image.Image(size=(320, 240)) img2 = img1.copy() img1.difference(img2) image模块为Image对象提供了get_similarity()方法,用于计算两个图像之间的相似程度,get_similarity()方法如下所示: image.get_similaraity(image) get_similarity()方法用于使用SSIM算法计算两个图像之间的8*8像素色块的相似度,并会返回一个similarity对象。 image指的是与image对象进行计算的另一个image对象。 get_similarity()方法会返回一个similarity对象。 get_similarity()方法的使用示例如下所示: import image img1 = image.Image(size=(320, 240)) img2 = img1.copy() sim = img1.get_similarity(img2) 37.2 硬件设计 37.2.1 例程功能 1. 不断地获取摄像头输出的图像,并保存相邻的两帧图像,对这两帧图像使用差帧算法或SSIM算法进行图像对比,并将对比结果和当前获取到的摄像头图像一起在LCD上进行显示。 2. KEY0按键可以切换图像对比时使用的算法。 37.2.2 硬件资源 本章实验内容,主要讲解image模块的使用,无需关注硬件资源。 37.2.3 原理图 本章实验内容,主要讲解image模块的使用,无需关注原理图。 37.3 程序设计 37.3.1 image模块图像对比方法介绍 有关image模块图像对比方法的介绍,请见第37.1小节《image模块图像对比方法介绍》。 37.3.2 程序流程图
图37.3.2.1 image图像对比实验流程图 37.3.3 main.py代码 main.py中的脚本代码如下所示: from board import board_info from fpioa_manager import fm from maix import GPIO import lcd import sensor import image import gc lcd.init() sensor.reset() sensor.set_framesize(sensor.QVGA) sensor.set_pixformat(sensor.RGB565) sensor.set_hmirror(False) type = 0 type_dict = { 0: "Normal", 1: "Frame", 2: "SSIM" } fm.register(board_info.KEY0, fm.fpioa.GPIOHS0) key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP) def key_irq_handler(key): global key0 global type time.sleep_ms(20) if key is key0 and key.value() == 0: type = type + 1 if type == len(type_dict): type = 0 key0.irq(key_irq_handler, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT, 7) while True: img = sensor.snapshot() if type == 0: # 原图 pass elif type == 1: # 差帧算法 threshold = 5 if "prev" not in dir(): prev = img.copy() prev.difference(img) hist = prev.histogram() diff = hist.get_percentile(0.99).l_value() - hist.get_percentile(0.90).l_value() img.draw_string(10, 30, "Different" if diff > threshold else "Same", color=(255, 0, 0), scale=1.6) prev = img.copy() elif type == 2: # SSIM算法 threshold = -0.4 if "prev" not in dir(): prev = img.copy() sim = prev.get_similarity(img) img.draw_string(10, 30, "Different" if sim.min() < threshold else "Same", color=(255, 0, 0), scale=1.6) else: type = 0 img.draw_string(10, 10, type_dict[type], color=(255, 0, 0), scale=1.6) lcd.display(img) gc.collect() 可以看到一开始是先初始化了LCD、摄像头和中断按键,并且按下中断按键可以切换图像对比时使用的对比算法。 接着在一个循环中不断地获取摄像头输出的图像,因为获取到的图像就是Image对象,因此可以直接调用image模块为Image对象提供的各种方法,然后就是对当前图像与上一帧图像进行图像对比,最后在LCD显示图像以及图像对比结果。 37.4 运行验证 将DNK210开发板连接CanMV IDE,点击CanMV IDE上的“开始(运行脚本)”按钮后,按下KEY0按键能够切换图像对比时使用的对比算法,图像对比完成后会在LCD上显示对比结果,如果前后两帧图像相似度较高,则LCD上显示“Same”,如果前后两帧图像有点差异,则LCD上显示“Different”。
|