💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

【图像误差测量】测量 2 张图像之间的差异,并测量图像质量

图像误差测量是一项重要的研究领域,旨在开发有效的方法来量化和评估图像之间的差异。这些差异可以来自于图像处理、压缩、传输或其他图像处理过程中的各种因素。

在图像处理领域,准确地测量图像之间的误差是评估算法效果和优化算法的关键。通过比较原始图像和经过处理后的图像,可以确定图像处理算法对图像所做的修改,并评估其对图像质量的影响。

常用的图像误差测量方法包括:

- 均方误差 (MSE):计算两幅图像的像素之间差值的平方的平均值。较大的MSE值表示较大的差异。

- 峰值信噪比 (PSNR):通过比较两幅图像的动态范围和均方误差来评估图像质量。PSNR值越高,表示图像质量越好。

- 结构相似性指数 (SSIM):通过比较图像的亮度、对比度和结构信息等方面的相似性来评估图像的质量。较高的SSIM值表示较高的相似性。

- 互信息 (MI):衡量两幅图像之间的信息重叠程度。较高的互信息值表示较高的相似性。

- 泊松噪声比 (PNR):通过估计图像中的噪声和估计信号之间的比值来评估图像质量。较高的PNR值表示较好的图像质量。

另外,随着深度学习和人工智能的发展,还涌现出一些基于神经网络的图像误差测量方法,如基于卷积神经网络 (CNN) 的结构相似度指数 (CNN-SSIM) 和感知损失 (Perceptual Loss) 等。

图像误差测量的研究旨在改进现有的方法,并开发新的有效算法来更准确地评估图像之间的差异。这些研究对于图像处理任务如图像复原、超分辨率、图像压缩和图像质量评估等具有重要的实际应用价值。通过深入研究图像误差测量,我们可以更好地理解图像的特性,并为相关领域的进一步发展提供指导和支持。

本文旨在测量两张图像之间的差异并评估图像质量。以下是常用的几种图像误差测量方法:

1. 均方误差 (MSE):计算两张图像像素之间差值的平方的平均值。这个指标越小,表示两张图像越相似。

2. 均方根误差 (RMSE):将均方误差的结果开方,以得到具有与原始像素单位一致的测量值。

3. 峰值信噪比 (PSNR):通过比较两张图像的动态范围和均方误差来衡量图像质量。这个指标的值越高,表示两张图像之间的差异越小,图像质量越高。

4. 平均绝对误差 (MAE):计算两张图像像素之间差值的绝对值的平均值。与均方误差不同,MAE更加关注图像中的小差异。

5. 信噪比 (SNR):通过比较图像中有用信号的强度与噪声的强度来评估图像的质量。一个较高的信噪比表示图像中有较少的噪声干扰。

6. 通用图像质量指数 (IQI):综合考虑了图像的亮度、对比度、锐度和颜色等方面的信息,以评估图像的整体质量。

7. 增强测量误差 (EME):通过将图像的增强后版本与原始版本进行比较,来衡量图像的质量提升程度。

8. 皮尔逊相关系数:衡量两张图像之间的线性相关性。当相关系数接近于1时,表示两张图像高度相关;当接近于0时,表示两张图像不相关。

通过使用这些图像误差测量方法,我们可以客观地评估图像之间的差异并量化图像质量。这些指标对于图像处理和图像质量控制非常重要,可以帮助我们优化和改进图像处理算法,并提供更好的视觉体验。

📚2 运行结果

部分代码:

noiseTypeModes = {
    'gaussian',         % [1]
    'salt & pepper',    % [2]    
    'localvar',         % [3]
    'speckle',          % [4] (multiplicative noise)
    'poisson',          % [5]
    'motion blur',      % [6]
    'erosion',          % [7]
    'dilation',         % [8]
    % 'jpg compression blocking effect'   % [9]
    % [10] Interpolation/ resizing noise <to do>
    };

noiseChosen = 2;
noiseTypeChosen = char(noiseTypeModes(noiseChosen));

originalImage = uint8(IMG);

%% plot original
titleStr = 'Original';

imagePlot( originalImage, plotRowSize, plotColSize, ...
                    plotIndex, titleStr );
plotIndex = plotIndex + 1;

%%
for i = 1:(plotRowSize*plotColSize)-1

IMG_aforeUpdated = double(IMG);    % backup the previous state just in case it gets updated.

