2017-10-29 08:59:17 piaoxuezhong 阅读数 17138
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29955 人正在学习 去看看 张中强

前言:

对于一种图像处理方法,怎么样来判断该算法效果的好坏呢?除了人眼本身的观察,还可以用某种指标来量化评判,本文将总结一下图像质量评判的方法及实现。

图像质量评价分类(IQA:image quality assessment):

图像质量评价目前来看主要分为两类:

(1)主观评价。即用人眼观察和评判图像,主观评价和人的感觉相一致,但是容易受到环境、心境等影响,而且大量评价图像时也显得不现实。

(2)客观评价。即采用算法进行评价,相比于主观评价,客观评价具有操作简单、成本低、易于解析和实现等优点,是图像质量评价的研究重点。所以本篇重点总结一下客观评价的几种方法。

客观评价算法根据其对参考图像的依赖程度, 可分成三类:( 1) 全参考: 和参考图像的所有像素点做对应比较; ( 2) 半参考: 只需要和参考图像上的部分统计特征做比较;( 3) 无参考: 不需要具体的参考图像。其中全参考算法是研究时间最长、发展最成熟的。

一、全参考评价:

全参考算法根据算法采用的技术路线, 可分为基于误差统计量的算法和基于 HVS 模型的算法。

1.基于误差统计量的算法的思路: 通过设计特征来比较失真图像和参考图像的局部差异, 然后在整幅图像上求出一个总的平均统计量, 并把这个统计量与图像质量关联起来。最简单的质量评价算法就是均方差(Mean Squared Error, MSE)和峰值信噪比(Peak Signal- Noise Ratio, PSNR)。MSE 和 PSNR 计算复杂度小,易于实现,在图像处理领域中广泛应用。但缺点是它们给出的数值与图像的感知质量之间没有必然联系。

2.基于 HVS 模型的算法的思路:通过对 HVS 的某些底层特性进行建模,将失真图像和参考图像之间的绝对误差映射为能被人眼觉察的 JND( Just noticeable difference) 单位。根据对 HVS 模型描述的侧重点不同,又可以将图像质量评价模型归结为基于误差灵敏度评价算法基于结构相似度评价算法两类。

2.1基于误差灵敏度的质量评价算法

该方法可用图1描述,算法不同之处在于侧重点和处理方式上的区别。

图1.基于误差灵敏度的评价框架

该方法的缺点在于:

(a)基于 HVS 特征的方法一般认为原始图像质量是完美的,Weber 定律和点扩散函数(Point Spread Function)模型始终成立。

(b)一般假定 HVS 的多通道响应可以通过线性离散集合来模拟。

(c)一般假定通道分解是无损或无损于视觉的,变换后仍保持了质量评价的绝大部分信息。

(d)一般认为通道分解剔除了图像间的关联,道变换的作用可以通过掩蔽模型来模拟。

(e)HVS 的评价值可以通过测试误差的非线性组合来模拟,目前大多采用线性加权组合。

前 3 条假设从 HVS 的特点以及实际操作来说,相对比较合理。实验表明自然图像经过通道分解后,相同位置上的特征基本上相同或者相似,即各通道之间实际上存在较高的相关性,这与上述(d)点假设相矛盾。另外,误差的统计量来表征图像质量方法,论其如何加权组合,仍可能存在两幅图像失真类型完全不一样、但误差相同的现象。故上述(e)点假设也不合适。

2.2基于结构相似度的图像质量评价算法

自然图像具有特定的结构,素间有很强的从属关系,这些从属关系反映了视觉场景中的结构信息。由此产生了基于结构失真的图像质量评价方法,称为结构相似 (SSIM)方法,框架参见图2。


图2.结构相似度评价框架

小结:基于误差灵敏度的方法通过人为模拟 HVS 对误差敏感度进行量化,过程易于解析,但是其算法过于繁杂;SSIM 评价方法通过测量图像结构信息的改变来反映图像质量的失真情况,算法上明显简化,但同时也屏蔽掉了 HVS的其它生理特征,过程不易于解析。所以,将 SSIM 和基于误差灵敏度的评价方法中采用的 HVS 特征加权评价联合起来,是图像质量评价今后的一个发展方向。

二、半参考评价:

半参考算法可以分为两种: 基于图像特征统计量的算法基于数字水印的算法。这类算法的特点是其只需从参考图像中提取部分统计量用于比较, 无需原始的像素级别的信息。

三、无参考评价:

无参考算法可以分为两种: 针对失真类型的算法基于机器学习的算法。这类方法的特点无需参考图像, 灵活性强。无参考算法的难点在于如何使评价结果尽量不受图像内容的影响。

