利用各种梯度算子,Roberts,Sobel,Canny等算子对灰度图像计算梯度,然后对梯度图像进行性能评价,有很多指标,本博客主要介绍一下MSE,PSNR,FOM的实现,具体原理就不解释了,直接放代码吧
一丶计算MSE和PSNR
Compute_MSE_PSNR.m
function [PSNR, MSE] = Compute_MSE_PSNR(Ref_img, goal_img)%输入图像为参考图像和要计算MSE和PSNR的图像,输出为PSNR和MSE
Ref_img=double(Ref_img);
goal_img=double(goal_img);
if nargin<2
Ref_img=goal_img;
else
if any(size(Ref_img)~=size(goal_img))%判断两个图像的大小是否相同
error('The input size is not equal to each other!');%如果不同 报错“俩图像大小不同”
end
img_diff = Ref_img-goal_img;%两个图像转换为double类型做差分,相减
end
%
MSE=sum(img_diff(:).^2)/numel(goal_img);%numel函数结果即为图像长*宽 也就是像素总数
PSNR=10*log10(255^2/MSE);
二丶计算FOM
ComputeFOM.m
FOM的原理可参考这篇论文,下载链接:
function fom = ComputeFOM(Ref_img,goal_img)
a=1/9;%公式中比例常数
edgeNum_Ref=length(find(Ref_img));%理想图像或者参考图像的边缘点数量
edgeNum_goal=length(find(goal_img));%目标图像的边缘点数量
MaxEdgeNum=max(edgeNum_Ref,edgeNum_goal);%计算两图像中边缘点数量多的图像的数量
[row_Ref,col_Ref]=find(Ref_img);%获取图像中不为0的点的坐标,也就是边缘点的坐标
[row_goal,col_goal]=find(goal_img);
rowNum_Ref=size(Ref_img,1);%参考图像的行和列的数量
colNum_Ref=size(Ref_img,2);
d=sqrt(rowNum_Ref^2+colNum_Ref^2)*ones(1,length(find(Ref_img)));%图像的对角线像素数*(1,参考图像边缘点的数量)大小的全为1的矩阵,结果应该是值全为对角线值
dd=zeros(1,length(find(goal_img)));%创建一个(1,目标图像边缘点数量)大小的全为1的矩阵
for i=1:length(find(goal_img))
for j=1:length(find(Ref_img))
d(j)=(row_goal(i)-row_Ref(j))^2+(col_goal(i)-col_Ref(j))^2;%理想边缘点最近欧式距离d的平方值即为所求
end
dd(i)=min(d);
end
fom = sum(9./(9+dd))/MaxEdgeNum;