% returns the noise param updates for further corruption    
% IMG may be updated as the noisy image for the next round
[IMG, noisyImage, titleStr, sigma, dilationFilterSize, erosionFilterSize] = ...
    noisyImageGeneration(IMG, mean, sigma, offset, dilationFilterSize, erosionFilterSize, noiseTypeChosen);

imageQualityIndex_Value = imageQualityIndex(double(originalImage), double(noisyImage));

titleStr = [titleStr ',' newline 'IQI: ' num2str(imageQualityIndex_Value)];

imagePlot( noisyImage, plotRowSize, plotColSize, ...
                    plotIndex, titleStr );
plotIndex = plotIndex + 1;

end

if (~strcmp(char(class(noisyImage)), 'uint8'))
    disp('noisyImage is NOT type: uint8');
end

%% PSNR
psnr_Value = PSNR(originalImage, noisyImage);
    fprintf('PSNR = +%5.5f dB \n', psnr_Value);
%% RMSE
[mse, rmse] = RMSE2(double(originalImage), double(noisyImage));
    fprintf('MSE = %5.5f \n', mse);
    fprintf('RMSE = %5.5f \n', rmse);
%% Universal Quality Index
imageQualityIndex_Value = imageQualityIndex(double(originalImage), double(noisyImage));
    fprintf('Universal Image Quality Index = %5.5f \n', imageQualityIndex_Value);
%% Enhancement : measure of enhance- ment, or measure of improvement
[M M] = size(originalImage);
L = 8;
EME_original = eme(double(originalImage),M,L);
EME_noisyImage = eme(double(noisyImage),M,L);
    fprintf('EME (original image) = %5.5f \n', EME_original);
    fprintf('EME (noisy image) = %5.5f \n', EME_noisyImage);
%% PearsonCorrelationCoefficient
pcc = compute_PearsonCorrelationCoefficient (double(originalImage), double(noisyImage));
    fprintf('PearsonCorrelationCoefficient (originalImage vs noisyImage) = %5.5f \n', pcc);
pcc = compute_PearsonCorrelationCoefficient (double(originalImage), double(originalImage));
    fprintf('PearsonCorrelationCoefficient (originalImage vs originalImage) = %5.5f \n', pcc);

%% Signal to signal noise ratio, SNR
noise = double(noisyImage) - double(originalImage); % assume additive noise

% check noise
noisyImageReconstructed = double(originalImage) + noise;
residue = noisyImageReconstructed - double(noisyImage);

if (sum(residue(:) ~= 0))
    disp('The noise is NOT relevant.');
end

snr_power = SNR(originalImage, noise);
    fprintf('SNR = %5.5f dB \n', snr_power);
    
%% Mean absolute error, MAE
mae = meanAbsoluteError(double(originalImage), double(noisyImage));
    fprintf('MAE = %5.5f \n', mae);

noiseTypeModes = {
    'gaussian',         % [1]
    'salt & pepper',    % [2]    
    'localvar',         % [3]
    'speckle',          % [4] (multiplicative noise)
    'poisson',          % [5]
    'motion blur',      % [6]
    'erosion',          % [7]
    'dilation',         % [8]
    % 'jpg compression blocking effect'   % [9]
    % [10] Interpolation/ resizing noise <to do>
    };

noiseChosen = 2;
noiseTypeChosen = char(noiseTypeModes(noiseChosen));

originalImage = uint8(IMG);

%% plot original
titleStr = 'Original';

imagePlot( originalImage, plotRowSize, plotColSize, ...
                    plotIndex, titleStr );
plotIndex = plotIndex + 1;

%%
for i = 1:(plotRowSize*plotColSize)-1

IMG_aforeUpdated = double(IMG);    % backup the previous state just in case it gets updated.

% returns the noise param updates for further corruption    
% IMG may be updated as the noisy image for the next round
[IMG, noisyImage, titleStr, sigma, dilationFilterSize, erosionFilterSize] = ...
    noisyImageGeneration(IMG, mean, sigma, offset, dilationFilterSize, erosionFilterSize, noiseTypeChosen);

imageQualityIndex_Value = imageQualityIndex(double(originalImage), double(noisyImage));

titleStr = [titleStr ',' newline 'IQI: ' num2str(imageQualityIndex_Value)];

imagePlot( noisyImage, plotRowSize, plotColSize, ...
                    plotIndex, titleStr );