衡量算法性能的定量指标:

图像质量评价算法应该具备以下特性:

( 1) 准确性:主观与客观评价值之间的差异较小;

( 2) 单调性: 客观评价值应随主观评价值的增减而增减;

( 3) 一致性: 算法在测试集上表现出的性能与其在训练集上表现的性能相近似。


图像质量评价算法实现:

这里附上几种图像质量评价指标的算法实现。

(1)峰值信噪比-PSNR(Peak Signal to Noise Ratio)

峰值信噪比(PSNR)经常用作图像压缩等领域信号重建质量的评价,常简单的方式是通过均方差(MSE)来定义:


MSE为当前图像 X 和参考图像 Y 的均方误差(Mean Square Error)。H、W 分别表示图像的高和宽;n为每像素的比特数,一般取8,即像素灰阶数为256。PSNR的单位是dB,数值越大表示失真越小。

    function pnsr_result = psnr(img_ref,img_in)       
        %   img_ref is a high reference quality image   
        %   img_in is the denoise image    
        %   pnsr_result is the PSNR of the denoise image    
        width = size(img_ref,2);    
        heigh = size(img_ref,1);    
        if( width ~= size(img_in,2) || heigh ~= size(img_in,1) )    
            disp('Please check whether the input image and reference image have same size');    
            return    
        end    
        [a,b]=size(img_ref);      
        XX=double(img_ref) - double(img_in);      
        mse_value = sum(sum( XX.^2 ))/(a*b);      
        pnsr_result = 10*log10( 255*255 / mse_value );   
    end

(2)SSIM

两张图像 X 和 Y 的结构相似性可按照以下方式求出:

,

其中 μ 是平均值,是的方差,σ是的方差,σxy是协方差。

是用来维持稳定的常数。L 是像素值的动态范围,k1=0.01,k2=0.03。结构相似性的范围为-1到1,当两张图像一模一样时,SSIM的值等于1。
结构相似度指数从图像组成的角度将结构信息定义为独立于亮度、对比度,反映场景中物体结构的属性,并将失真建模为亮度、对比度和结构三个不同因素的组合。均值作为亮度的估计,标准差作为对比度的估计,协方差作为结构相似程度的度量。

其中,matlab实现里附带了详细的步骤说明和测试函数,我这附下测试结果:


(3)信噪比(SNR)

顾名思义,信噪比就是有用信号与噪声信号的比值,具体我直接附维基里的定义:


matlab实现:

function snr=SNR2(I,In)
% 计算噪声比
% I :original signal
% In:noisy signal
% snr=10*log10(sigma2(I2)/sigma2(I2-I1))

[~,~,nchannel]=size(I);
snr=0;
I=double(I);
In=double(In);
if nchannel==1
    Ps=sum(sum((I-mean(mean(I))).^2));%signal power
    Pn=sum(sum((I-In).^2));%noise power
    snr=10*log10(Ps/Pn);
elseif nchannel==3
    for i=1:3
        Ps=sum(sum((I(:,:,i)-mean(mean(I(:,:,i)))).^2));%signal power
        Pn=sum(sum((I(:,:,i)-In(:,:,i)).^2));%noise power
        snr=snr+10*log10(Ps/Pn);
    end
    snr=snr/3;
end
测试函数结果:

%% snr
clc,clear all,close all;
ref = imread('D:\fcq_proMatlab\test_image\15.jpg');
H = fspecial('Gaussian',[11 11],1.5);
A = imfilter(ref,H,'replicate');
subplot(1,2,1); imshow(ref); title('Reference Image');
subplot(1,2,2); imshow(A);   title('Blurred Image');
snrValue=SNR2(ref,A )

snrValue =

   25.6430

参考:

  1. 《图像质量评价研究综述》[J]. 计算机科学
  2. 《图像质量研究方法进展》[J]. 电子与信息学报
  3. 《基于频域的结构相似度的图像质量评价方法》[J]. 清华大学学报
  4. http://blog.csdn.net/purgle/article/details/73719101
  5. http://blog.csdn.net/ebowtang/article/details/43643037
  6. http://blog.csdn.net/xiaohaijiejie/article/details/48053595
2018-11-28 22:50:27 entoon 阅读数 1164
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29955 人正在学习 去看看 张中强

在实际应用当中,有时候需要进行图像增强来改善图像的视觉效果。在此问题处理当中,按照颜色可以分为灰度图像增强和彩色图像增强。按照作用域分类,可以分为空域处理和频域处理。

