Python 计算图像差分的三种方式(cv2,torchvision,numpy)

前言:最近在可视化图像残差时,发现几种不同的差分方法,下面分别给出每种差分方法的实现方式,并比较不同方法之间的差异。

目录

  • 1️⃣ cv2
  • 2️⃣ PIL & torchvision
  • 3️⃣ PIL & numpy


目标:对于给定的下述两张图像,计算二者的残差。

cur_clean_img 图像:
(图片来源:Flickr8k 数据集,1258913059_07c613f7ff.jpg)

在这里插入图片描述

cur_poi_img 图像:

在这里插入图片描述

cur_poi_img 相较于 cur_clean_img 的不同是,在 cur_clean_img 的右下角添加了一个 10*10 大小的 patch。所以,理想的差分结果应该是:除了添加patch区域,差分图像的其余部分都是全黑。


下面给出三种图像差分方法。

1️⃣ cv2

依赖库:cv2
安装方式:pip install opencv-python

import cv2cur_poi_img = cv2.imread(poi_image_path)
cv2.imwrite(poi_save_path, cur_poi_img)cur_clean_img = cv2.imread(clean_img_path)
# cur_clean_img = cv2.resize(cur_clean_img, (256, 256))
# cur_clean_img = np.array(Image.fromarray(cur_clean_img).resize((256, 256)))
cv2.imwrite(clean_save_path, cur_clean_img)residual = cv2.absdiff(cur_poi_img,cur_clean_img)
cv2.imwrite(residual_save_path, residual)

对应残差结果:

在这里插入图片描述


2️⃣ PIL & torchvision

依赖库:torchvision
安装方式:pip install torchvision

import torchvision.transforms as T
from torchvision.utils import save_imagetransform = T.Compose([# T.Resize([256, 256]),T.ToTensor(),
])image = Image.open(clean_img_path).convert("RGB")
clean_img_tensor = transform(image)
save_image(clean_img_tensor, clean_save_path)image = Image.open(poi_image_path).convert("RGB")
poi_img_tensor = transform(image)
save_image(poi_img_tensor, poi_save_path)residual_tensor = poi_img_tensor - clean_img_tensor
save_image(residual_tensor, residual_save_path)

对应残差结果:

在这里插入图片描述


3️⃣ PIL & numpy

依赖库:PIL, numpy
安装方式:pip install pillow, pip install numpy

from PIL import Image
import numpy as npcur_poi_img = Image.open(poi_image_path)
cur_poi_img = np.asarray(cur_poi_img)
cur_clean_img = Image.open(clean_img_path)
cur_clean_img = np.asarray(cur_clean_img)residual = cur_poi_img - cur_clean_img
residual = (residual * 255).astype(np.uint8)
residual = Image.fromarray(residual)
residual.save(residual_save_path)

对应残差结果:

在这里插入图片描述

后记:由上述结果可以看出,通过 numpy 方式计算得到的残差图像并不是十分准确,这是由于在使用.astype(np.uint8)进行数据转换时产生了信息损失,大家在实际操作的时候也要引以为戒,选择正确的方式进行图像差分。


PS:resize操作对差分结果有很大影响!假如我们按照 clean_image-[Resize]-resized-image-[AddNoise]-poi_image的流程进行操作,在计算差分结果时,使用的图像对最好是resized-imagepoi_image,而不是clean_imagepoi_image。下面给出后者的错误计算结果(建议放大🔍观看)❌:

在这里插入图片描述
我们会发现,除patch区域,差分图像的其余区域也出现了扰动印记,这是resize操作带来的误差,从而印证了上述观点。


参考资料

  1. Python与机器视觉(x)图像差分-图像相减_图像差分python-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MacOS + Android Studio 通过 USB 数据线真机调试

环境:Apple M1 MacOS Sonoma 14.1.1 软件:Android Studio Giraffe | 2022.3.1 Patch 3 设备:小米10 Android 13 一、创建测试项目 安卓 HelloWorld 项目: 安卓 HelloWorld 项目 二、数据线连接手机 1. 手机开启开发者模式 参考&#xff1…

