一、前言

近期打算研读一下何博士第一篇文章,复现其论文算法,主要参考的博文有:

[1] Kaiming He论文心得 https://www.cnblogs.com/molakejin/p/5708883.html

[2] 论文原理、实现与效果 http://www.cnblogs.com/Imageshop/p/3281703.html

[3] 论文原文及相关资料下载 http://kaiminghe.com/

[4] Kaiming He谷歌学术 https://scholar.google.com/citations?user=DhtAFkwAAAAJ&hl=zh-CN

[5] 基于颜色衰减先验去雾算法 https://www.cnblogs.com/zjuthantics/p/5276856.html

关键词:暗通道先验、matlab鼠标交互、plot更新绘制点

这是第一部分工作,主要验证暗通道先验理论,参考了[5]中资料。

二、实现

暗通道先验:“在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值。”

[5]中给了下面这张图很清晰的验证了颜色衰减先验理论,本次通过matlab编写一个小程序能够尽量做出下图的效果去验证暗通道先验。

图2-1 颜色衰减通道先验效果

程序思想比较简单,练习一下Matlab的鼠标事件响应函数,主要包括:读图-排序滤波-鼠标事件处理-绘图

编写过程中稍微有点绕的环节有:

1.点击鼠标在当前位置绘制点并删除上一鼠标位置绘制的点;

解决方法:

point1=plot(1,1,'ro');

set(point1,'Visible','off');

point1=plot(xnew,ynew,'ro');

将plot赋给句柄,然后调用句柄属性让其不再显示,然后对新坐标重新命名句柄。

一开始做的是单点观察,后来添加了平均卷积核求窗口均值,使用rectangle绘制,与point思路一样。

2.鼠标输入函数对划分了subplot的图形坐标异常

[xnew,ynew,button]=ginput(1);

划分subplot再使用ginput时,每个子Plot有自己的坐标值,这使得当鼠标点到边界时获得的坐标值很奇怪,此处没有深究各个坐标值关系,简单将溢出的坐标值移动到左上角。

3.暗通道计算过程;

首先使用排序滤波分别取三通道最小值,使用函数为ordfilt2(),如下。

a_r_f=ordfilt2(a_h,1,ones(radius,radius),'symmetric');

随后并没有直接对对三个通道RGB取最小值,而是分别用柱状图画出了RGB值。

三、代码

%%

% 雾色图片按通道先验

% 2018年12月21日

% 使用方法:点击鼠标选点观察,可同时观察三个点,右键退出

% Yuquan Campus, bamboopu

% 待改进功能:1.解决BUG1边界坐标乱码问题;2.重新排布subplot位置更加美观;3.柱状图显示数据;4.优化速度

%%

% clean

clear;

clc;

%%

% 读图显示图片

a_rgb=im2double(imread('canyon2.bmp'));

[height,weight,scale]=size(a_rgb);

fig=figure;

h1=subplot(3,2,[1 3 5]);

imshow(a_rgb);

hold on;

% rgb卷积

a_h=a_rgb(:,:,1);

a_s=a_rgb(:,:,2);

a_v=a_rgb(:,:,3);

radius=15;

% 排序

a_r_f=ordfilt2(a_h,1,ones(radius,radius),'symmetric');

a_g_f=ordfilt2(a_s,1,ones(radius,radius),'symmetric');

a_b_f=ordfilt2(a_v,1,ones(radius,radius),'symmetric');

%%

% 回调函数游标法-失败,原因:未成功将数组传入回调函数,回调函数也未返回坐标值

% dcm_obj = datacursormode(fig);

% set(dcm_obj,'UpdateFcn',@myupdatefcn)

% datacursormode on

%%

% 鼠标输入法-成功

times=0;

% 初始点句柄,设置为不显示

r1=rectangle('Position',[weight*0.5,height*0.5,2*radius+1,2*radius+1],'EdgeColor','r');

set(r1,'Visible','off');

r2=rectangle('Position',[weight*0.5,height*0.5,2*radius+1,2*radius+1],'EdgeColor','g');