图像空域处理方法通常有灰度变换,直方图均衡,图像平滑和锐化。频域处理有DFT变换,采用滤波的方法进行图像增强。现有的方法自适应的效果都比较差,这里提出一种模糊自适应的方法,利用遗传算法完成图像的增强。

1,选着合适的评价函数,得到图像质量的适应度函数值

2,利用遗传算法,选择,交叉,变异 优化处理

3,得到优化结果,完成图像的自适应增强。
本案例采用beta函数来实现图像灰度变换曲线的自动拟合。相关代码如下
function Incmp_Beta_Result=IncmpBeta(a,b,X)
[m n]=size(X);
aaa=Gammln(a+b)-Gammln(a)-Gammln(b);
for i=1:m
for j=1:n
if X(i,j)<0 | X(i,j)>1
helpdlg(‘变量X的取值范围不在0和1之间’,‘错误!’);
return
end
if X(i,j)==0 | X(i,j)==1
bt(i,j)=0;
else
bt(i,j)=exp(aaa+alog(X(i,j))+blog(1-X(i,j)));
end
end
end

for i=1:m
for j=1:n
if X(i,j)<((a+1)/(a+b+2))
Incmp_Beta_Result(i,j)=bt(i,j)*Betacf(a,b,X(i,j))/a;
else
Incmp_Beta_Result(i,j)=1-bt(i,j)*Betacf(b,a,1-X(i,j))/b;
end
end
end

%//////////////Betacf过程//////////////////////////////
function Betacf_Result=Betacf(a,b,x)
itmax=100;
eps=0.0000003;
am=1;
bm=1;
az=1;
qab=a+b;
qap=a+1;
qam=a-1;
bz=1-qabx/qap;
for m=1:itmax
em=m;
tem=em+em;
d=em
(b-m)x/((qam+tem)(a+tem));
ap=az+dam;
bp=bz+d
bm;
d=-(a+em)(qab+em)x/((a+tem)(qap+tem));
aap=ap+d
az;
bpp=bp+dbz;
aold=az;
am=ap/bpp;
bm=bp/bpp;
az=aap/bpp;
bz=1;
if abs(az-aold)<eps
abs(az)
Betacf_Result=az;
break;
end
end
Betacf_Result=az;

%/////////////计算gama函数程序////////////////////////
function Gammln_result=Gammln(xx)
cof(1)=76.18009173;
cof(2)=-86.50532033;
cof(3)=24.01409822;
cof(4)=-1.231739516;
cof(5)=0.00120858003;
cof(6)=-0.00000536382;
stp=2.50662827465;
half=0.5;
one=1.0;
fpf=5.5;
x=xx-one;
tmp=x+fpf;
tmp=(x+half)log(tmp)-tmp;
ser=one;
for j=1:6
x=x+one;
ser=ser+cof(j)./x;
end
Gammln_result=tmp+log(stp
ser);
%----------programs end here---------------

适应度函数
function [sol eval]=fitnesszq_gray(sol,options)
%实现灰度图像增强的适应度函数
%%遗传算法的适应度函数。公式3-23的编程实现。
%////////////////////////////////////////////////////////////////////
a=sol(1);
b=sol(2);
P=imread(‘my.png’);
[M,N]=size§;
PP=double§;
n=M*N;
%求beta函数
syms t x
B=double(int((t.(a-1)).*((1-t).(b-1)),t,0,1));%分母
lmin=double(min(min§));
lmax=double(max(max§));
%原图像 P 归一化处理得到 G
G=(PP-lmin)/(lmax-lmin);
GP=IncmpBeta(a,b,G);
FP=round((lmax-lmin).GP+lmin);%原图像的变换
count=imhist(uint8(FP));
th=5;
NN=sum(count>th);%求像素个数大于一给定阈值的灰度级的数量
H=0;
co=count/(M
N);
%cc=co>0;
for i=1:256
if co(i)>0
H=H+co(i).*log2(co(i));
end
end
%H=-sum(co.*log2(co));
HH=-H;%求熵
delta=sum(sum(FP.2))/n-(sum(sum(FP))/n).2;%求方差
U=FP./(lmax-1);%模糊变换函数
pmr1=0;pmr2=0;
for i=1:M
for j=1:N-1
pmr1=pmr1+abs(U(i,j)-U(i,j+1));
end
end
for i=1:M-1
for j=1:N
pmr2=pmr2+abs(U(i,j)-U(i+1,j));
end
end
pmr=pmr1+pmr2;
area=sum(sum(U));%模糊几何量
Comp=area./(pmr.^2);
%本节设计的适应度函数
Fitness=log10(NN.*HH.*delta/Comp) %没有加;是为了在运行窗口可以看到运行中的结果

