ViSP学习笔记(九):图像锐化
开发环境:Ubuntu 18.04 LTS + ROS Melodic + ViSP 3.3.1
文章内容主要参考ViSP官方教学文档:https://visp-doc.inria.fr/doxygen/visp-daily/tutorial_mainpage.html
本文主要介绍如何使用ViSP实现图像锐化处理,主要涉及直方图拉伸、直方图均衡、CLAHE算法、非锐化掩膜(unsharp masking)算法。本文主要参考imgproc中的 tutorial-contrast-sharpening.cpp例程。首先要获取这个例程文件并编译它
svn export https://github.com/lagadic/visp.git/trunk/tutorial/imgproc
cd imgproc/contrast-sharpening
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DVISP_DIR=$VISP_WS/visp-build
make
执行例程,查看效果
./tutorial-contrast-sharpening
原图
直方图拉伸处理后的结果
HSV颜色空间中,直方图拉伸处理后的结果
直方图均衡处理后的结果
CLAHE算法处理后的结果
非锐化掩膜处理后的结果
我们来看一下程序的实现过程
#include <cstdlib>
#include <iostream>
#include <visp3/core/vpImage.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/gui/vpDisplayX.h>
#include <visp3/io/vpImageIo.h>#if defined(VISP_HAVE_MODULE_IMGPROC)
//! [Include]
#include <visp3/imgproc/vpImgproc.h>
//! [Include]
#endifint main(int argc, const char **argv)
{//! [Macro defined]
#if defined(VISP_HAVE_MODULE_IMGPROC) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))//! [Macro defined]//!std::string input_filename = "Crayfish-low-contrast.png"; //设置默认输入图像的名称int blockRadius = 150; //设置CLAHE算法的默认参数int bins = 256; //设置CLAHE算法的默认参数float slope = 3.0f; //设置CLAHE算法的默认参数float sigma = 2.0f; //设置非锐化掩膜算法的默认参数double weight = 0.5; //设置非锐化掩膜算法的默认参数for (int i = 1; i < argc; i++) {if (std::string(argv[i]) == "--input" && i + 1 < argc) {input_filename = std::string(argv[i + 1]);} else if (std::string(argv[i]) == "--blockRadius" && i + 1 < argc) {blockRadius = atoi(argv[i + 1]);} else if (std::string(argv[i]) == "--bins" && i + 1 < argc) {bins = atoi(argv[i + 1]);} else if (std::string(argv[i]) == "--slope" && i + 1 < argc) {slope = (float)atof(argv[i + 1]);} else if (std::string(argv[i]) == "--sigma" && i + 1 < argc) {sigma = (float)atof(argv[i + 1]);} else if (std::string(argv[i]) == "--weight" && i + 1 < argc) {weight = atof(argv[i + 1]);} else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") {std::cout << "Usage: " << argv[0]<< " [--input <input image>]"" [--blockRadius <block radius for CLAHE>] "" [--bins <nb histogram bins for CLAHE>] [--slope <slope for CLAHE>]"" [--sigma <Gaussian kernel standard deviation>] [--weight <unsharp mask weighting>]"" [--help] [-h]"<< std::endl;return EXIT_SUCCESS;}}//! [Read]vpImage<vpRGBa> I_color;vpImageIo::read(I_color, input_filename);
//! [Read]#ifdef VISP_HAVE_X11vpDisplayX d, d2, d3, d4, d5, d6;
#elif defined(VISP_HAVE_GDI)vpDisplayGDI d, d2, d3, d4, d5, d6;
#elif defined(VISP_HAVE_OPENCV)vpDisplayOpenCV d, d2, d3, d4, d5, d6;
#endifd.init(I_color, 0, 0, "Input color image");//! [Stretch contrast]vpImage<vpRGBa> I_stretch;vp::stretchContrast(I_color, I_stretch); //直方图拉伸处理//! [Stretch contrast]d2.init(I_stretch, I_color.getWidth(), 10, "Stretch contrast");//! [Stretch contrast HSV]vpImage<vpRGBa> I_stretch_hsv;vp::stretchContrastHSV(I_color, I_stretch_hsv);//HSV颜色空间中的直方图拉伸处理//! [Stretch contrast HSV]d3.init(I_stretch_hsv, 0, I_color.getHeight() + 80, "Stretch contrast HSV");//! [Histogram equalization]vpImage<vpRGBa> I_hist_eq;vp::equalizeHistogram(I_color, I_hist_eq); //直方图均衡处理//! [Histogram equalization]d4.init(I_hist_eq, I_color.getWidth(), I_color.getHeight() + 80, "Histogram equalization");//! [CLAHE]vpImage<vpRGBa> I_clahe;vp::clahe(I_color, I_clahe, blockRadius, bins, slope); //CLAHE算法处理//! [CLAHE]d5.init(I_clahe, 0, 2 * I_color.getHeight() + 80, "CLAHE");//! [Unsharp mask]vpImage<vpRGBa> I_unsharp;vp::unsharpMask(I_clahe, I_unsharp, sigma, weight); //非锐化掩膜算法处理//! [Unsharp mask]d6.init(I_unsharp, I_color.getWidth(), 2 * I_color.getHeight() + 80, "Unsharp mask");vpDisplay::display(I_color);vpDisplay::display(I_stretch);vpDisplay::display(I_stretch_hsv);vpDisplay::display(I_hist_eq);vpDisplay::display(I_clahe);vpDisplay::display(I_unsharp);vpDisplay::displayText(I_unsharp, 20, 20, "Click to quit.", vpColor::red);vpDisplay::flush(I_color);vpDisplay::flush(I_stretch);vpDisplay::flush(I_stretch_hsv);vpDisplay::flush(I_hist_eq);vpDisplay::flush(I_clahe);vpDisplay::flush(I_unsharp);vpDisplay::getClick(I_unsharp);return EXIT_SUCCESS;
#else(void)argc;(void)argv;return 0;
#endif
}
如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。
ViSP学习笔记(九):图像锐化相关推荐
- OpenCV学习笔记(九)——图像轮廓(下)
<OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...
- ViSP学习笔记(二十五):基于图像的视觉伺服
开发环境:Ubuntu 18.04 LTS + ROS Melodic + ViSP 3.3.1 文章内容主要参考ViSP官方教学文档:https://visp-doc.inria.fr/doxyge ...
- 吴恩达《机器学习》学习笔记九——神经网络相关(1)
吴恩达<机器学习>学习笔记九--神经网络相关(1) 一. 非线性假设的问题 二. 神经网络相关知识 1.神经网络的大致历史 2.神经网络的表示 3.前向传播:向量化表示 三. 例子与直觉理 ...
- Opencv学习笔记(八) -- 图像色彩空间转换
1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...
- IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...
IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...
- Caffe学习笔记4图像特征进行可视化
Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者 http://www.admin10000.com/document/9 ...
- ROS学习笔记九:用C++编写ROS发布与订阅
ROS学习笔记九:用C++编写ROS发布与订阅 本节主要介绍如何用C++编写一个简单的ROS发布与订阅. 编写发布节点 在之前创建的例子beginner_tutorials软件包中,在其目录下的src ...
- at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验
Ema{@AVR 学习笔记九.基于 AT24C16 的数据存储实验 ------- 基于 LT_Mini_M16 9.1 用 I/O 口模拟 I2C 总线实现 AT24C16 的读写 9.1.1 .实 ...
- C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)
C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...
最新文章
- 博客 rss 如何使用_如何使用RSS从您的GatsbyJS博客自动交叉发布
- npm 加入 TC39 委员会,参与定制 JavaScript 标准
- Python第一次周考(0402)
- 老生常谈–希望别再纠结了朋友
- git远程代码回滚_【GIT】git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚...
- 非法操作 login.php,阅文游戏中心 h5游戏接入wiki
- iOS中MVC等设计模式详解
- flask-sqlalchemy Configuration
- 微信公众号采坑之授权config
- 批处理计算n天前\后的日期
- Introduction to Computer Networking学习笔记(二十六):HTTP、SPDY
- 【第36期】游戏策划:新手入行的切入点在哪?
- H3CSE园区-MSTP
- 根据指定日期获取该日期所在周的所有日期
- 工作中提升效率的工具
- ReferenceError Cannot access ‘xxx‘ before initialization
- Linux攻关之基础模块一 系统准备
- RH850开发板StarterKit示例程序分析--R_ADCA0_Init();ADC初始化
- 分享十个预加载功能生成器
- c语言程序设计第三版杜有福,C语言程序设计习题答案 杜有福
热门文章
- javascript王国的一次旅行,一个没有类的世界怎么玩转面向对象?- 很有意思的一篇文章
- MSIL解析一(转)
- 建站abc,建站abc插件,建站abc网站
- Windows Server 2012开启远程桌面服务及授权多终端用户同时登录的详细教程
- ubuntu关闭色linux防火墙,ubantu 14 关闭防火墙 SELinux
- 关于系统起不起来的原因
- 计算机考研考英语作文,2020考研英语备考:描述现象类句式_计算机考研专业课...
- FANUC机器人的通讯方式(1)
- HDFS 全称 Hadoop 分布式文件系统,其最主要的作用是作为 Hadoop 生态中各系统的存储服务。
- 一物一码(10):二维码的安全管控