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

news2024/12/24 9:28:58

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

目录

  • 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 cv2

cur_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_image

transform = 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 np

cur_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.coloradmin.cn/o/1271731.html

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

相关文章

Windows系列:Windows server 2016 部署路由与远程访问服务

Windows server 2016 部署路由与远程访问服务 前言环境要求服务器配置ip 设置"远程访问" 服务安装 "远程访问" 服务配置 ”远程访问“ 服务新建用户 客户机配置添加VPNping 前言 千万不要安装图上的几个服务,如果安装了,鼠标会失灵…

10.0 输入输出 I/O

IO操作主要是指使用Java程序完成输入(Input)、输出(Output)操作。所谓输入是指将文件内容以数据流的形式读取到内存中,输出是指通过Java程序将内存中的数据写入到文件中,输入、输出操作在实际开发中应用较为…

键盘打字盲打练习系列之指法练习——2

一.欢迎来到我的酒馆 盲打,指法练习! 目录 一.欢迎来到我的酒馆二.指法练习 二.指法练习 前面一个章节简单地介绍了基准键位、字母键位和数字符号键位指法,在这个章节详细介绍指法。有了前面的章节的基础练习,相信大家对盲打也有了…

构建智能预约体验:深度解析预约系统源码的代码精髓

随着数字化时代的发展,预约系统在各行业中扮演着越来越重要的角色。本文将深入研究预约系统源码,通过代码示例分析其技术要点,为开发者提供实用的指导,助力构建智能、高效的预约体验。 技术栈综述 预约系统源码采用了现代化的技…

【JUC】十八、happens-before先行发生原则

文章目录 1、先行发生原则happens-before2、happens-before总原则3、8条happens-before规则4、案例 1、先行发生原则happens-before 在Java中,Happends-Before本质上是规定了一种可见性, A Happends-Before B,则A发生过的事情对B来说是可见的…

大模型fine-tune 微调

大模型的 Fine-tune 我们对技术的理解,要比技术本身更加重要。 正如我在《大模型时代的应用创新范式》一文中所说,大模型会成为AI时代的一项基础设施。 作为像水、电一样的基础设施,预训练大模型这样的艰巨任务,只会有少数技术…

滚珠丝杆在各种自动化设备中的作用

滚珠丝杆因其具有高精度、高刚度和长寿命等特性,成为许多设备中的重要组成部分,在许多行业中都有广泛的应用,接下来我们看看滚珠丝杆的具体应用有哪些? 1、打孔机:提供精确的导向,使打孔机的滑块能够沿固定…

数据库管理-第119期 记一次迁移和性能优化(202301130)

数据库管理-第119期 记一次迁移和性能优化(202301130) 1 迁移 之前因为DV组件没有迁移成功的那个PDB,后来想着在目标端安装DV组件迁移,结果目标端装不上,而且开了SR也没看出个所以然来。只能换一个方向,尝…

优化-查询数据接口太慢

有一个查询接口,主业务表有几万多条数据,没超过十万,由于没有使用分页,所以每次查询都要返回大几万的数据,然后问题是前端页面查询数据显示数据要转很久。 压缩响应体大小 我发现查询的时间是1秒多,但是浏…

Android中在google Map 上绘制历史路径

很多的App都会有这种需求,需要把自己的轨迹绘制在地图上来加标一段行踪,使得自己的行程展现出来,通过地图的展示,自己的行程也就一目了然了。 这里利用Google Map 把自己的行程展现出来,注意这里用到了上一章的基础&a…

关于最近Facebook的未经用户同意收集使用个人信息,

最近收到深圳市通信管理局的违法违规APP处置通知大概如下: 并且详细列举了 facebook sdk 在未经用户允许前调用的 TelephonyManager.getNetworkOperatorName(); 方法,获取运营商名称. 解决方法, 首先 在用户没有点击允许隐私条款前 不要调用任何Facebook sdk 方法,比如: Fac…

量子力学:探索微观世界的奇妙之旅

量子力学:探索微观世界的奇妙之旅 引言 在21世纪初,我们逐渐进入了一个以信息技术为主导的新时代。在这个时代,量子力学作为一门研究物质世界微观结构、粒子间相互作用以及能量与信息转换的基础科学,对我们的生活产生了深远的影响…

【Linux】:信号(一)产生

信号 一.前台进程和后台进程1.前台进程2。后台进程3.总结 二.自定义信号动作接口三.信号的产生1.键盘组合键2.kill信号进程pid3.系统调用1.kill函数2.raise函数3.abort函数 四.异常五.软件条件六.core文件 一.前台进程和后台进程 1.前台进程 一个简单的代码演示 像这种程序在…

求臻医学满分通过EMQN室间质评,检测实力再获国际权威机构认可

近日,欧洲分子基因诊断质量联盟(European Molecular Genetics Quality Network,EMQN)公布了2023年Oncogene panel 项目能力验证考核结果,求臻医学旗下北京和杭州检验实验室,使用自主研发的ChosenOne大Panel…

【目标检测】进行实时检测计数时,在摄像头窗口显示实时计数个数

这里我是用我本地训练的基于yolov8环境的竹签计数模型,在打开摄像头窗口增加了实时计数显示的代码,可以直接运行,大家可以根据此代码进行修改,其底层原理时将检测出来的目标的个数显示了出来。 该项目链接:【目标检测…

制造业如何做生产设备管理、分析生产数据?

本文将为大家讲解:1、设备管理的现状与问题;2、设备管理系统功能;3、制造业企业如何做生产设备管理、分析生产数据?4、制造业设备管理的价值。 想要管理好设备,设备档案管理、巡检、报修、保养、分析预警等问题都是必须…

探索H5的神秘世界:测试点解析

Html5 app实际上是Web app的一种,在测试过程中可以延续Web App测试的部分方法,同时兼顾手机端的一些特性即可,下面帮大家总结下Html5 app 相关测试方法! app内部H5测试点总结 1、业务逻辑 除基本功能测试外,需要关注的…

设计模式详解(三):工厂方法

目录导航 抽象工厂及其作用工厂方法的好处工厂方法的实现关系图实现步骤 工厂方法的适用场景工厂方法举例 抽象工厂及其作用 工厂方法是一种创建型设计模式。所谓创建型设计模式是说针对创建对象方面的设计模式。在面向对象的编程语言里,我们通过对象间的相互协作&…

Pytorch进阶教学——训练一个图像分类模型(GPU)

目录 1、前言 2、数据集介绍 3、获取数据 4、创建网络 5、训练模型 6、测试模型 6.1、测试整个模型准确率 6.2、测试单张图片 1、前言 编写一个可以分类蚂蚁和蜜蜂图片的模型,使用数据集对卷积神经网络进行训练。训练后的模型可以对蚂蚁或蜜蜂的图片进行…

单片机学习12——电容

电容的作用: 1)降压作用: 容抗: Xc 1/2fc 串联分压原理。2100Ω的容量,50Hz的频率,可以得到1.5uF。断电之后,需要串联一个1MΩ的电阻放电。 那是不是可以使用2100欧姆的电阻来代替电容呢&am…