eval=Fitness;
%----------all programs end here---------------
%%%%来自PeP工作室%%%%邮箱matlabcc2018@126.com
https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-21346770580.6.36127221LMIfNH&id=587675105138

2011-07-17 18:16:43 droidpioneer 阅读数 29596
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29955 人正在学习 去看看 张中强
 

在图像处理算法研究中,很多时候需要有客观评价指标来对算法的性能进行评价。

比如,在图像复原、图像滤波算法研究中,需要采用客观评价指标来定量的来测试算法恢复出的图像相对于参考图像的好坏程度。

本文介绍文献中提到到三个比较好的客观评价指标——峰值性噪比PSNR、模糊系数K、质量因素Q,其定义分别是:

这三个指标的详细定义见参考文献[1]~[3],下面给出这三个评价指标的MatLab实现。

 

%说明:本文件为计算两幅视频图象相对于高清晰图象的质量,其中:

%eyechart1.bmp为未处理前质量较差图象,核心区域的截图保存为area_eyechart1.bmp

%eyechart2.bmp为某种算法处理后质量较好图象,核心区域的截图保存为area_eyechart2.bmp

%eyechart3.bmp为高清晰参考图象,核心区域的截图保存为area_eyechart3.bmp

 

%程序流程为

%第一步:先分别从eyechart1.bmp、eyechart2.bmp、eyechart3.bmp中截取出核心区域,并分别保存为area_eyechart1.bmp、area_eyechart1.bmp、area_eyechart3.bmp

%第二步:以area_eyechart3.bmp为参考图象,计算area_eyechart1.bmp的PSNR、模糊系数KBlur、质量指数Q

%第三步:以area_eyechart3.bmp为参考图象,计算area_eyechart2.bmp的PSNR、模糊系数KBlur、质量指数Q

 

%程序可直接运行,运行结果为:

%1.保存并显示生成的截图文件area_eyechart1.bmp、area_eyechart1.bmp、area_eyechart3.bmp

%2、在控制台先显示第二步的计算结果,即area_eyechart1.bmp的三个质量指标,然后接着显示第三步的计算结果,即area_eyechart2.bmp的三个质量指标

 

%运行结果分析:area_eyechart2.bmp的PSNR和质量指数Q高,表明其质量较好,而area_eyechart1.bmp的模糊系数KBlur较大

%这是因为其有很多噪声被当着了边缘能量来计算,这也从一个方面说明模糊系数KBlur的应用具有局限性,但前者KBlur>1,后者<1,理论上只有模糊的情况下

%KBlur是<=1的,这也可根据KBlur与1的关系来判定图象收噪声污染的程度.

 

%******************从eyechart1.bmp,eyechart2.bmp两个文件中截取测试图象区域,可保证两图象截取的区域严格对准*****

a=imread('eyechart1.bmp','bmp');

b=a([203:396],[249:440]);

a=imread('eyechart2.bmp','bmp');

c=a([203:396],[249:440]);

 

%*******************从eyechart3.bmp中截取测试参考图象,截取部分需要进行缩放,使之与eyechart1.bmp,eyechart2.bmp截取部分大小匹配*******************************************************************

a=imread('eyechart3.bmp','bmp');

d=a([62:406],[60:395]);

e=imresize(d,[length(b(:,1)),length(b(1,:))], 'bicubic');%由于eyechart3.bmp和eyechart1.bmp,eyechart2.bmp比例不一样,这里要进行比例调整

imwrite(b,'area_eyechart1.bmp','bmp');

imwrite(c,'area_eyechart2.bmp','bmp');

imwrite(e,'area_eyechart3.bmp','bmp');

 

subplot(1,3,1);

imshow(e);

title('eyechart3.bmp截取部分,参考图象');

hold on;

subplot(1,3,2);

imshow(b);

title('eyechart1.bmp截取部分');

hold on;

subplot(1,3,3);

imshow(c);

title('eyechart2.bmp截取部分');

%*******************以下部分为计算截取图象area_eyechart1.bmp和area_eyechart1.bmp的PSNR、模糊系数、质量指数Q*

% 本文件功能为对计算污染图象相对于源图象的质量

clc;

clear;

PSNRenable=1;%PSNR计算使能,为0不计算,为1,计算

KBlurenable=1;%模糊系数KBlur计算使能,为0不计算,为1,计算

Qenable=1;%质量指数Q计算使能,为0不计算,为1,计算

 

for m=1:2

imsrcnamehead='area_eyechart3';%源图象文件名头

