程序及分析

/*
* 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. VS2013装扩展RazorGenerator

    问题:vs2013工具扩展和更新搜索关键字:Razor Generator查找不到,如图 解决:下载网址:https://github.com/RazorGenerator/RazorGenerato ...

  2. 使用java生成mapbox-gl可读的vector tile

    概述 mapbox-gl主要数据源来自mapbox vector tile,本文就是要阐述怎样把postgresql中的地理空间数据转换成vector tile,流程图如下: 配置 该工程采用spri ...

  3. Do you kown Asp.Net Core -- 配置Kestrel端口

    Kestrel介绍 在Asp.Net Core中,我们的web application 其实是运行在Kestrel服务上,它是一个基于libuv开源的跨平台可运行 Asp.Net Core 的web服 ...

  4. net core 使用tagHelper将 enum枚举类型转换为下拉列表select

    [HtmlTargetElement("enums")] //[HtmlTargetElement("enums", TagStructure = TagStr ...

  5. Java多线程学习之wait、notify/notifyAll 详解

    1.wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写. 2.wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关 ...

  6. phpcms实现全站搜索

    如果制作的静态页面中有搜索功能,那么使用phpcms进行替换怎么替换呢?会不会越到很多的麻烦呢?接下来进行phpcms替换静态页面中的搜索功能. 第一步:搜索页面的form表单提交书写,form表单怎 ...

  7. StackExchange.Redis学习笔记(三)

    这一章主要写一些StackExchange.Redis的配置及不太经常用到的函数 数据库连接 下面是我的连接字符串,里面指定了地址,密码,及默认的数据库 Redis启动后默认会分成0-15个数据库,不 ...

  8. linux expect自动登陆远程服务器 批量管理服务器

    #!/usr/bin/expect set ipaddress [lindex $argv 0] set passwd [lindex $argv 1] set timeout 3 spawn ssh ...

  9. 社群公会GangSDK:程序员入行AI领域需要哪些技能?

    作为一名Android开发工程师,身边总有些同行很焦虑,看着人工智能越来越火,总是担心Android要不行了,所以,我们需要转行么?Android还能走多久?其实,无论是对于Android还是iOS开 ...

  10. 初窥 MongoDB

    最近在研究Nodejs 自然就接触到了MongoDB  这玩意儿有意思  与关系型数据库相比少了很多条条框框 让我情不自禁的想要了解它的所有 MongoDB与Redis同类 属于NoSql的一种,特点 ...