图像滤镜的一些加速和改进--笔记
来源:互联网 发布:曼朗网络 编辑:程序博客网 时间:2024/06/03 21:12
滤镜有很多开源代码包,imageshop,tinyimage,还有安卓的源码包,看过安卓的源码包,感觉还有很大的提升空间.
http://blog.csdn.net/jingwen3699/article/details/7770287 这个博客有介绍,看看你就知道,至少针对图像遍历像素有很多加速的方法可用.
列出我整理出的速度最快的几个,基于opencv
/*adjust brightness and contract查找表 */void cast_LUT(const cv::Mat& src, cv::Mat& dst,unsigned char(&r_lookup)[256],unsigned char(&g_lookup)[256], unsigned char(&b_lookup)[256],IMAGE_CHANNELMODE mode){ uchar* srcData = src.data; if(dst.empty()){ dst.create(src.size(),src.type()); } uchar* dstData = dst.data; int size = src.rows * src.cols * 3; switch (mode){ case IMAGE_CHANEL_RGB: {//经测试,这种遍历像素的方法时最快的,而且比较安全 for (int i = 0; i < size-3; i+=3) { dstData[i] = b_lookup[srcData[i]]; dstData[i+1] = g_lookup[srcData[i+1]]; dstData[i+2] = r_lookup[srcData[i+2]]; } break; } case IMAGE_CHANEL_B: { for (int i = 0; i < size-3; i+=3) { dstData[i] = b_lookup[srcData[i]]; } break; } case IMAGE_CHANEL_G: { for (int i = 0; i < size-3; i+=3) { dstData[i] = g_lookup[srcData[i+1]]; } break; } case IMAGE_CHANEL_R: { for (int i = 0; i < size-3; i+=3) { dstData[i] = r_lookup[srcData[i+2]]; } break; } }}
//这个是利用opencv里的LUT查找表来实现的亮度和对比度调节void adjustBrightContract(const cv::Mat &src, cv::Mat &dst, float brightFactor, float contractFactor){ IMAGE_ASSERT_VOID(brightFactor >= -1.0 && brightFactor <= 1.0); IMAGE_ASSERT_VOID(contractFactor >= -1.0 && contractFactor <= 1.0); float delta = 1 + brightFactor; float beta = 1 + contractFactor; cv::Mat lookup(1,256,CV_8UC1); uchar* pData = lookup.data;//生成查找表 for(int i = 0;i < 256;i++) { pData[i] = cv::saturate_cast<uchar>(i * delta);//bright pData[i] = cv::saturate_cast<uchar>(thresholdc + (i - thresholdc) * beta);//contract } cv::LUT(src,lookup,dst);}//接下来时自动色阶的void adjustcolorLevel(cv::Mat& src,cv::Mat& dst,int blackThreshold,int whiteThreshold,float gamma,IMAGE_CHANNELMODE mode){ IMAGE_ASSERT_VOID(blackThreshold>= 0 && whiteThreshold>blackThreshold && whiteThreshold<=255); IMAGE_ASSERT_VOID(gamma >= 0.0 && gamma <= 10.0); unsigned char lookup[256]; // cv::Mat lookup(1,256,CV_8UC1); uchar*pData = lookup; //smaller than blackThreshold will be set to 0 for (int i = 0; i < blackThreshold; i ++) { pData[i] = 0; } //between using gamma correct float ig = (gamma == 0.0) ? 0.0 : 1 / gamma; float threshold = (float)(whiteThreshold - blackThreshold); for (int i = blackThreshold; i < whiteThreshold; i++) { pData[i] = cv::saturate_cast<uchar>( pow((i-blackThreshold)/threshold,ig)*255); } //big than whiteThreshold will be set to 255 for (int i = whiteThreshold; i < 256; i++) { pData[i] = 255; }//自己写的LUT cast_LUT(src,dst,lookup,lookup,lookup,mode); //cv::LUT(src,lookup,dst);}
0 0
- 图像滤镜的一些加速和改进--笔记
- 图像滤镜的一些加速和改进--笔记
- 加速和改进PCB布线
- 一些比较有用的js脚本--改进onload和insertAfter
- 图像滤镜的基本方法
- java7-coin项目对java的一些改进
- css静态滤镜--笔记
- 【学习笔记-图像拼接】基于GPU加速的大尺寸图像拼接
- 学习笔记:改进的waitfree_queue,排除一些bug
- VC2005的一些改进
- JDBC 4.0的一些新的和改进的特征
- 简单的图像滤镜运算法则
- 图像Filter之--层的滤镜
- iOS 图像的滤镜效果实现
- Canvas几种图像滤镜的实现
- Python-OpenCV 处理图像(二):滤镜和图像运算
- Python-OpenCV 处理图像(二):滤镜和图像运算
- 图像处理(基于android)---滤镜实现的一点看法和总结
- 傅里叶变换
- Javascript对象相关方法
- 23种设计模式知多少
- myeclipse 在线生成注册码
- c语言中同一函数下不可以重复定义变量
- 图像滤镜的一些加速和改进--笔记
- vim复制,粘贴,删除,撤销,替换,光标移动等用法
- object-c ubuntu下开发环境搭建
- STM8s003(也包括103)使用笔记
- 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
- OMS系统360浏览器无法登录问题
- Swift - Struct 與 Class 的差異性
- 05_重新打开已有工程(随手记)
- JavaScript 表单验证