plotIndex = plotIndex + 1;

end

if (~strcmp(char(class(noisyImage)), 'uint8'))
    disp('noisyImage is NOT type: uint8');
end

%% PSNR
psnr_Value = PSNR(originalImage, noisyImage);
    fprintf('PSNR = +%5.5f dB \n', psnr_Value);
%% RMSE
[mse, rmse] = RMSE2(double(originalImage), double(noisyImage));
    fprintf('MSE = %5.5f \n', mse);
    fprintf('RMSE = %5.5f \n', rmse);
%% Universal Quality Index
imageQualityIndex_Value = imageQualityIndex(double(originalImage), double(noisyImage));
    fprintf('Universal Image Quality Index = %5.5f \n', imageQualityIndex_Value);
%% Enhancement : measure of enhance- ment, or measure of improvement
[M M] = size(originalImage);
L = 8;
EME_original = eme(double(originalImage),M,L);
EME_noisyImage = eme(double(noisyImage),M,L);
    fprintf('EME (original image) = %5.5f \n', EME_original);
    fprintf('EME (noisy image) = %5.5f \n', EME_noisyImage);
%% PearsonCorrelationCoefficient
pcc = compute_PearsonCorrelationCoefficient (double(originalImage), double(noisyImage));
    fprintf('PearsonCorrelationCoefficient (originalImage vs noisyImage) = %5.5f \n', pcc);
pcc = compute_PearsonCorrelationCoefficient (double(originalImage), double(originalImage));
    fprintf('PearsonCorrelationCoefficient (originalImage vs originalImage) = %5.5f \n', pcc);

%% Signal to signal noise ratio, SNR
noise = double(noisyImage) - double(originalImage); % assume additive noise

% check noise
noisyImageReconstructed = double(originalImage) + noise;
residue = noisyImageReconstructed - double(noisyImage);

if (sum(residue(:) ~= 0))
    disp('The noise is NOT relevant.');
end

snr_power = SNR(originalImage, noise);
    fprintf('SNR = %5.5f dB \n', snr_power);
    
%% Mean absolute error, MAE
mae = meanAbsoluteError(double(originalImage), double(noisyImage));
    fprintf('MAE = %5.5f \n', mae);

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]路慧娟.影像测量误差实验估计[D].西安体育学院[2023-09-21].DOI:10.7666/d.d142172.

[2]康立丽,林意群,林木炎.MR信噪比一幅图像测量方法与两幅图像测量方法对照研究[J].北京生物医学工程, 2004, 23(1):4.DOI:10.3969/j.issn.1002-3208.2004.01.002.

[3]吴晓波,安文斗.图像测量系统中的误差分析及提高测量精度的途径[J].光学精密工程, 1997, 5(1):12.DOI:CNKI:SUN:GXJM.0.1997-01-022.

[4]廖强华,钟江生.基于图像处理的光纤阵列误差测量[J].计算机工程, 2006, 32(10):3.DOI:10.3969/j.issn.1000-3428.2006.10.097.

🌈4 Matlab代码实现

相关文章

使用Go Validator在Go应用中有效验证数据

Go Validator是一个开源的包,为Go结构体提供强大且易于使用的数据验证功能。该库允许开发者为其数据结构定义自定义验证规则,并确保传入的数据满足指定的条件。Go Validator支持内置验证器、自定义验证器,甚至允许您链式多个验证规则以满足更复杂的数据验证需求。如果内置验证器无法满足您的需求,您可以通过定义自己的验证函数来创建自定义验证器。这个功能允许您实现特定于应用程序需求的验证逻辑。

C# this关键字的作用

关键字在C#中主要用于引用当前对象,区分字段与局部变量,调用其他构造函数以及传递当前对象给其他方法或构造函数。

C语言中关于#include的一些小知识

如果是你自己编写的头文件,那么如果没加唯一包含标识的话,那么编译器会编译报错的。如果是系统自带的头文件,由于其每个头文件都加了特殊标识,所以即使你包含两遍,也不会有问题。上面的代码片段会首先判断HEADER_FILE_NAME_H是否被定义,若未定义则进行后续操作;#ifndef HEADER_FILE_NAME_H // 定义了一个名为HEADER_FILE_NAME_H的标记符号。#define HEADER_FILE_NAME_H // 当第一次包含该头文件时,将此标记设置为已定义状态。

C语言中的作用域与生命周期

