- 博客(28)
- 收藏
- 关注
原创 基于快速去雾的图像亮度增强方法
起因最近在做一个图像处理的算法,因为图像太暗,所以需要对图像的亮度进行增强(不考虑噪声的放大)。尝试了网上搜索到的各种方法后,发现它们存在两个问题:容易造成原本较亮的地方过曝,并且参数不好设置。尝试了一些暗光增强的paper的算法后,发现它们又太慢了。这时我想到曾经看过的一篇paper说过,有一种亮度增强的算法是基于去雾来做的,步骤很简单: 1. 将RGB图像取反(关于图像取反,请参考我的这...
2018-06-09 23:08:30
4247
2
原创 OpenCV两个Mat相减的隐藏秘密
起因今天在看同事写的代码时,发现一个“错误”: 他的原意是实现以下功能:cv::Mat absDiff;cv::absdiff(mat1, mat2, absDiff);其中mat1和mat2均为CV_8UC1类型。但是可能是一时没想起这个函数,于是他写成了这个样子:cv::Mat absDiff = cv::abs(mat1 - mat2);问题于是我...
2018-06-09 00:06:20
11808
2
原创 OpenCL优化小技巧:预创建所有Kernel
最近做了一些图像处理的算法,跑在高通的开发板上,其中使用了OpenCL进行加速。在此过程中,也总结了几个加速的小技巧。今天就来谈其中一个不太有用的小技巧:预创建所有Kernel。第一次进行OpenCL加速时,我注意到,创建cl_kernel时,会耗费几毫秒到二十几毫秒的时间。如果算法中需要创建几十个cl_kernel,那花费的时间也有几百毫秒了。这让人很难接受。后来我又注意到,对于同一个K...
2018-06-08 00:13:57
2895
2
原创 OpenCL clCreateBuffer占用太多时间
最近在做一个图像处理的算法,跑在高通平台上,需要使用OpenCL加速。代码分为三个部分: 1. 初始化 2. 处理图像 3. 释放资源为了尽可能地减少算法的运行时间,我将一切可以预处理的内容都放到了初始化中,其中就包括了创建buffer。在初始化中,我调用clCreateBuffer()创建了9个buffer,共计约占用600MB内存。然后在处理图像中重复使用这些buffer,最后在释放...
2018-06-07 23:43:00
2358
原创 OpenCV图像取反
最近在做一个基于去雾的图像亮度增强的算法IBEABFHR,其中用到了图像取反的操作。所谓图像取反,就是将RGB图像的每个像素点(r, g, b),使用(255 - r, 255 - g, 255 - b)替换。对于灰度图像而言,则是将(g)使用(255 - g)替换。 如下图所示: RGB图像 RGB取反图像 灰度图像 灰度取反图像在OpenCV中要实现此操作,可以遍...
2018-06-07 22:55:06
11603
1
原创 提取图像细节的两种方法
一幅图像可以分解为两层:底层(base layer)和细节层(detail layer)。底层包含图像的低频信息,反映了图像在大尺度上的强度变化;细节层包含图像的高频信息,反映了图像在小尺度上的细节。分解图像有两种方式,以下分别进行解释。1. 加性分解要获取图像的底层,即图像的低频信息,使用低通滤波(如均值滤波(mean filter),高斯滤波(gaussian filter),导向...
2018-06-05 23:23:40
12712
2
原创 C++11高精度计时器
做图像处理算法时,免不了要测量函数的运行时间。以前我都是使用OpenCV的计时函数cv::getTickCount()和cv::getTickFrequency(),但是这样一来,在不使用OpenCV的项目中就没法用了。幸好C++11增加了std::chrono库,可以很方便地实现跨平台的时间测量。于是我封装了一个简单的计时器类,这样只要将其简单地添加到项目中,就可以直接使用了。此计时器单位为毫秒...
2018-06-05 23:19:04
3732
原创 OpenCV之直方图均衡化
本文代码使用OpenCV版本:2.4.13 本文代码在Win10+Visual Studio 2013 Update 3下测试通过 上两篇博客《OpenCV之直方图拉伸》和《OpenCV之查找表与直方图拉伸》讲述了拉伸图像的直方图以增强对比度。然而,在多数情况下,图像在视觉上的缺陷并非源于使用过窄的强度范围,而是由于某些颜色值出现的频率高于另一些。事实上,我们可以认为一幅高质量的图像应该平
2017-09-23 07:51:28
3782
原创 OpenCV之查找表与直方图拉伸
本文代码使用OpenCV版本:2.4.13 本文代码在Win10+Visual Studio 2013 Update 3下测试通过 上一篇博客《OpenCV之直方图拉伸》讲述了直方图拉伸的原理及实现,其中得到了如下公式:g=⎧⎩⎨⎪⎪0,(g−grayMin)∗255(grayMax−grayMin),255,if g<grayMinif grayMin≤g≤grayMaxif g>gra
2017-09-16 10:59:39
773
原创 OpenCV之直方图拉伸
本文代码使用OpenCV版本:2.4.13 本文代码在Win10+Visual Studio 2013 Update 3下测试通过 上一个博客《OpenCV之图像直方图计算》讲述了图像直方图的计算。计算出图像的直方图后,我们不仅可以据此观察图像的像素分布情况,还可以利用它对图像进行增强,例如直方图拉伸(Histogram Stretching)。比如,我们有一个灰度图像的直方图如下所示:可
2017-09-16 06:49:07
4411
原创 OpenCV之图像直方图计算
注:本文使用OpenCV版本:2.4.13calcHistOpenCV提供了计算图像直方图的接口calcHist:void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, c
2017-09-13 21:35:34
745
原创 作者声明
作者:天律界中子邮箱:279428101@qq.comCSDN博客地址:http://blog.csdn.net/u012494876版权声明:转载请保留此链接,不得用于商业用途。
2017-09-12 21:51:57
664
原创 希腊字母表
序号 大写 小写 英文注音 中文读音 1 AA α\alpha alpha 阿尔法 2 BB β\beta beta 贝塔 3 Γ\Gamma γ\gamma gamma 伽马 4 Δ\Delta δ\delta delta 德尔塔 5 EE ϵ\epsilon epsilon 伊普西龙
2017-08-01 22:28:09
774
原创 new的初始化
有如下C++代码:int* buffer = new int[512];在默认情况下,new是不会对分配的int进行初始化的。要想使分配的int初始化为0,需要显式地调用其初始化函数:int* buffer = new int(); // 分配的一个int初始化为0int* buffer = new int[512](); // 分配的512个int都初始化为0对于单个int,也可以初始化为非0值
2017-07-27 22:32:37
17755
原创 malloc()与calloc()的区别
malloc()和calloc()都可以在堆上分配内存,分配的内存也都用free()进行释放,它们的函数原型如下:void* malloc(size_t _Size);void* calloc(size_t _Count, size_t _Size);它们的主要区别是:malloc()只分配内存,calloc()除了分配内存外,还将分配的内存清空为0。举例来说,下面的两段代码是等价的:// mall
2017-07-27 19:45:53
785
原创 C++11之初始化列表
C++11引入了一项新功能:初始化列表。在C++98中,我们可以使用以下两种方法进行初始化:int i = 0;int j(0);引入“初始化列表”后,我们可以这样进行初始化:int i = {0};int j{0};上述代码体现不出“初始化列表”的优越来,别着急,我们还可以这样用:std::vector<int> v{ 1, 2, 3, 4 };std::map<int, float> m
2017-06-16 22:37:45
1905
7
原创 OpenGL由FOVY计算FOVX
在项目中遇到这样一个问题:已知摄像机垂直方向的FOV为FOVY,摄像机与近裁剪平面的距离为n,裁剪平面的宽高比为aspect,求摄像机水平方向的FOVFOVX。设近裁剪平面窗口的宽度为w,高度为h,则:tan(FOVY / 2) = h / (2n);tan(FOVX / 2) = w / (2n) = aspect * h / (2n) = aspect * tan(FOVY / 2);于是可以
2017-04-26 23:11:36
4318
原创 .obj文件中顶点数据的合并
在OpenGL中,为了减少顶点数据所占用的内存,通常会合并具有相同属性的顶点,然后使用顶点的索引进行绘制。举例来说,对于xz平面上中心在原点的的单位正方形,需要两个三角形来表示它,于是一共需要六个顶点:// 第一个三角形v1: 位置vec3(-0.5, 0.0, 0.5),纹理坐标(0.0, 0.0),法向量(0.0, 1.0, 0.0)v2: 位置vec3( 0.5, 0.0, 0.5
2017-04-25 21:46:28
3209
原创 CGAL配置后使用时遇到的一些问题及解决方法
配置CGAL无需赘述,按照官网的教程一步步来即可。 配置完成后,我们可能会需要创建一个自己的项目,来使用CGAL。 假设我们使用Visual Studio创建一个最简单的项目,里面仅包含一个main.cpp文件:#include "CGAL/Polyhedron_3.h"int main(){ return 0;}明显地,我们需要将F:\OpenSource\CGAL-4.9\inc
2017-02-13 18:02:48
6227
原创 OpenGL清理缓存的两种方法
在OpenGL中,对每一帧进行渲染前,我们可能会需要清理帧缓存中的旧数据,包括颜色缓存、深度缓存和模板缓存。通常来说,我们会使用以下方法:初始化时,调用glClearColor()、glClearDepth()及glClearStencil()分别设置清空后颜色缓存、深度缓存和模板缓存中的默认值;在每一帧渲染前,调用glClear()并传入GL_COLOR_BUFFER_BIT、GL_DEPTH
2017-01-12 23:04:57
11502
原创 glDrawElements崩溃的一种可能原因
今天在实现《OpenGL编程指南》第三章的例子时,出现在调用glDrawElements时崩溃的问题,试验后,发现原来是没有绑定EBO。出现崩溃时的例子源码如下:void init(){ ... glGenVertexArrays(1, &g_VAO); glBindVertexArray(g_VAO); glGenBuffers(1, &g_VBO); glB
2016-12-18 22:04:47
4559
3
原创 警告“未引用的形参/局部变量”的消除方法
如果我们编译以下代码:#include <stdio.h>int main(int argc, char** argv){ int n; int nRet = printf("Hello, world!"); return 0; }编译器一般会发出以下警告(VS2015):1>f:\mycode\cpptest\main.cpp(55): warning C4100
2016-11-29 21:43:47
23839
1
原创 帧率(FPS)计算的六种方法总结
帧率(FPS)计算是游戏编程中常见的一个话题。大体来说,总共有如下六种方法:固定时间帧数法帧率计算的公式为:fps = frameNum / elapsedTime;如果记录固定时间内的帧数,就可以计算出同步率。此种方法用得较多。int fps(){ static int fps = 0; static int lastTime = getTime(); // ms sta
2016-11-27 22:32:28
69946
5
原创 assert()中的(void(0))浅析
assert中的((void)0)assert是C++开发过程中经常用到的一个宏。在debug模式下,它起到断言的作用;在release模式下,它产生空语句并被编译器优化掉。在<assert.h>中可以找到它的定义:#ifdef NDEBUG #define assert(expression) ((void)0)#else // 省略 ...#endif很多C++初学者
2016-11-26 16:55:25
5442
3
原创 2.2 和式和递归式 分析理解(一)
内容由 R0=α;Rn=Rn−1+β+γn,n>0.(2.7)R_0 = \alpha; \\R_n = R_{n-1} + \beta + \gamma n, \quad n > 0. \tag{2.7} 及 Rn=A(n)α+B(n)β+C(n)γ,(2.8)R_n = A(n) \alpha + B(n) \beta + C(n) \gamma, \tag{2.8} 求
2016-10-28 23:04:36
1093
原创 VC++判断文件或文件夹是否存在
VC++判断文件或文件夹是否存在在Windows应用项目中,几乎总会需要用到一些文件系统相关的函数,如:判断文件是否存在,判断文件夹是否为空,删除文件夹及其所有子项,计算文件夹的大小,等等。不知为何,Windows并未提供直接的API来完成这些操作,于是,代码江湖上开始创立起各种流派,一片刀光剑影。。。大道流:GetFileAttributes大道至简,大道就在你眼前!
2016-04-20 22:08:34
48299
18
原创 屏蔽WIN7双击最大化及贴边最大化效果的一种方法(VS2008SP1)
在窗口创建完成后,添加以下代码: DWORD dwStyles = ::GetWindowLong(m_hWnd, GWL_STYLE); dwStyles &= ~WS_MAXIMIZEBOX; ::SetWindowLong(m_hWnd, GWL_STYLE, dwStyles);这样
2014-10-08 11:25:21
982
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人