代码随想录算法训练营第四十八天【动态规划part09】 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 求解思路: 当前房屋偷与不偷取决于前一个房屋是否被偷了 动规五部曲 确定dp数组及其下标含义:考虑下标i(包括i&#xff09…

Qt串口助手

QT5 串口助手 ​ 由于C课程作业的需要&#xff0c;用QT5写了个简陋的串口助手。只作为一个简单的案例以供参考&#xff0c;默认读者具有C基础和了解简单的Qt操作。 功能展示 【用QT写了个简单的串口助手】 准备工作 Qt自带有<QSerialPort> 库, 可以方便地配置和调用…

lv11 嵌入式开发 轮询与中断13

1 CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务&#xff0c;若需要则给予其服务&#xff0c;若不需要一段时间后再次询问&#xff0c;周而复始 中断 CPU执行程序时若硬件需要其服务&#xff0c;对应的硬件给CPU发送中断信号&#xff0c;CPU接收到中…

python爬取robomaster论坛数据,作为后端数据

一. 内容简介 python爬取robomaster论坛数据&#xff0c;作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 三.主要流程 3.1 接口分析 # 接口分析 # 全部数据 # https://bbs.robomaster.com/forum.php?modforumdisplay&fid63 2…

Ubuntu systemd-analyze命令(系统启动性能分析工具:分析系统启动时间,找出可能导致启动缓慢的原因)

文章目录 Ubuntu systemd-analyze命令剖析目录简介systemd与systemd-analyze工作原理 安装和使用命令参数详解用例与示例显示启动时间&#xff08;systemd-analyze time&#xff09;列出启动过程中各个服务的启动时间&#xff08;systemd-analyze blame&#xff09;显示系统启动…

使用opencv实现图像滤波

1 图像滤波介绍 滤波是信号和图像处理中的基本任务之一&#xff0c;其旨在有选择地提取图像的某些特征&#xff0c;可以用于在给定应用程序的上下文中传达重要信息&#xff0c;例如&#xff0c;去除图像中的噪声、提取所需的视觉特征、图像重采样等。 1.1 图像滤波理论 图像…

厦门城市建设与建筑结构健康监测系统的重要性与作用

厦门&#xff0c;这座美丽的海滨城市&#xff0c;随着经济的快速发展和城市化的不断推进&#xff0c;城市建设已成为人们关注的焦点。其中&#xff0c;建筑结构健康监测系统对于保障城市建设和建筑的安全具有举足轻重的地位。 WITBEE万宾针对建筑的动态平衡&#xff0c;温湿度&…

shell编程系列(7)-使用wc进行文本统计

文章目录 前言wc命令的使用wc命令的参数说明&#xff1a;统计字数统计行数打印文本行号 结语 前言 统计功能也是我们在shell编程中经常碰到的一个需求&#xff0c;wc命令可以适用于任何需要统计的数据&#xff0c;不只是统计文本&#xff0c;配合ls命令我们可以统计文件的个数…

java gc垃圾回收机制(垃圾收集 Garbage Collection)

一文带你深入JAVA GC&#xff08;垃圾回收机制&#xff09;面试讲解&#xff01;&#xff01;&#xff01; - 知乎 gc常用算法 gc常用算法有&#xff1a;标记-清除算法&#xff0c;标记-压缩算法&#xff0c;复制算法&#xff0c;分代收集算法。 复制算法&#xff08;Java中…

java--子类构造器的特点

1.子类构造器的特点 子类的全部构造器&#xff0c;都会先调用父类的构造器&#xff0c;再执行自己。 2.子类构造器是如何实现调用父类构造器的 ①默认情况下&#xff0c;子类全部构造器的第一行代码都是super()(写不写都有)&#xff0c;它会调用父类的无参数构造器。 ②如果…

【攻防世界-misc】来自银河的信号

1.下载并打开文件&#xff0c;是个音频软件 2.由于打开音频出现的声音类似于无线波&#xff0c;因此需要用RX-SSTV工具打开&#xff0c; RX-SSTV代表“接收图像慢扫描电视”的意思。慢扫描电视是一种通过无线电进行图像传输的技术&#xff0c;通常用于业余无线电领域。RX-SST…

分治法之归并排序

思路: 将待排序数组分成两个子数组&#xff0c;计算中间位置mid。对左半部分进行递归排序&#xff0c;得到一个有序的子数组。对右半部分进行递归排序&#xff0c;得到另一个有序的子数组。合并两个有序的子数组&#xff0c;得到一个完整的有序数组。 示例图: 代码: #include&…

JAVA 算法面试总结

1、二分查找 二分查找又叫折半查找&#xff0c;要求待查找的序列有序。每次取中间位置的值与待查关键字比较&#xff0c;如果中间位置 的值比待查关键字大&#xff0c;则在前半部分循环这个查找的过程&#xff0c;如果中间位置的值比待查关键字小&#xff0c; 则在后半部分循环…

【ONE·Linux || 网络基础(四)】

总言 主要内容&#xff1a;传输层UDP、TCP协议基本介绍。UDP报文格式、TCP报文格式、三次握手四次挥手、TCP可靠性策略说明。 文章目录 总言8、UDP协议&#xff08;传输层一&#xff09;8.1、传输层预备知识8.1.1、端口号8.1.2、一些指令&#xff08;netstat、pidof、xargs&am…

热烈欢迎省工信厅毛郑建处长莅临公司调研指导工作

2023年11月28日&#xff0c;河南省工信厅信息化和软件服务业处毛郑建处长莅临郑州埃文计算机科技有限公司&#xff08;以下简称“埃文科技”&#xff09;调研考察工作。河南省工业信息安全产业发展联盟理事长任传军陪同调研。 首先&#xff0c;埃文科技董事长王永向毛处长介绍埃…

优维全新低碳产品亮相SBE23 Asia-Pacific绿色建筑促进碳中和论坛

2023年11月23日—24日&#xff0c;由深圳市人民政府主办&#xff0c;深圳市住房和建设局、深圳市发展与改革委员会、深圳市龙岗区人民政府承办&#xff0c;深圳市绿色建筑协会作为执行单位的“2023年可持续建筑环境亚太地区会议&#xff08;SBE23 Asia-Pacific&#xff09;”在…

Ubuntu Server 20.04.6安装Anaconda3

下载安装包 去下面的网页找到自己想要安装的对应版本的链接&#xff1a; https://repo.anaconda.com/archive/ 我安装的版本链接如下&#xff1a; https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 复制这个链接后使用如下命令下载&#xff1a; wget …

一篇文章带你掌握MongoDB

文章目录 1. 前言2. MongoDB简介3. MongoDB与关系型数据库的对比4. MongoDB的安装5. Compass的使用6. MongoDB的常用语句7. 总结 1. 前言 本文旨在帮助大家快速了解MongoDB,快速了解和掌握MongoDB的干货内容. 2. MongoDB简介 MongoDB是一种NoSQL数据库&#xff0c;采用了文档…

arthas使用

官方文档 Github: https://github.com/alibaba/arthas 文档: https://arthas.aliyun.com/doc/ Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断…