imsrcnameext='bmp';%源图象文件名扩展

if m==1 %以area_eyechart1.bmp为测试图象

imdstname=strcat('area_eyechart1','.',imsrcnameext);%污染图象文件名,可修改

elseif m==2%以area_eyechart2.bmp为测试图象

  imdstname=strcat('area_eyechart2','.',imsrcnameext);%污染图象文件名,可修改

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

iminfo=imfinfo(strcat(imsrcnamehead,'.',imsrcnameext));%源图象信息读取

imsrc=imread(strcat(imsrcnamehead,'.',imsrcnameext));%源图象读取

imdst=imread(imdstname,imsrcnameext);%污染图象读取

doubleimsrc=double(imsrc);%转换为浮点类型

doubleimdst=double(imdst);%转换为浮点类型

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%源图象和污染图象读取

W=iminfo.Width;%图象度

H=iminfo.Height;%图象高

%///////////////////PSNR计算/////////////////////////////////

if PSNRenable==1

PSNR=0.0;%PSNR赋初值

for j=1:H

  for i=1:W

      PSNR=PSNR+double((doubleimsrc(j,i)-doubleimdst(j,i))*(doubleimsrc(j,i)-doubleimdst(j,i)));

  end

end

PSNR=PSNR/W/H;

PSNR=10*log10(255*255/PSNR)

%////////////////////PSNR计算完毕//////////////////////////////////

end

%///////////////////模糊系数KBlur计算/////////////////////////////////

if KBlurenable==1

Sin=0.0;%Sin赋初值

Sout=0.0;

for j=2:H-1

  for i=2:W-1

      t=doubleimsrc(j-1,i+1)+doubleimsrc(j+1,i-1)-doubleimsrc(j-1,i-1)-doubleimsrc(j+1,i+1);

      if t<0 t=-t;

      end

      Sin=Sin+t;%源图象邻域边缘能量计算

      t=doubleimdst(j-1,i+1)+doubleimdst(j+1,i-1)-doubleimdst(j-1,i-1)-doubleimdst(j+1,i+1);

      if t<0 t=-t;

      end

      Sout=Sout+t;%污染图象邻域边缘能量计算

  end

end

KBlur=Sout/Sin

end

%////////////////////KBlur计算完毕////////////////////////////////////////

 

%///////////////////质量指数Q计算//////////////////////////////////////////

if Qenable==1

Q=0.0;%Q赋初值

Qnum=0;%图象以7X7块大小计算每块的Q,逐象素的移动块窗口,这里Qnum为块数量的计数

for j=4:H-3

  for i=4:W-3

      midsrc=0.0;

      middst=0.0;

      varsrc=0.0;

      vardst=0.0;%源图象和污染图象块内的平均值和方差赋初值

      varsrcdst=0.0;%源图象和污染图象块内的协方差赋初值

      for n=-3:3

          for m=-3:3

              midsrc=midsrc+doubleimsrc(j+n,i+m);

              middst=middst+doubleimdst(j+n,i+m);

          end

      end

      midsrc=midsrc/49;

      middst=middst/49;

      %源图象和污染图象块内的平均值计算

      for n=-3:3

          for m=-3:3

             varsrc=varsrc+(doubleimsrc(j+n,i+m)-midsrc)*(doubleimsrc(j+n,i+m)-midsrc);

             vardst=vardst+(doubleimdst(j+n,i+m)-middst)*(doubleimdst(j+n,i+m)-middst);

             varsrcdst=varsrcdst+(doubleimsrc(j+n,i+m)-midsrc)*(doubleimdst(j+n,i+m)-middst);

          end

      end

      varsrc=varsrc/48;

      vardst=vardst/48;

      varsrcdst=varsrcdst/48;

      if ((varsrc+vardst)*(midsrc*midsrc+middst*middst))~=0 %分母不为零的块才计算质量指数Q

      Q=Q+4*varsrcdst*midsrc*middst/((varsrc+vardst)*(midsrc*midsrc+middst*middst));

      %源图象和污染图象块内Q计算完毕

      Qnum=Qnum+1;%块计数加1

      end

  end

end

Q=Q/Qnum

end

%////////////////////质量指数Q计算完毕/////////////////////////////////////

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%图象质量计算完毕

参考文献

[1]袁飞,黄联芬,姚彦,视频质量客观评价技术研究,标准、检测与仪器,2007(3):91-94

[2]黄文辉 ,陈仁雷 ,张家谋,数字视频图像质量客观测量方法的改进与实现,北京邮电大学学报,2005(4):87-90

