MSCN系数是无参考的空间域图像质量评估算法BRISQUE(No-Reference Image Quality Assessment in the Spatial Domain)中提出的,MSCN系数具有由于失真的存在而改变的特征统计特性,并且量化这些变化将使得可以预测影响图像的失真类型以及其感知质量。这篇论文的大致原理是从图像中提取MSCN系数,然后将MSCN系数拟合成非对称性广义高斯分布,提取拟合的高斯分布的特征,输入到支持向量机SVM中做回归,最终得到图像质量的评分。

这篇论文提供了源代码,其中有MSCN的计算代码,但是论文中的关于证明不同失真图像的MSCN系数具有不同分布的直方图的代码并没有,经过大概大半天的时间,我把这个直方图用matlab做了出来。

首先,直观的看一下MSCN系数图如下(原图和MSCN系数图):

       

MSCN系数图的计算公式源论文中有,代码从源代码中修改而来,如下:

clear;clc;
imdist=imread('2.png'); %imshow(imdist); %显示原图
imdist = rgb2gray(imdist);
imdist = double(imdist); %imdist=phasecong3(imdist);
%imshow(phaseCong) window = fspecial('gaussian',7,7/6);
window = window/sum(sum(window)); mu = filter2(window, imdist, 'same');
mu_sq = mu.*mu;
sigma = sqrt(abs(filter2(window, imdist.*imdist, 'same') - mu_sq));
structdis = (imdist-mu)./(sigma+1); %imshow(structdis,[]); %显示MSCN图

  其实MSCN系数计算出来是一个浮点数矩阵,就是上面代码中的structdis,范围是-2到2。论文中的SMCN系数直方图横坐标表示图像的MSCN系数值,纵坐标表示值出现的频率,在网上找了好久,发现并没有源代码,只好自己写了。刚开始的时候以为每个值会出现多次,统计了一下发现绝大多数MSCN值仅出现了一次,后来才想明白,横坐标表示的不是每一个MSCN值的频率,而是一个范围值的频率。浮点数不好统计,于是刚开始的时候我把MSCN系数的值转化到了0-255,然后再来统计它的频率,统计个数用的是matlab自带的函数tabulate,做出的图如下:

具体代码如下:

clear;clc;
imdist=imread('2.png'); %imshow(imdist);
imdist = rgb2gray(imdist);
imdist = double(imdist); %imdist=phasecong3(imdist);
%imshow(phaseCong) window = fspecial('gaussian',7,7/6);
window = window/sum(sum(window)); mu = filter2(window, imdist, 'same');
mu_sq = mu.*mu;
sigma = sqrt(abs(filter2(window, imdist.*imdist, 'same') - mu_sq));
structdis = (imdist-mu)./(sigma+1); %imshow(structdis,[]); %显示MSCN图
% imshow(mu,[]);
% imshow(sigma,[]);
%hist(structdis); InImg=structdis;
ymax=255;ymin=0;
xmax = max(max(InImg)); %求得InImg中的最大值
xmin = min(min(InImg)); %求得InImg中的最小值
OutImg = round((ymax-ymin)*(InImg-xmin)/(xmax-xmin) + ymin); %归一化并取整 %hist(structdis); n=tabulate(OutImg(:)); %计算矩阵中各元素出现的频数
number=n(:,2); a=number; x=1:1:245;
plot(x,a,'-*b'); %绘图

  其他问题先不说,首先就是点太密集了,跟论文中的完全不一样,而且MSCN值转化到0-255之后可能会丢失一些精度。所以这个不合格。然后原因出在matlab自带的统计矩阵值个数的函数上,这个函数不靠谱,只能自己写了,倒不是很麻烦,循环统计范围值就好了,但是以前写c++习惯了,用matlab写的时候总是想着c++的方式来写,结果很简单的问题头都搞晕了,还好有好朋友帮忙,循环很快写出来了。然后封装成函数如下(以下的图来自TID2013的bike.bmp):

function [n]=compute_mscn(imdist)    %计算图像的MSCN系数并统计其像素值出现的频数