但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用了,其他源文件,即使声明了,也是无法正常使用的。结论:static修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来一个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。extern 是用来声明外部符号的,如果一个全局的符号在A文件中定义的,在B文件中想使用,就可以使用extern进行声明,然后使用。全局变量的生命周期是:整个程序的生命周期。

Python和Java的区别(不断更新)

运行效率:一般来说,Java的运行效率要高于Python,这主要是因为Java是编译型语言,其代码在执行前会进行预编译,而Python是解释型语言,边解释边执行。而Python没有类似的强大虚拟机,但它的核心是可以很方便地使用C语言函数或C++库,这使得Python可以轻松地与底层硬件进行交互。**类型系统:**Java是一种静态类型语言,所有变量需要先声明(类型)才能使用,且类型在编译时就已经确定。总的来说,Python和Java各有其优势和特点,选择哪种语言取决于具体的项目需求、开发环境以及个人偏好。

C#中的浅度和深度复制(C#如何复制一个对象)

接着,我们修改了复制得到的对象及其引用类型字段的属性值,最后输出原始对象和复制对象的属性值。这意味着如果一个类包含引用类型成员,在执行深度复制时,不仅复制这些引用,还会递归地复制引用所指向的对象,直到所有的引用都指向全新的对象实例。当进行浅复制时,系统会创建一个新的对象实例,但这个新对象的字段将与原始对象中的值类型字段具有相同的值,而对于引用类型字段,则仅仅是复制了。也就是说,如果一个类中有引用类型的成员变量(比如数组、其他自定义类的对象等),那么浅复制后,新对象和原对象的这些引用类型成员仍然指向。

C++ STL精通之旅:向量、集合与映射等容器详解

STL 作为一个封装良好,性能合格的 C++ 标准库,在算法竞赛中运用极其常见。灵活且正确使用 STL 可以节省非常多解题时间,这一点不仅是由于可以直接调用,还是因为它封装良好,可以让代码的可读性变高,解题思路更清晰,调试过程往往更顺利。

二维平面阵列波束赋形原理和Matlab仿真

阵面左下角天线位于坐标原点,将坐标原点阵元设为参考阵元,计算每个阵元相对于该参考阵元的入射波程差,从而来计算每个阵元接收的回波信号。实现波束赋形的最基本的方法是对各个天线阵元的信号进行适当延迟后相加,使目标方向的信号同相叠加得到增强,而其他方向均有不同程度的削弱,该方法通常用于模拟信号.根据上述理论推导可以仿真任意平面阵列的方向图,这里对两种典型的阵列(矩形平面阵列和圆形阵列)进行Matlab仿真,其余类型的阵列在此基础上修改即可。根据上述圆形阵列公式做仿真,得到下述的三维空间方向图。

