评估图像清晰度是一个常见的问题。写了c和matlab两个版本的简单代码,日后可以拿来就用。

模糊的图片一般可以分为两种,动态模糊或者对焦模糊。顾名思义,动态模糊就相当于一个头在你面前晃啊晃的看不清,对焦模糊就是你离远点把眼睛摘了看人(视力好的人请按alt+f4)。

上面三个,中间是原图,左边是动态模糊,右边是对焦模糊。

质量评价也简单,你只要给清晰的图片打分高于模糊图片,只要分差明显,随便用点数学公式就可以换算到任何评分标准体系了。

处理这种问题其实很简单。就是sobel算子的一个应用问题。因为模糊的图片必然比清晰的原图具有更加不清楚的边缘。所以你提取不出来啊,做个边缘提取之后,原图肯定留下更多的1,所以这个时候再算个平均值,就搞定了。

别废话上代码:

这个c的函数,就是输入一个灰度值数组,和图片长宽,返回一个评价值。

float estimate(unsigned char *pData, int width, int height)
{int i = 0, j = 0;unsigned char *pixel;int *image0,*image90,*image45,*image135;int a1,a2,a3,b1,b2,b3,c1,c2,c3;int threshold = 100;float *image;float sum=0.0;pixel = (unsigned char*)malloc(sizeof(unsigned char)*(width*height));image0 = (int*)malloc(sizeof(int)*(width*height));image45 = (int*)malloc(sizeof(int)*(width*height));image90 = (int*)malloc(sizeof(int)*(width*height));image135 = (int*)malloc(sizeof(int)*(width*height));image = (float*)malloc(sizeof(float)*(width*height));//initefor(i=0; i < height; i++)for(j = 0; j <width; j++){pixel[i*width+j] = pData[i*width+j];}// a1 a2 a3// b1 b2 b3// c1 c2 c3// replicate for the bounds, the nearest onefor(i = 0; i < height; i++)for(j = 0; j< width; j++){if(i == 0){//upper line, left-up and right-up corners if(j == 0){//left-up cornera1 = pixel[0];a2 = pixel[0];a3 = pixel[1];b1 = pixel[0];b2 = pixel[0];b3 = pixel[1];c1 = pixel[width];c2 = pixel[width];c3 = pixel[width+1];}else if(j == (width-1)){//left-right cornera1 = pixel[width-2];a2 = pixel[width-1];a3 = pixel[width-1];b1 = pixel[width-2];b2 = pixel[width-1];b3 = pixel[width]-1;c1 = pixel[2*width-2];c2 = pixel[2*width-1];c3 = pixel[2*width-1];}else{a1 = pixel[j-1];a2 = pixel[j];a3 = pixel[j+1];b1 = a1;b2 = a2;b3 = a3;c1 = pixel[width+j-1];c2 = pixel[width+j];c3 = pixel[width+j+1];}}else if(j == 0){//left row and left-down cornerif(i == (height-1)){//left-down cornera1 = pixel[(i-1)*width];a2 = a1;a3 = pixel[(i-1)*width + 1];b1 = pixel[i*width];b2 = b1;b3 = pixel[i*width + 1];c1 = b2;c2 = b2;c3 = b3;}else{a1 = pixel[(i-1)*width];a2 = a1;a3 = pixel[(i-1)*width + 1];b1 = pixel[i*width];b2 = b1;b3 = pixel[i*width + 1];c1 = pixel[(i+1)*width];c2 = c1;c3 = pixel[(i+1)*width + 1];}}else if(i == (height-1)){//down line and down-right cornerif(j == (width-1)){//down-right cornera1 = pixel[(i-1)*width + j-1];a2 = pixel[(i-1)*width + j];a3 = a2;b1 = pixel[i*width + j-1];b2 = pixel[i*width + j];b3 = b2;c1 = b1;c2 = b2;c3 = b2;}else{a1 = pixel[(i-1)*width + j-1];a2 = pixel[(i-1)*width + j];a3 = pixel[(i-1)*width + j+1];b1 = pixel[i*width + j-1];b2 = pixel[i*width + j];b3 = pixel[i*width + j+1];c1 = b1;c2 = b2;c3 = b3;}}else if(j == (width-1)){//right rowa1 = pixel[(i-1)*width + j-1];a2 = pixel[(i-1)*width + j];a3 = a2;b1 = pixel[i*width + j-1];b2 = pixel[i*width + j];b3 = b2;c1 = pixel[(i+1)*width-1];c2 = pixel[(i+1)*width-1];c3 = c2;}else{a1 = pixel[(i-1)*width + j-1];a2 = pixel[(i-1)*width + j];a3 = pixel[(i-1)*width + j+1];b1 = pixel[i*width + j-1];b2 = pixel[i*width + j];b3 = pixel[i*width + j+1];c1 = pixel[(i+1)*width+ j-1];c2 = pixel[(i+1)*width+ j];c3 = pixel[(i+1)*width+ j+1];}//corr// 0:-1 0 1  45:-2 -1 0  90:1 2 1  135:0 -1 -2//   -2 0 2     -1  0 1     0 0 0      1  0 -1//   -1 0 1      0  1 2    -1 -2 -1    2  1  0image0[i*width+j] = -a1 + a3 -2*b1 + 2*b3 -c1 + c3;if (image0[i*width+j] < 100)image0[i*width+j] = 0;else image0[i*width+j] = 1;image45[i*width+j] = -2*a1 - a2 - b1 + b3 + c2 + 2*c3;if (image45[i*width+j] < 100)image45[i*width+j] = 0;else image45[i*width+j] = 1;image90[i*width+j] = a1 + 2*a2 + a3 - c1 - 2*c2 - c3;if (image90[i*width+j] < 100)image90[i*width+j] = 0;else image90[i*width+j] = 1;image135[i*width+j] = -a2 - 2*a3 + b1 - b3 + 2*c1 + c2;if (image135[i*width+j] < 100)image135[i*width+j] = 0;else image135[i*width+j] = 1;}//combinationfor(i=0; i <height-1; i++)for(j=0; j < width-1; j++)image[i*width+j] = (float)(image0[i*width+j]+image45[i*width+j]+image90[i*width+j]+image135[i*width+j])/4;//return the average gary valuefor(i=0; i <height-1; i++)for(j=0; j < width-1; j++)sum = (float)sum + image[i*width+j];sum =(float) sum/(height*width);return sum;    }

matlab的代码同时读两个图片,编号0是原图,编号1是模糊图。最后两个图的值同时给出来。有一些冗余代码,别介意。

%45°和135°角边缘检测;用于那些边界不明显的图片
sobel45=[-2 -1 0; -1 0 1; 0 1 2];
sobel135=[0 -1 -2; 1 0 -1; 2 1 0];
sobel0=[-1 0 1; -2 0 2; -1 0 1];
sobel90=[1 2  1; 0 0 0; -1 -2 -1];SourcePic1 = imread('/home/ydt/桌面/m22.jpg');
SourcePic0 = imread('/home/ydt/桌面/m21.jpg');
subplot(6, 2, 1);
imshow(SourcePic0),title('origin');
%subplot(211);
subplot(6,2,2);
imshow(SourcePic1),title('dynamic');
grayPic0 = rgb2gray(SourcePic0);
grayPic1 = rgb2gray(SourcePic1);
%grayPic0 = im2double(grayPic0);
%grayPic1 = im2double(grayPic1);
subplot(6, 2, 3);
imshow(grayPic0),title('origin-gray');
subplot(6, 2, 4);
imshow(grayPic1),title('dynamic-gray');Threshold1 = 100;
SFST45 = imfilter(grayPic0,sobel45,'replicate');
SFST45=SFST45>=Threshold1;
I01 = SFST45;
subplot(625);
imshow(SFST45),title('45') ;
SFST45=imfilter(grayPic1,sobel45,'replicate');
SFST45=SFST45>=Threshold1;
I11 = SFST45;
subplot(626);
imshow(SFST45),title('45') ; Threshold2 = 100;
SFST135 = imfilter(grayPic0,sobel135,'replicate');
SFST135=SFST135>=Threshold2;
I02 = SFST135;
subplot(627);
imshow(SFST135),title('135') ;
SFST135 = imfilter(grayPic1,sobel135,'replicate');
SFST135=SFST135>=Threshold2;
I12 = SFST135;
subplot(628);
imshow(SFST135),title('135') ;Threshold3 = 100;
SFST0 = imfilter(grayPic0,sobel0,'replicate');
SFST0=SFST0>=Threshold3;
I03 = SFST0;
subplot(629);
imshow(SFST0),title('90') ;
SFST0 = imfilter(grayPic1,sobel0,'replicate');
SFST0=SFST0>=Threshold3;
I13 = SFST0;
subplot(6,2,10);
imshow(SFST0),title('90') ;Threshold4 = 100;
SFST90 = imfilter(grayPic0,sobel90,'replicate');
SFST90=SFST90>=Threshold4;
I04 = SFST90;
subplot(6,2,11);
imshow(SFST90),title('0') ;
SFST90 = imfilter(grayPic1,sobel90,'replicate');
SFST90=SFST90>=Threshold4;
I14 = SFST90;
subplot(6,2,12);
imshow(SFST90),title('0') ;I0 = (I01 + I02 + I03 + I04)/4;
I1 = (I11 + I12 + I13 + I14)/4;
subplot(2,1,1);
imshow(I0),title('origin') ;
subplot(2,1,2);
imshow(I1),title('motion') ;[M0,N0] = size(I0);
[M1,N1] = size(I1);%I = (I0 + I1)/2;
% subplot(111);
% imshow(I),title('sobel') ;
% sum = 0;
% for i=1:M0*N0
%     sum = I(i)+sum;
% end
% m=sum/M0/N0;
sum = 0;
for i=1:M0*N0sum = I0(i)+sum;
end
sum1 = sum/(M0*N0);%c0 = 1- abs(sum1-m);sum = 0;
for i=1:M1*N1sum = I1(i)+sum;
end
sum2 = sum/(M1*N1);%c1 = 1- abs(sum2-m);fprintf('Average gray value after sobel detecting, Origin: %12.6f\n', sum1);
fprintf('Average gray value after sobel detecting, Motion: %12.6f\n', sum2);

总的来说,有一个局限性。就是只能保证同一个人的图片,清晰的比模糊的强。这只是一个相对的结果,自行设定模糊与清晰的分界线,但是并不是说在绝对的情况下,任何低于这个值的都是模糊。非常简单的一个算法。

对于模糊人脸图片和原图的清晰度评估——sobel算子相关推荐

  1. DifFace——一种扩散模型来提高人脸图片分辨率与清晰度

    前期我们介绍过不同的模型来提高图片的分辨率与清晰度的文章,本期我们介绍另外一种可以提高人脸与整体图片分辨率与清晰度的模型--DifFace,从模型的名字可以看出,此模型主要用于人脸部分的清晰度与分辨率 ...

  2. 如何将图片放大不改变清晰度?

    如何将图片放大不改变清晰度?相信很多小伙伴都和我一样,在寻找这个问题的答案,因为我们经常遇到将图片尺寸放大后变得非常模糊的情况,最终模糊的图片不能正常使用,这真的非常影响我们工作效率.那么如何解决这个 ...

  3. 如何放大图像不模糊?图片无损放大

    如何放大图像不模糊?工作中我们经常需要使用图片,所以也经常需要将图片修改成我们想要的尺寸,这是一项比较简单的工作,但是也包含很多的技巧.例如将图片尺寸放大的时候,如果你没有好的方法,放大后的图片会出现 ...

  4. 模糊的图片怎么变清晰?分享两种好用的修复方法

    怎么把模糊的图片修复清晰呢?当大家拍摄照片时,如果你不小心晃动了相机,或者你的相机不够稳定,那么你的照片可能会模糊不清.此外,如果你的镜头没有清洁干净,或者你的光线不足,照片也可能会变得模糊.快门速度 ...

  5. 如何将模糊的图片变得清晰

    模糊的图片: 那些可以使用卷积描述: 那些不能够 如何将图片进行清洗处理? ▌黄沙漫飞 前两天,久违了的黄沙漫飞的天气给北京的景色增加了朦胧的图像透镜,一切都笼罩在暗淡橘黄色光线里.下图是朋友圈里给出 ...

  6. java 修改图片分辨率_java 修改图片的像素大小,清晰度

    修改图片的像素,清晰度 代码 /** * 改变图片 像素 * * @param file * @param qality 参数qality是取值0~1范围内 清晰程度 数值越小分辨率越低 * @par ...

  7. 微信小程序人脸识别/采集改进版-支持人脸中心位置校验,人脸图片采集(速度更快),人脸搜索

    目录 1. 微信小程序人脸识别 1. 初始化人脸识别 2. 创建 camera 上下文 CameraContext 对象 3.获取 Camera 实时帧数据 4.人脸识别,使用前需要通过 wx.ini ...

  8. 一张分辨率低模糊的图片有什么办法把它变的很清晰?

    日常生活里我们做PPT.海报或者是找找自己喜欢的壁纸,都离不开一张清晰高质量的图片. 但由于搜索渠道限制或其他原因,有时候我们找到的只是一张有些模糊的图片,导致我们做出来的效果大打折扣. 有没有什么办 ...

  9. 怎么把模糊的图片修复清晰?分享两种有效的修复方法

    怎么把模糊的图片修复清晰呢?拍摄照片是一件很有趣的事情,但有时候拍出来的照片却不够清晰,又或者是随着时间的流逝,我们的照片可能会变得不清晰,甚至不能看清照片中的人和物.然而,随着技术的不断发展,我们现 ...

最新文章

  1. HTML和JavaScript函数之间的关系
  2. 南方科技大学宋毅课题组招聘启事
  3. mac mongodb可视化工具_「时序数据库」和MongoDB:第3部分-查询、分析和呈现
  4. 自动按键脚本_阔怕...按键精灵还能将别人的脚本导入为自己所用
  5. 2.数据结构笔记学习--线性表基本操作
  6. GG and MM(every sg 游戏)
  7. 您好,这是我的第一篇文章
  8. html流动海报css,海报网css代码怎样把模块移到右面?最好把代码直接给我!嘿嘿。...
  9. Objective -C-2
  10. 【第10章】深入理解Session与Cookie
  11. wxWindows 程序编译选项设置统揽
  12. 思科网络综合实验(服务器,三层交换机,路由器)
  13. 第三次作业(尤心心)
  14. 中央广播电视大学中等专业办公设备使用与维护
  15. 《那些年啊,那些事——一个程序员的奋斗史》——28
  16. 十二、用卡诺图化简真值表(1)
  17. Python 第三方模块 统计1 statsmodels模块1 简介,回归
  18. iPhone开发教程之iOS APP体验设计 - 醒醒吧 ))))) - majszt - 和讯博客
  19. 女人最不动声色的诱惑招数
  20. excel高级筛选怎么用_Excel中的【高级筛选】都不会使用,那就真的Out了!

热门文章

  1. 追寻红色记忆、晋国文明之思考毕业季研学营
  2. java DES-CBC加解密
  3. 陈艾盐:春燕百集访谈节目第二十五集
  4. github pages + Hexo + 域名绑定搭建个人博客增强版
  5. 中国版的Google被阉割掉多少?
  6. 这图怎么画| 相关性热图+柱状图
  7. Intel第十代CPU集成显卡不再支持 Legacy启动 (i5-10400...)
  8. vasp 模拟退火_【转】vasp的分子动力学模拟 - 第一原理 - 小木虫 - 学术 科研 互动社区...
  9. 华为自带浏览器无法使用
  10. html 的ul是块矿元素吗,食品化学题库单选判断