%imdist=imread('3.png');
imdist = rgb2gray(imdist);
imdist = double(imdist); %imdist=phasecong3(imdist);
%imshow(phaseCong) window = fspecial('gaussian',7,7/6);
window = window/sum(sum(window)); mu = filter2(window, imdist, 'same');
mu_sq = mu.*mu;
sigma = sqrt(abs(filter2(window, imdist.*imdist, 'same') - mu_sq));
structdis = (imdist-mu)./(sigma+1);
% imshow(structdis,[]); %显示MSCN图
% imshow(mu,[]);
% imshow(sigma,[]);
%hist(structdis); InImg=structdis;
ymax=255;ymin=0;
xmax = max(max(InImg)); %求得InImg中的最大值
xmin = min(min(InImg)); %求得InImg中的最小值
OutImg = round((ymax-ymin)*(InImg-xmin)/(xmax-xmin) + ymin); %归一化并取整 %hist(structdis); %n=tabulate(OutImg(:)); %计算矩阵中各元素出现的频数
%number=n(:,2); %a=number;
for j=1:52 %统计MSCN系数出现的频数
i=(j-1)*5;
n(j)=length(find(OutImg>=i&OutImg<i+2));
% t=t+1;
end
end

  调用的代码也很简单,如下所示:

imdist=imread('bikes.bmp');
n1=compute_mscn(imdist); imdist=imread('img15.bmp');
n2=compute_mscn(imdist); imdist=imread('img31.bmp');
n3=compute_mscn(imdist); imdist=imread('img129.bmp');
n4=compute_mscn(imdist); x=0:5:255;
%x=-2:0.05:2;
plot(x,n1,'-*b',x,n2,'-dr',x,n3,'-sg',x,n4,'-ok');
set(gca,'XTick',[0:50:250])
%set(gca,'XTick',[-2:0.5:2]);%x轴范围,间隔0.5
legend('org','jp2k','ff','gblur'); %右上角标注
xlabel('MSCN系数') %x轴坐标描述
ylabel('频数(归一化)') %y轴坐标描述
grid on; %加网格线
%set(gca,'GridLineStyle',':','GridColor','k','GridAlpha',1); %加网格虚线

  然后结果图如下:

理论上和论文中的意思是一样了,但是还是有些差距,首先是MSCN系数的值被归一化到0-255了,然后频数还没有归一化,所以考虑不把MSCN系数的值转换到0-255,直接进行统计,以免有误差,代码仍然进行了封装,函数如下:

function [n]=compute_mscn2(imdist)    %计算图像的MSCN系数并统计其像素值出现的频数

imdist = rgb2gray(imdist);
imdist = double(imdist); %imdist=phasecong3(imdist);
%imshow(phaseCong) window = fspecial('gaussian',7,7/6);
window = window/sum(sum(window)); mu = filter2(window, imdist, 'same');
mu_sq = mu.*mu;
sigma = sqrt(abs(filter2(window, imdist.*imdist, 'same') - mu_sq));
structdis = (imdist-mu)./(sigma+1);
% imshow(structdis,[]); %显示MSCN图
% imshow(mu,[]);
% imshow(sigma,[]);
%hist(structdis); for j=1:81 %统计MSCN系数出现的频数
i=(j-40)*0.05;
n(j)=length(find(structdis >=i&structdis<i+0.05));
% t=t+1;
end
n=mapminmax(n,0,1); end

  调用的代码如下:

imdist=imread('bikes.bmp');
n1=compute_mscn2(imdist); imdist=imread('img15.bmp');
n2=compute_mscn2(imdist); imdist=imread('img31.bmp');
n3=compute_mscn2(imdist); imdist=imread('img129.bmp');
n4=compute_mscn2(imdist); %x=0:5:255;
x=-2:0.05:2;
plot(x,n1,'-*b',x,n2,'-dr',x,n3,'-sg',x,n4,'-ok');
%set(gca,'XTick',[0:50:250])
set(gca,'XTick',[-2:0.5:2]);%x轴范围,间隔0.5
legend('org','jp2k','ff','gblur'); %右上角标注
xlabel('MSCN系数') %x轴坐标描述
ylabel('频数(归一化)') %y轴坐标描述
grid on; %加网格线
%set(gca,'GridLineStyle',':','GridColor','k','GridAlpha',1); %加网格虚线

  最终总算是完成任务了,可以看出确实不同失真图像的MSCN系数具有不同的直方图分布,图如下:

MSCN(Mean Subtracted Contrast Normalized)系数的直方图的更多相关文章

  1. paper 119:[转]图像处理中不适定问题-图像建模与反问题处理

    图像处理中不适定问题 作者:肖亮博士 发布时间:09-10-25 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)的研究从20世纪末成为国际上的 ...

  2. ZFNet: Visualizing and Understanding Convolutional Networks

    目录 论文结构 反卷积 ZFnet的创新点主要是在信号的"恢复"上面,什么样的输入会导致类似的输出,通过这个我们可以了解神经元对输入的敏感程度,比如这个神经元对图片的某一个位置很敏 ...

  3. 彩色图像上执行Mean Shift迭代搜索目标 ,维加权直方图 + 巴氏系数 + Mean Shift迭代

    今天要给大家分享的是: 在彩色图像上进行Mean Shift迭代搜索目标 二维加权直方图+巴氏系数+Mean Shift迭代 关于 加权直方图.巴氏系数.Mean Shift迭代 这三者之间的关系请大 ...

  4. 比率(ratio)|帕雷托图|雷达图|轮廓图|条形图|茎叶图|直方图|线图|折线图|间隔数据|比例数据|标准分数|标准差系数|离散系数|平均差|异众比率|四分位差|切比雪夫|右偏分布|

    比率是什么? 比率(ratio) :不同类别数值的比值 在中文里,比率这个词被用来代表两个数量的比值,这包括了两个相似却在用法上有所区分的概念:一个是比的值:另一是变化率,是一个数量相对于另一数量的变 ...

  5. HC(Histogram-based Contrast) 基于直方图对比度的显著性

    HC(Histogram-based Contrast) 基于直方图对比度的显著性 来源于: 2011, Global contrast based salient region detection, ...

  6. 限制对比度自适应直方图均衡(Contrast Limited Adaptive histgram equalization/CLAHE)

    转自:http://www.cnblogs.com/Imageshop/archive/2013/04/07/3006334.html 一.自适应直方图均衡化(Adaptive histgram eq ...

  7. HOG(方向梯度直方图)

    结合这周看的论文,我对这周研究的Histogram of oriented gradients(HOG)谈谈自己的理解: HOG descriptors 是应用在计算机视觉和图像处理领域,用于目标检測 ...

  8. Paper | Contrast Limited Adaptive Histogram Equalization

    目录 1. 背景 1.1. 对比度和直方图均衡HE 1.2. HE的问题 1.3. AHE 1.4. 底噪问题 2. CLAHE 2.1. 效果展示 2.2. 算法格式和细节 论文:Contrast ...

  9. 图像增强 | CLAHE 限制对比度自适应直方图均衡化

    1 基本概述 CLAHE是一个比较有意思的图像增强的方法,主要用在医学图像上面.之前的比赛中,用到了这个,但是对其算法原理不甚了解.在这里做一个复盘. CLAHE起到的作用简单来说就是增强图像的对比度 ...

随机推荐

  1. 消息队列mq总结(重点看,比较了主流消息队列框架)

    转自:http://blog.csdn.net/konglongaa/article/details/52208273 http://blog.csdn.net/oMaverick1/article/ ...

  2. python之 python 起源、语言特点

    一. 1.1  什么是 PythonPython 是一门优雅而健壮的编程语言,它继承了传统编译语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性.它可以帮你完成工作,而且一段时间以后,你还能 ...

  3. bzoj 3027 [Ceoi2004]Sweet——生成函数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027 化式子到 ( \mul_{i=1}^{n}(1-x^(m[i]+1)) ) / (1- ...

  4. 蓝桥杯 算法训练 ALGO-121 猴子分苹果

      算法训练 猴子分苹果   时间限制:1.0s   内存限制:256.0MB 问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果 ...

  5. SQL字符串拼接

    不同的数据库,相应的字符串拼接方式不同,通过对比加深一下记忆. 一.MySQL字符串拼接 1.CONCAT函数 语法格式:CONCAT(char c1, char c2, ..., char cn) ...

  6. Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具

    Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具 1 kettle --第一次使用kettle玩迁移,有什么不足之处和建议,请大家指正和建议. ...

  7. DripRoad(点滴之路)

    关于DripRoad DripRoad 意为点滴之路,程序员之路在于点滴积累!是的,这些积累包括技术能力,沟通能力,业务能力等等.   我 我是唐志伟,2009年一个人来上海,就读于上海医疗器械高等专 ...

  8. mysql索引最左匹配原则的理解

    CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `ci ...

  9. CS231n 2016 通关 第三章-SVM与Softmax

    1===本节课对应视频内容的第三讲,对应PPT是Lecture3 2===本节课的收获 ===熟悉SVM及其多分类问题 ===熟悉softmax分类问题 ===了解优化思想 由上节课即KNN的分析步骤 ...

  10. leetcode657

    bool judgeCircle(string moves) { ;//垂直位移 ;//水平位移 for (auto m : moves) { if (m == 'U') { V++; } else ...