OpenCV基础篇之查找表
程序及分析
/*
* FileName : lookup_table.cpp
* Author : xiahouzuoxin @163.com
* Version : v1.0
* Date : Sun 01 Jun 2014 04:35:37 PM CST
* Brief :
*
* Copyright (C) MICL,USTB
*/ #include <cv.h>
#include <highgui.h> using namespace std;
using namespace cv; #define QUAN_VAL1 (10)
#define QUAN_VAL2 (100) void CreateLookupTable(Mat& table, uchar quan_val)
{
table.create(1,256,CV_8UC1); uchar *p = table.data;
for(int i = 0; i < 256; ++i)
{
p[i] = quan_val*(i/quan_val);
}
} int main(int argc, char *argv[])
{
Mat img;
Mat out1;
Mat out2; if (argc < 2) {
cout << "Please input image file name." << endl;
return -1;
} img = imread(argv[1], 1); Mat table;
CreateLookupTable(table, QUAN_VAL1);
LUT(img, table, out1);
CreateLookupTable(table, QUAN_VAL2);
LUT(img, table, out2); // Call OpenCV function namedWindow("Lena", CV_WINDOW_NORMAL);
imshow("Lena", img);
namedWindow("QUAN_VAL=10", CV_WINDOW_NORMAL);
imshow("QUAN_VAL=10", out1);
namedWindow("QUAN_VAL=100", CV_WINDOW_NORMAL);
imshow("QUAN_VAL=100", out2); waitKey(0); return 0;
}
为什么要使用查找表?
一般的灰度图像有256个灰度级,而有时我们并不须要这么精确的灰度级(严重影响运算时间),比方黑白图像。这意味着我们以一个新的输入值划分当前的颜色空间,比方灰度到黑白色,将0~127灰度值直接赋值0,128~255赋值1,终于得到较少的黑白两色。查找表就扮演着这样的减少灰度级而提高运算速度的角色。量化前和量化后的灰度值能够用以下的表达式表示:
当中Q表示量化级别。如取10。表示:灰度值1-10用灰度值1表示。灰度值11-20用灰度值11表示,以此类推!
使用上面公式和查找表有毛关系,当然没有,但上面公式代价就是要对图片遍历的每一个灰度值都计算一次。因此,本着程序设计中的“以空间换时间”的基本算法策略。引入查找表,查找表就是将0~255个灰度值量化后的结果提前计算好存储在一个表中,上面程序中的CreateLookupTable就是完毕该功能的函数。
从程序中能够看出,查找表的数据结构定义为Mat类型。
有了查找表后,要对图像中的像素灰度值进行替换。OpenVC提供了使用查找表直接计算出量化灰度级后图像的函数——LUT,其函数原型为:
//! transforms array of numbers using a lookup table: dst(i)=lut(src(i))
CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst,
int interpolation=0);
注意哦,我们程序中定义的查找表类型为Mat,这里LUT的输入输出參数类型怎么是InputArray和OutputArray。在OpenCV中,InputArray/OutputArray这个接口类能够是Mat、Mat_、Mat_、vector、vector>、vector。
也就意味着当你看refman或者源码时,假设看见函数的參数类型是InputArray/OutputArray型时。把上诉几种类型作为參数都是能够的。
另外,请注意。InputArray/OutputArray仅仅能作为函数的形參參数使用。不要试图声明一个InputArray类型的变量,OutputArray也仅仅是InputArray的派生。
还有。还有就是OutputArrayOfArrays、InputOutputArray、InputOutputArrayOfArrays都是OutputArray的别名,碰到别慌张!
效果
江南好,千钟美酒,一曲满庭芳
左边是原始图片;中间是量化值Q=10时的结果,信息丢失非常少;右边是量化值Q=100的图片。非常多信息丢失了。但也别有一番风味。
OpenCV基础篇之查找表的更多相关文章
- mysql基础篇 - 数据库及表的修改和删除
基础篇 - 数据库及表的修改和删除 修改和删除 一.实验简介 本节实验中,我们将学习并实践如何对数据库的内容做修改,删除,重命名等操作. 二.实验准备 在正式开始本实验内容之前,需要先 ...
- OpenCV基础篇之读取显示图片
程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May ...
- opencv——基础篇
一 . opencv是什么及其作用? OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效— ...
- OpenCV基础篇之画图及RNG随机数对象
程序及分析 /* * FileName : random_gen.c * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...
- ABAP基础篇1 内表
内表类型 abap 内表类型有三种: 标准表(一般ABAP程序中用的最多就是这种表) 系统为该表的每一行数据生成一个逻辑索引,自己内部维护着行号(Index)的编码.表的键值不唯一,且没有按照表键自动 ...
- OpenCV基础篇之像素操作对照度调节
程序及分析 /* * FileName : contrast.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...
- 什么是图像 -- opencv基础
opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像: ...
- 小白也能看懂的Redis教学基础篇——朋友面试被Skiplist跳跃表拦住了
各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以 ...
- OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时
目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...
随机推荐
- 关于easyui隐藏后数据不能刷新??
原因是div用display属性隐藏后不能重新加载table数据 解决方法:使用hide()方法在初始化时隐藏 $("#two").hide(); //点击按钮隐藏与显示表单域 $ ...
- node调试工具--node-inspector安装
node-inspector安装: npm install --registry=http://r.cnpmjs.org -g cnpm cnpm install -g node-inspector ...
- Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令
通过前面两篇博客,我们介绍了Linux系统的权限管理.Linux权限管理之ACL权限 介绍了通过设定 ACL 权限,我们为某个用户指定某个文件的特定权限,这在Linux只能对于一个文件只能有所有者权限 ...
- 【APP问题定位(三)】adb安装
先来剧透一下我们需要使用的工具 bin包 一个安装目录,可以免安装直接调用adb命令 Android SDK platform tools 下面依次为大家介绍,第1个和第2 ...
- maven构建geotools应用工程
前置条件 jdk1.7+eclipse+maven POM配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...
- C# 关闭窗体立即停止进程
C#在关闭窗体的时候,有时线程还在后台执行,没有及时退出. 处理方案: 为Form添加FormClosing事件,加入以下语句,在退出时,杀死本进程. System.Diagnostics.Proce ...
- 采用Vue2.0开发的分页js组件
2017-11-17 19:14:23 基于jQuery的分页插件相信大家伙已经都用过很多了,今天分享一下基于Vue2.0的分页插件pagination.js 由于项目需求,要求使用 Vue2.0 开 ...
- Cordic算法——verilog实现
上两篇博文Cordic算法--圆周系统之旋转模式.Cordic算法--圆周系统之向量模式做了理论分析和实现,但是所用到的变量依然是浮点型,而cordic真正的用处是基于FPGA等只能处理定点的平台.只 ...
- 一道变态的Javascript面试题
转载http://cymoft.blog.51cto.com/324099/1260099 1 2 3 4 5 6 7 8 9 f = function() {return true;}; g = ...
- 创建简单的Python列表
比如给出电影列表: The Holy Grail The Life of Brian The Meaning of Life 转换为Python可读的列表,需要遵循以下4个步骤: 1.在数据两边加引号 ...