set(r2,'Visible','off');

r3=rectangle('Position',[weight*0.5,height*0.5,2*radius+1,2*radius+1],'EdgeColor','b');

set(r3,'Visible','off');

hold off;

while(0==0)

% xnew为列数,ynew为行数

[xnew,ynew,button]=ginput(1);

% 鼠标右键退出

if length(xnew)<1||button==3

close;

break

end

xnew=int32(xnew);

ynew=int32(ynew);

% 边界处理-BUG1:使用subplot后点击窗口外的区域坐标值未知大小

if xnew>=weight-radius

xnew=weight-radius;

end

if ynew>=height-radius

ynew=height-radius;

end

if xnew<=1+radius

xnew=1+radius;

end

if ynew<=1+radius

ynew=1+radius;

end

% 查找值

Value_r=a_r_f(ynew,xnew);

Value_g=a_g_f(ynew,xnew);

Value_b=a_b_f(ynew,xnew);

x=[1 2 3];

y=[Value_r,Value_g,Value_b];

barsize=0.3;

switch mod(times,3)

case 0

% 点的替换

h1=subplot(3,2,[1 3 5]);hold on;

set(r1,'Visible','off');

r1=rectangle('Position',[xnew-radius,ynew-radius,2*radius+1,2*radius+1],'EdgeColor','r');

hold off;

% 子窗口显示

h2=subplot(3,2,2);

bar(x,y,barsize,'Facecolor',[1,0,0]);

ylabel('Intensity');grid on;

set(gca,'xticklabel',{'R','G','B'});

axis([0,4,0.,1.]);

title('Red Point');

case 1

% 点的替换

h1=subplot(3,2,[1 3 5]);hold on;

set(r2,'Visible','off');

r2=rectangle('Position',[xnew-radius,ynew-radius,2*radius+1,2*radius+1],'EdgeColor','g');

hold off;

% 子窗口显示

h3=subplot(3,2,4);

bar(x,y,barsize,'Facecolor',[0,1,0]);

ylabel('Intensity');grid on;

set(gca,'xticklabel',{'R','G','B'});

axis([0,4,0.,1.]);

title('Green Point');

case 2

% 点的替换

h1=subplot(3,2,[1 3 5]);hold on;

set(r3,'Visible','off');

r3=rectangle('Position',[xnew-radius,ynew-radius,2*radius+1,2*radius+1],'EdgeColor','b');

hold off;

% 子窗口显示

h4=subplot(3,2,6);

bar(x,y,barsize,'Facecolor',[0,0,1]);

ylabel('Intensity');grid on;

set(gca,'xticklabel',{'R','G','B'});

axis([0,4,0.,1.]);

title('Blue Point');

otherwise

disp('Something went wrong.');

end

% 显示数值-已取消

disp(['R=' num2str(Value_r*255)]);

disp(['G=' num2str(Value_g*255)]);

disp(['B=' num2str(Value_b*255)]);

disp([' ']);

% 记录点击次数

times=times+1;

end

四、效果

图4-1暗通道先验验证程序

五、心得

这次小程序还没涉及到论文里的算法部分,主要是一些业务代码,用来熟悉matlab编程,目前水平比较一般,编写的还不够快,调试也花了很久。码不停题,GO!

