程序及分析

/*
* 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;
}
  1. 为什么要使用查找表?

    一般的灰度图像有256个灰度级,而有时我们并不须要这么精确的灰度级(严重影响运算时间),比方黑白图像。这意味着我们以一个新的输入值划分当前的颜色空间,比方灰度到黑白色,将0~127灰度值直接赋值0,128~255赋值1,终于得到较少的黑白两色。查找表就扮演着这样的减少灰度级而提高运算速度的角色。量化前和量化后的灰度值能够用以下的表达式表示:

    当中Q表示量化级别。如取10。表示:灰度值1-10用灰度值1表示。灰度值11-20用灰度值11表示,以此类推!

  2. 使用上面公式和查找表有毛关系,当然没有,但上面公式代价就是要对图片遍历的每一个灰度值都计算一次。因此,本着程序设计中的“以空间换时间”的基本算法策略。引入查找表,查找表就是将0~255个灰度值量化后的结果提前计算好存储在一个表中,上面程序中的CreateLookupTable就是完毕该功能的函数。

    从程序中能够看出,查找表的数据结构定义为Mat类型。

  3. 有了查找表后,要对图像中的像素灰度值进行替换。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基础篇之查找表的更多相关文章

  1. mysql基础篇 - 数据库及表的修改和删除

    基础篇 - 数据库及表的修改和删除         修改和删除 一.实验简介 本节实验中,我们将学习并实践如何对数据库的内容做修改,删除,重命名等操作. 二.实验准备 在正式开始本实验内容之前,需要先 ...

  2. OpenCV基础篇之读取显示图片

    程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May ...

  3. opencv——基础篇

    一 . opencv是什么及其作用? OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效— ...

  4. OpenCV基础篇之画图及RNG随机数对象

    程序及分析 /* * FileName : random_gen.c * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...

  5. ABAP基础篇1 内表

    内表类型 abap 内表类型有三种: 标准表(一般ABAP程序中用的最多就是这种表) 系统为该表的每一行数据生成一个逻辑索引,自己内部维护着行号(Index)的编码.表的键值不唯一,且没有按照表键自动 ...

  6. OpenCV基础篇之像素操作对照度调节

    程序及分析 /* * FileName : contrast.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...

  7. 什么是图像 -- opencv基础

    opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像: ...

  8. 小白也能看懂的Redis教学基础篇——朋友面试被Skiplist跳跃表拦住了

    各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以 ...

  9. OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时

    目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...

随机推荐

  1. 关于easyui隐藏后数据不能刷新??

    原因是div用display属性隐藏后不能重新加载table数据 解决方法:使用hide()方法在初始化时隐藏 $("#two").hide(); //点击按钮隐藏与显示表单域 $ ...

  2. node调试工具--node-inspector安装

    node-inspector安装: npm install --registry=http://r.cnpmjs.org -g cnpm cnpm install -g node-inspector ...

  3. Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令

    通过前面两篇博客,我们介绍了Linux系统的权限管理.Linux权限管理之ACL权限 介绍了通过设定 ACL 权限,我们为某个用户指定某个文件的特定权限,这在Linux只能对于一个文件只能有所有者权限 ...

  4. 【APP问题定位(三)】adb安装

    先来剧透一下我们需要使用的工具 bin包               一个安装目录,可以免安装直接调用adb命令 Android SDK platform tools 下面依次为大家介绍,第1个和第2 ...

  5. maven构建geotools应用工程

    前置条件 jdk1.7+eclipse+maven POM配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

  6. C# 关闭窗体立即停止进程

    C#在关闭窗体的时候,有时线程还在后台执行,没有及时退出. 处理方案: 为Form添加FormClosing事件,加入以下语句,在退出时,杀死本进程. System.Diagnostics.Proce ...

  7. 采用Vue2.0开发的分页js组件

    2017-11-17 19:14:23 基于jQuery的分页插件相信大家伙已经都用过很多了,今天分享一下基于Vue2.0的分页插件pagination.js 由于项目需求,要求使用 Vue2.0 开 ...

  8. Cordic算法——verilog实现

    上两篇博文Cordic算法--圆周系统之旋转模式.Cordic算法--圆周系统之向量模式做了理论分析和实现,但是所用到的变量依然是浮点型,而cordic真正的用处是基于FPGA等只能处理定点的平台.只 ...

  9. 一道变态的Javascript面试题

    转载http://cymoft.blog.51cto.com/324099/1260099 1 2 3 4 5 6 7 8 9 f = function() {return true;};  g =  ...

  10. 创建简单的Python列表

    比如给出电影列表: The Holy Grail The Life of Brian The Meaning of Life 转换为Python可读的列表,需要遵循以下4个步骤: 1.在数据两边加引号 ...