解决Linux环境下gdal报错:ERROR 4: `/xxx.hdf‘ not recognized as a supported file format.

题外话:我发现linux系统和Windows系统下面,库的版本是有差异的。比如我的本机Windows上装的是gdal3.2.3和numpy1.19.1,linux服务器上装的却是gdal3.0.2和numpy1.21.5。这个是很常见的回复,网上许多回答都说低版本的 gdal 不支持 hdf5,让你重装高版本的gdal。我之前用pip安装了whl,暴力装上了,但用的时候就会有问题。安装了不冲突的gdal之后,就成功打开文件啦~一开始我是抱着试试的心态,用conda,不用pip,重新安装了一下我的gdal。

C语言常见面试题:什么是枚举,枚举的作用是什么?

首先,枚举是一种特殊的类,它的主要作用是封装一组常量,例如,一周的七天、月份、季节等。枚举在JDK1.5后被引入,相较于之前的常量定义方式,枚举具有更好的安全性和更好的性能。每个枚举常量都是该枚举类的一个实例,因此可以使用构造函数来初始化每个枚举常量的值。综上所述,枚举的常用用法包括常量定义、switch语句、添加新方法、覆盖枚举的方法、实现接口以及使用接口组织枚举等。枚举是一种特殊的数据类型,它是一组具命名的整型常量的集合。枚举是一种特殊的数据类型,它是一组具命名的整型常量的集合。

为什么Java中的String类被设计为final类?

String类作为Java中不可或缺的类之一,被设计成final类带来了不可变性、安全性、可靠性和性能优势。不可变的特性使得String对象在多线程环境下安全共享,提高了应用程序的并发性和性能。此外,String类的设计还符合Java类库的一致性和规范,确保了整个语言的稳定性和可靠性。因此,String类被设计成final类是出于多方面的考虑,以提供最佳的使用体验和编程效率。

Promise和箭头函数和普通函数的区别

箭头函数与普通函数的区别在于: 1、箭头函数没有this,所以需要通过查找作用域链来确定this的值,这就意味着如果箭头函数被非箭头函数包含,this绑定的就是最近一层非箭头函数的this, 2、箭头函数没有自己的arguments对象,但是可以访问外围函数的arguments对象 3、不能通过new关键字调用,同样也没有new.target值和原型。6、箭头函数没有自己的arguments,可以在箭头函数中使用rest参数代替arguments对象,来访问箭头函数的参数列表。

ElasticSearch 集群搭建与状态监控cerebro

在单机上利用docker容器运行多个es实例来模拟es集群。部署es集群可以直接使用docker-compose来完成,但要求Linux虚拟机至少有4GI的内存空间。&quot;number_of_replicas&quot;: 1 // 副本数。&quot;number_of_shards&quot;: 3,// 分片款量。kibana可以监控es集群,不过新版本需要依赖es的x-pack 功能,配置比较复杂。第一种方式:利用kibana的DevTools创建索引库 ,在DevTools中输入指令。第二种方式:利用cerebro创建索引库。

【HarmonyOS】ArkTS语言介绍与组件方式运用

自定义组件自定义函数:自定义函数可以将烦长的代码单独抽离出一个函数当中,然后在原位置调用我们设置的函数即可,自定义函数可以定义在全局或组件内,如下:@Styles装饰器@Extend装饰器// 继承模式,只能写在全局。

SpringMVC之获取请求参数和域对象共享数据

一、SpringMVC获取请求参数1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数6、通过POJO获取请求参数7、解决获取请求参数的乱码问题二、域对象共享数据1、使用ServletAPI向request域对象共享数据2、使用ModelAndView向request域对象共享数据3、使用Model向request域对象共享数据4、使用map向request域对象共享数据5、使用ModelMap向request域对象共享数据。

Python使用多线程解析超大日志文件

使用Python的多线程技术可以有效地提高处理超大日志文件的效率。但在实际应用中需要注意多线程编程中的各种问题,如线程管理、资源管理、错误处理等。通过合理的优化和调整可以提高程序的性能和稳定性。

基于Python Django的内容管理系统Wagtail CMS部署与公网访问

Wagtail是一个用Python编写的开源CMS,建立在Django Web框架上。Wagtail是一个基于Django的开源内容管理系统,拥有强大的社区和商业支持。它专注于用户体验,并为设计人员和开发人员提供精确控制。它能快速实现页面的表达,对于我这种对新实现的功能想要找到地方进行展示,但前端能力又不太行的同学基于django 一直会对django的稳定版本进行支持Wagtail由开发人员为开发人员构建。

C#动态生成带参数的小程序二维码

在微信小程序管理后台,我们可以生成下载标准的小程序二维码,提供主程序入口功能。在实际应用开发中,小程序二维码是可以携带参数的,可以动态进行生成

RPC简介和grpc的使用

调用客户端句柄,执行传递参数。调用本地系统内核发送网络消息。消息传递到远程主机,就是被调用的服务端。服务端句柄得到消息并解析消息。服务端执行被调用方法,并将执行完毕的结果返回给服务器句柄。服务器句柄返回结果,并调用远程系统内核。消息经过网络传递给客户端。客户端接受数据。

【Java 基础篇】Java TCP通信详解

本文介绍了Java中如何使用TCP协议进行网络通信,包括TCP的基础知识、TCP编程的基本步骤、创建TCP服务器和客户端、数据传输等内容。通过学习本文,您可以开始使用TCP协议来构建自己的网络应用程序,实现可靠的数据传输。希望本文能够帮助您更好地理解和应用Java中的TCP通信。

【Java 基础篇】Java多线程实现文件上传详解

本文介绍了如何使用Java多线程实现文件上传功能。通过将文件切割为多个块并使用多线程同时上传,可以提高文件上传的效率。同时,服务器端需要接收和重组这些块数据以还原原始文件。希望本文对您理解文件上传的原理以及如何实现多线程文件上传有所帮助。如果您有任何问题或疑问,请随时提出。
返回
顶部