总结:写出 一键修图(单图hdr)算法的全过程 (附demo下载)

2015.8月中旬,开始自学图像处理。

经历如下阶段:

1.泡图书馆一个多月,查阅相关书籍

2.写出第一个版本demo

3.四十多次算法修改

4.再进图书馆查阅书籍,网购书籍

5.学习理解其他图像算法,查阅国内外论文

6.淘宝购买大学二手图像处理相关教材,打印国外书籍

7.阅读大量图像处理相关开源项目

8.看完手上所有书籍

9.写出相对完善的第一版demo

历时5个月。

从不了解图像处理技术领域到做出来,再到一次次的突破。

当然目前这个算法还有改进的空间。

在俺2.2Ghz CPU的电脑上,可以达到处理一千六百万像素彩色照片,仅需40毫秒左右。

算法不采用任何的软硬件的加速方案,单核单线程,不采用SIMD指令,不使用GPU,不使用OMP。

附上一系列效果demo:

原图->效果图.

当然,在这个过程中,也做了不少其他的图像算法。

很多事情,不难,只是你想不想去做好而已。

欢迎拿PS以及美图等软件的算法进行对比。

天下武功,唯快不破。

demo下载

本文只是抛砖引玉一下,若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是:

[email protected]

时间: 2024-09-28 17:54:22

总结:写出 一键修图(单图hdr)算法的全过程 (附demo下载)的相关文章

如何写一套下拉刷新的控件?《MJRefresh原理浅析》(附Demo下载地址)

相信大家有很多人在做项目的时候都在使用MJRefresh 控件来实现下拉刷新的功能: MJRefresh经过不断的重构与更新迭代,现在不管是功能上还是代码结构上都是相当不错的,都是很值我们去学习的. 下面就是MJRefresh开源框架中中主要的一些类文件 MJRefresh主要的类文件 MJRefresh 的使用相信都难不倒大家 今天我主要想和大家分享一下MJRefresh的想法,因为我觉得这才是最重要的,献丑了,有理解的不对和不深入的地方,请大家多多点评哈! 试想,如果没有MJRefresh开

一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

4个字节表示的整数,总共只有2^32约等于4G个可能.为了简单起见,可以假设都是无符号整数.分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0.基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的.算法流程:1)分配500MB内存buf,初始化为02)unsigned int x=0x1;  for each int j in file  buf=buf|x<<j;  e

数据结构与算法-字符串写出一个strlen函数

写出一个strlen函数 int strlen( const char *str ) //输入参数const { assert( str != NULL ); //断言字符串地址非0 int len=0; while( (*str++) != '' ) { len++; } return len; }

学习图像算法阶段性总结 (附一键修图Demo)

今天特别感慨,自己从决定研究图像处理,势必要做出一键修图算法. 经历了,三个多月的书籍积累,三个多月的算法调整以及优化. 人是一种奇怪的动物,当你做不到的时候,你以为做到了,自己会感觉很爽,很有成就感. 而当你做到了,却会觉得也就那么回事. 一开始自己只是很意外性地做到了一种劣质的颜色矫正算法,就觉得自己牛上天了. 再到后来一次又一次改进算法,最后那个最原始的算法,烂到我自己都不好意思说. 仅仅一个颜色的修复我就耗费了四五个月,再到半个月做完智能曝光算法,一切好像就是那么顺理成章,自然而然. 跟

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

android:如何用一天时间,写出“飞机大战”这样的游戏!(无框架-SurfaceView绘制)

序言作为一个android开发者,时常想开发一个小游戏娱乐一下大家,今天就说说,我是怎么样一天写出一个简单的"飞机大战"的.体验地址:http://www.wandoujia.com/apps/edu.njupt.zhb.planegame游戏分析玩过"飞机大战"游戏的都知道,飞机大战中的主要"角色"有:1.玩家飞机2.敌方飞机3.玩家飞机发送的子弹4.敌方Boss飞机发送的子弹我们需要控制的有:1.绘制屏幕内的角色2.控制角色的逻辑,比如:敌方

【整洁之道】如何写出更整洁的代码(上)

如何写出更整洁的代码 代码整洁之道不是银弹,不会立竿见影的带来收益. 没有任何犀利的武功招式,只有一些我个人异常推崇的代码整洁之道的内功心法.它不会直接有效的提高你写代码的能力与速度,但是对于程序员的整个职业生涯必然会带来意想不到的好处. 如果你还是一个在校学生,或者是刚工作没多久的"菜鸟",那么很有必要接触一些这方面的知识的.很显然,它会帮助你更快的适应企业级开发的要求. 1. 为什么需要代码更整洁? 在考虑代码整洁的时候,我们需要明确的一个前提是,这里不讨论代码的对错. 关于什么是

居然在不伤元气的情况下写出了基数排序-)

基数排序就不多说了,其思路如下: 0. 输入为n个整数,每个数字为b位 1. 把整数拆分为b/r“位”, 每个"位"的长度为r(十进制长度) 2. 由低到高分别对每个“位”作计数排序 值得一说的是,为使算法效率最高,r应该为lgn(取整),然而实现中没有限定r的大小,可以自行设定. 不多说,上代码:(RadixSort.h省略) 1. RadixSort.cpp #include "stdafx.h" #include <malloc.h> #inclu

Effective C++ Item 25 考虑写出一个不抛异常的swap函数

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常 示例: stl里的swap算法 namespace std{ template<typename T> void swap(T &a, T &b){ T temp(a); a = b; b = temp; } } //"pimpl手法"(pointer