[3]Zhou Wang, Hamid R.Sheikh , Alan C. Bovik,Objective video quality assessment(Chapter 41 in The Handbook of Video Databases: Design and Applications)., CRC Press, 2003(1041-1078)

 

 

2017-06-25 17:24:30 purgle 阅读数 11222
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29955 人正在学习 去看看 张中强
1.图像评价指标

  图像评价指标用来客观评价图像处理中算法的优劣性,一般在对比实验中突出自己提出的算法的亮点。一般来说,每个细分的领域都有相应的指标,如边缘检测,有PFOM(Pratt’s Figure Of Merit)[1][2](第一个引用是它的来源,第二个引用是使用它的例子);图像增强,有EEME(Evaluating image Enhancement Measure by Entropy)[3][4]。
  还有一个比较大的领域–图像复原,包括图像去噪、去模糊、去雾等的评价指标基本上是通用的,都可以用复原后图像与参考图像对比来进行评价,即有参考图像评价指标。相应地提出一系列的指标:(R)MSE, (M)SSIM, PSNR(CSNR)等等,这些指标比较常见。原则上来说,采用越通用的指标,如去噪大家都采用PSNR和SSIM,这样得到的结果也越令人信服。#每种指标都有具体针对的情况,根据评价的目的和情况来设计评价算法。
  接下来介绍几种评价指标:

2.SMD2[5]

  图像的清晰度可以这样得到:对于模糊的图像,其整个图像的灰度较为均匀,相邻像素之间的差值会很小,相乘之后的结果会很小;图像越清晰,那么,边缘跟其周围像素灰度的差值也越大,相乘之后的值也会更大,这样就可以定义一个指标:灰度方差乘积(SMD2),它可以快速准确地来判断一副图像清晰的程度。

SMD2=|I(x,y)I(x+1,y)||I(x,y)I(x,y+1)|

用代码实现如下:

double getSMD2(const Mat& test)//SMD2=sum(|test(x,y)-test(x+1,y)|*|test(x,y)-test(x,y+1)|)
{
    double temp = 0;
    const uchar* ix;
    const uchar* ix1;
    for (int i = 0; i < test.rows-1; ++i)
    {
        ix = test.ptr<uchar>(i);
        ix1 = test.ptr<uchar>(i + 1);
        for (int j = 0; j < test.cols-1; ++j)
        {
            temp += abs(ix[j] - ix1[j])*abs(ix[j] - ix[j + 1]);
        }
    }
    return temp / (test.rows * test.cols);
}
3. 人眼特性评价指标HVSNR[6]

  人类的视觉感知有3个显著的特性,即视觉非线性特性(Weber定律)、视觉敏感度带通和视觉多通道及掩盖效应。利用小波变换与HVS多通道特性相匹配的特点,建立一种和人的视觉评价保持良好一致的方法,其评价结果与主观评价平均评价分数的相关系数达0.95,而对应的客观评价方法与主观评价平均评价分数的相关系数为0.81。利用对比度敏感度函数的带通特性以简化HVS模型,将不同空间频带失真用Minkowski求和进行非线性合并,最后仿照峰值信噪比的定义,得到结果。具体的步骤是:
  (1)将待测图像和标准图像选用D9/7小波进行分解,分解为4级;
  (2)将4级小波分为5个频带,对不同空间频带乘于对应的CSF系数;
  (3)待测图像和标准图像相减得到5个频带的误差E,然后按照下面公式进行求和:

S=(n=1N|En|β)1/β

  (4)根据信噪比的定义得到基于人眼视觉特性的信噪比结果:
HVSRN=10log[(2552)/s]