何恺明 matlab,[论文复现]何恺明博士CVPR2009去雾算法(1)相关推荐

  1. [论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi | 何恺明老师)

    <娜璋带你读论文>系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢.由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学 ...

  2. 何恺明:从高考状元到CV领域年轻翘楚,靠“去雾算法”成为“CVPR最佳论文”首位华人得主...

    (给机器学习算法与Python学习加星标,提升AI技能) 本文转载自:德先生 根据科学研究,人类大脑皮层的70%活动都在处理视觉信息.如果人工智能赋予机器能够像人类一样思考.处理事情的能力,计算机视觉 ...

  3. 基于MATLAB改进暗通道先验的图像去雾算法

    基于MATLAB改进暗通道先验的图像去雾算法 摘要:暗通道先验去雾算法求得的的透射率比较精细,去雾效果优于大多数去雾算法.然而在暗通道求取过程中,最小值滤波的处理会使得暗色向外扩张,导致透射率扩张变大 ...

  4. matlab求图像暗通道图像,基于暗通道先验条件图像去雾算法

    基于暗通道先验条件图像去雾算法 香港大学何凯明博士于2009发表了一篇论文<Single Image Haze Removal Using Dark Channel Prior>.在文章中 ...

  5. 【论文阅读】改进的基于均值滤波的单幅图像去雾算法研究

    改进的基于均值滤波的单幅图像去雾算法研究 吴延海,张婧,陈康 西安科技大学 学报, 2016 本文是在<基于单幅图像的快速去雾>基础上进行改进.主要改进有以下几点: 对<基于单幅图像 ...

  6. 基于暗通道优先的单幅图像去雾算法(Matlab)

    基于暗通道优先的单幅图像去雾算法(Matlab) 每一幅图像的RGB三个颜色通道中,总有一个通道的灰度值很低,几乎趋向于0.基于这个几乎可以视作是定理的先验知识,作者提出暗通道先验的去雾算法. ​ 首 ...

  7. 【老生谈算法】matlab实现图像去雾算法——图像去雾

    基于matlab的图像去雾算法详细讲解与实现-附matlab实现源代码 ## 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于mat ...

  8. 基于MATLAB的图像去雾GUI系统(集成4种去雾算法)

    00 目录 应用背景 去雾算法理论 MATLAB程序实现 源码获取 01 应用背景 由于大气中存在灰尘.烟雾.薄雾和其他漂浮颗粒物,因此大气中拍摄的图像通常会出现颜色失真.模糊.对比度低等问题,而模糊 ...

  9. 【老生谈算法】matlab实现视频图像增强和去雾算法——去雾算法

    matlab视频图像增强和去雾算法 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]视频图像增强和去雾算法matlab实现.d ...

最新文章

  1. JAVA SHA1 加密 对应 c# SHA1 加密
  2. Git的使用和提交规范
  3. php如何做熔断降级,spring cloud 如何实现服务熔断服务降级
  4. Linux下CMake简明教程
  5. [特征工程系列二]显性特征的基本处理方法
  6. 桌面消息提醒_对win7的支持已近尾声,如何关闭不断弹出的提醒通知
  7. COSC 1047 – Winter 2019 – Assignment
  8. Linux上的errno和strerror
  9. Chrome浏览器保存整个网页为图片的方法
  10. php从文件中查找内容
  11. arduino入门教程!保姆级细致教学!
  12. 气泡文字php,HTML5实现对话气泡点击动画
  13. [kaggle]泰坦尼克预测(代码解析)
  14. EasyUI多级表头设置
  15. 美团因拖欠骑手工资被约谈;传苹果6月6日举办全球开发者大会;Linux 5.18开始启动停止支持ReiserFS|极客头条
  16. Linux目录文件操作命令篇--(工作常用命令的深度使用,小白必收藏)
  17. 第一款带无代码应用搭建平台的固定资产管理系统
  18. python交换机ssh巡检_python自动巡检H3C交换机
  19. 记录一下StamPS+SBAS的过程
  20. 思迈特软件Smartbi智能电子表格,为你轻松制作财务报表

热门文章

  1. 手机图片、铃声免费下载终极大法
  2. (原创)android6.0系统 PowerManager深入分析
  3. 推进企业使用正版软件工作部际联席会议第四次全体会议(2010)
  4. 揭秘网站的seo技术 ---seo与seoer 王泽宾
  5. Java面试题消息队列
  6. c语言hypot函数,hypot()函数以及C ++中的示例
  7. 架构 - 关于三种编程范式
  8. 设计模式---装饰器模式(C++实现)
  9. JS如何判断包括IE11在内的IE浏览器
  10. 券商单向视频见证开户全面开放!菊风泛金融单向视频开户一体化解决方案极速助力