程序及分析

/*
* 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. float 浮动

    浮动最开始的目的是为了让文字环绕图片(一个图片和多行文字对齐)   1.包裹性:元素添加 float 属性之后 自动变成 inline-block 元素,能设置 宽高 2.破坏性:破坏自身高度,还会使 ...

  2. EF动态拼接查询

    1.业务中遇到个问题,需要查询如某表的id为1或者2或者3,这里是根据传递参数获取如:传递1,2或者1,3或者1,2,3这里在sql中很好拼接如下: or id= or name=3//3代表另一个字 ...

  3. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持多包扫描(六)

    实现功能 1.我们看到@ComponentScan注解一个开始定义就是需要支持,扫描多个包,将多个包的类名获取到.现在就实现这个功能. 实现思路 根据传入的字符串数组,获得多个包下的类全限制名. 实现 ...

  4. ASP.NET Core集成现有系统认证

    我们现在大多数转向ASP.NET Core来使用开发的团队,应该都不是从0开始搭建系统,而是老的业务系统已经在运行,ASP.NET Core用来开发新模块.那么解决用户认证的问题,成为我们的第一个拦路 ...

  5. 阿里云ecs初始化磁盘后远程连接不到服务器

    阿里云初始化磁盘后远程连接不到服务器 报错: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ... 原因:阿里云ecs第一次链接服务器之后会在本地电 ...

  6. github创建远程仓库

    创建远程仓库 当你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一 ...

  7. 利用C#转换图片格式及转换为ico

    注意:转换为ICO后效果不好. 源代码: using System;using System.Collections.Generic;using System.Text;using System.Dr ...

  8. 使用MS Test做单元测试

    声明:本篇博客翻译自:http://www.c-sharpcorner.com/article/unit-testing-with-ms-tests-in-c-sharp/ 写在翻译之前: 依然清晰的 ...

  9. python之socket模块

    UDP client #!/usr/bin/env python2.7 #-*-coding:utf-8 -*- import socket s=socket.socket(socket.AF_INE ...

  10. IDEA热部署(二)---jetty插件启动maven项目

    jetty插件的配置 我们使用jetty插件来进行启动我们的maven项目,在pom.xml中进行配置: <plugins> <plugin> <groupId>o ...