double **fwt97(double** matrix, int width, int height)
{
    //9 / 7 Coefficients:
    double a1 = -1.586134342;
    double a2 = -0.05298011854;
    double a3 = 0.8829110762;
    double a4 = 0.4435068522;

    //Scale coeff:
    double k1 = 0.81289306611596146; // 1 / 1.230174104914
    double k2 = 0.61508705245700002; // 1.230174104914 / 2

    for (int col = 0; col < width; ++col)
    {
        //Predict 1. y1
        for (int row = 1; row < height - 1; row += 2)//奇数列
        {
            matrix[row][col] += a1 * (matrix[row - 1][col] + matrix[row + 1][col]);
        }
        matrix[height - 1][col] += 2 * a1 * matrix[height - 2][col];

        //Update 1. y0
        for (int row = 2; row < height; row += 2)//偶数列
        {
            matrix[row][col] += a2 * (matrix[row - 1][col] + matrix[row + 1][col]);//这里注意不要越界
        }
        matrix[0][col] += 2 * a2 * matrix[1][col];

        //Predict 2.
        for (int row = 1; row < height - 1; row += 2)//奇数列
        {
            matrix[row][col] += a3 * (matrix[row - 1][col] + matrix[row + 1][col]);
        }
        matrix[height - 1][col] += 2 * a3 * matrix[height - 2][col];

        //Updata 2.
        for (int row = 2; row < height; row += 2)//偶数列
        {
            matrix[row][col] += a4 * (matrix[row - 1][col] + matrix[row + 1][col]);//
        }
        matrix[0][col] += 2 * a4 * matrix[1][col];
    }

    double **temp;
    createMatrix(temp, Size(width, height));
    for (int row = 0; row < height; ++row)
    {
        for (int col = 0; col < width; ++col)
        {
            if (row % 2 == 0)
                temp[col][row / 2] = k1 * matrix[row][col];
            else
                temp[col][row / 2 + height / 2] = k2 * matrix[row][col];
        }
    }
    for (int row = 0; row < height; ++row)
    {
        for (int col = 0; col < width; ++col)
        {
            matrix[row][col] = temp[row][col];
        }
    }

    releaseMatrix(temp, Size(width, height));

    return matrix;
}

Mat fwt97_2d(Mat image, int nlevels)
{
    int iWidth = image.rows, iHeight = image.cols;
    double **matrix;
    createMatrix(matrix, image.size());

    //convert mat to 2d matrix
    const uchar *ix;
    for (int row = 0; row < iHeight; ++row)
    {
        ix = image.ptr<uchar>(row);
        for (int col = 0; col < iWidth; ++col)
        {
            matrix[row][col] = double(uchar(ix[col]));
        }
    }

    int width = iWidth, height = iHeight;
    //do the wavelet decompose
    for (int i = 0; i < nlevels; ++i)
    {
        matrix = fwt97(matrix, width, height);
        matrix = fwt97(matrix, width, height);
        width /= 2;
        height /= 2; 
    }

#ifdef SHOW_WAVELET
    Mat im1(image.size(), CV_8UC1);
    for (int row = 0; row < iHeight; ++row)
    {
        for (int col = 0; col < iWidth; ++col)
        {
            if (matrix[row][col] < 0)
                im1.at<uchar>(row, col) = 0;
            else if (matrix[row][col] > 255)
                im1.at<uchar>(row, col) = 255;
            else
                im1.at<uchar>(row, col) = uchar(matrix[row][col]);
        }
    }
    imshow("97wavelet", im1);
#endif
    //multiple the CSF coefficient with different frequence band
    double csf[4] = { 2.16, 2.87, 3.16, 2.56 };
    for (int i = 0; i < nlevels; ++i)
    {
        int tHeight = 0, tWidth = 0;
        for (int row = tHeight; row < height; ++row)
        {
            for (int col = tWidth ; col < width; ++col)
            {
                matrix[row][col] = csf[i] * matrix[row][col];
            }
        }
        tWidth = width;
        tHeight = height;
        width *= 2;
        height *= 2;
    }

    Mat im(image.size(), CV_64FC1);
    for (int row = 0; row < iHeight; ++row)
    {
        double * dm = im.ptr<double>(row);
        for (int col = 0; col < iWidth; ++col)
        {
            dm[col] = matrix[row][col];
        }
    }
    releaseMatrix(matrix, image.size());
    return im;
}

double getHVSNR(const Mat &test, const Mat &reference, int nlevels)//the image size must be 2^n*2^n
{
    Mat _test(test.size(), CV_64FC1), _ref(reference.size(), CV_64FC1);
    _test = fwt97_2d(test, nlevels);
    _ref = fwt97_2d(reference, nlevels);

    //Minkovski nonlinear summation
    Mat diff(test.size(), CV_64FC1), powImg(test.size(), CV_64FC1);
    absdiff(_test, _ref, diff);
    pow(diff, 4, powImg);

    double temp = 0;
    temp = mean(diff).val[0];
    temp = pow(temp, 1. / 4);

    return 10 * log10(255*255 / (temp+0.000001)); //add a small number avoiding the divider to be zero
}
4.PFOM

  PFOM是由三种因子的组合来定义的:真实边缘的漏检测,伪边缘的误检测及边缘的定位误差,三种因子按下式组合起来就是Pratt品质因素:

PFOM=1/max(Ne,Nd)Ndk=11/(1+βd(k)2)

  其中,Ne是设定为参考边缘点的数目,Nd是算法提取到的边缘点的数目,β设为常数1/9,d(k)是第k个真实边缘点到检测到边缘点之间的欧式距离:
d(k)=||NeNd||Eucild

  Pratt品质因素是一个范围从0到1的保真函数,这里的真实边缘Ne是有监督的人为数据,即为参考边缘。通常的做法有以Canny检测的结果作为参考边缘来计算,还有一种是,采用BSD dataset中的ground truth来作为true edge map。

function [F, fac, msc] = pratt(Ea,Ed)

% Function EDPM : Edge detector performance measure function. 
%             Calculates for a given edge image the false alarm 
%         count, miss count and figure of merit (F) values.             
%
%  
%    Input(s)... Ea : Actual edge image         
%        Ed : Detected edge image.
%
%    Output(s).. fac: False alarm count
%        msc: miss count
%        F  : Figure of merit
Ea=double(Ea);
Ed=double(Ed);

[N,M]=size(Ea);
if [N,M]~=size(Ed) 
  error('Actual and detected edge image sizes must be same');
end;
a=0.1; % edge shift penalty constant;
fac=length(find((Ea-Ed)==-1)); % False Alarm Count
msc=length(find((Ea-Ed)==1));  % Miss Count
Na=sum(sum(Ea));Nd=sum(sum(Ed));
c=1/max(Na,Nd);
[ia,ja]=find(Ea==1);
for l=1:Na
  Aes(l)=Ed(ia(l),ja(l));
end;
mi=ia(find(Aes==0));
mj=ja(find(Aes==0));
F=c*sum(Aes);
for k=1:length(mi) 
  n1=0;n2=0;m1=0;m2=0; 
  while sum(sum(Ed(mi(k)-n1:mi(k)+n2,mj(k)-m1:mj(k)+m2)))<1
    if mi(k)-n1>1 n1=n1+1;end;  
    if mi(k)+n2<N n2=n2+1;end;  
    if mj(k)-m1>1 m1=m1+1;end;  
    if mj(k)+m2<M m2=m2+1;end;  
  end;
  di=max([n1 n2 m1 m2]);
  F=F+c/(1+a*di^2);
end;

F = F*100;
5.EEME

  EEME借用了 Michelson对比度公式[7]:
  

Modulation=(LmaxLmin)/(Lmax+Lmin)

  增大Lmin就能减小对比度
EME==maxϕ{ϕ}(EME(ϕ))maxϕ{ϕ}1k1k2l=1k2k=1k120lnIWmax;k,lIWmin;k,lIWmax;k,l+IWmin;k,l+c

  因此,对比度越高,EME相应地越大,图像增强的效果也越明显。

[1] Pratt W K. Digital Image Processing[M]. Wiley-Interscience, 1978.
[2] Sheng Y, Dementrio L, EasleyR, Hamid K. A Shearlet Approach to Edge Analysis and Detection[J], IEEE Transactions on Image Processing. 2009, 18(5):929-941.
[3] S.S. Agaian, B. Silver, K.A. Panetta, Transform coefficient histogram-based image enhancement algorithms using contrast entropy, IEEE Trans. Image Process. 16 (3) (2007) 741–758.
[4] A. Ghani, N. Isa. Enhancement of low quality underwater image through integrated global and local contrast correction. Elsevier Applied Soft Computing. 37(2015) 332-344.
[5] 李郁峰, 陈念年, 张佳成. 一种快速高灵敏度聚焦评价函数. 计算机应用研究, 2010, 4.
[6] 丁绪星, 朱日宏, 李建欣. 一种基于人眼视觉特性的图像质量评价. 中国图象图形学报, 2004, 2.
[7] Michelson A. Studies in optics[M]. University of Chicago Press, 1927.

2014-05-30 16:03:11 eric41050808 阅读数 1682
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    29955 人正在学习 去看看 张中强
章毓晋老师的数字图像处理第三版将数字图像处理分为:图像处理、图像分析、图像理解三册,觉得分类让图像结构更清晰了。
此处罗列中册,图像分析的目录结构:

图像分割 ->
    |- 图像分割基础 ->
        |-- 并行边界技术
        |-- 串行边界技术
        |-- 并行区域技术
        |-- 串行区域技术
    |- 典型分割算法
    |- 分割技术扩展
    |- 分割评价比较
表达描述 ->
    |- 目标表达
    |- 目标描述
    |- 测量和误差分析
特征分析 ->
    |- 纹理分析
    |- 形状分析
    |- 运动分析
数学工具 ->
    |- 数学形态学:二值
    |- 数学形态学:灰度
    |- 图像识别
A 人脸识别
没有更多推荐了,返回首页