【C++ OpenCV】LUT查找表原理、实操、使用时机

这篇具有很好参考价值的文章主要介绍了【C++ OpenCV】LUT查找表原理、实操、使用时机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LUT查找表

一、引言

存在的意义:

在OpenCV中,LUT代表查找表(Lookup Table),它是一种用于像素值映射的技术。查找表是一个数组,其中每个元素对应于输入像素值的一个映射值。使用LUT可以有效地对图像进行像素值的转换,常用于颜色空间转换或者对特定像素值进行操作。

LUT通常在需要将图像像素值映射到其他值域时使用,例如将灰度图像转换为伪彩色图像。通过定义一个映射表,可以将原始图像中的每个像素值映射到新的颜色或灰度值,从而实现不同的效果。

而二值化阈值化(Thresholding)是另一种常见的图像处理技术,它将灰度图像转换为二值图像(只有两个像素值,通常是黑色和白色)。二值化是根据阈值将灰度图像中的像素值分成两个类别,通常是将低于阈值的像素设为一个值(例如0),高于阈值的像素设为另一个值(例如255)。二值化通常用于图像分割、边缘检测等应用中。

因此,LUT主要用于对图像像素值进行映射,从而实现颜色空间转换等操作,而二值化阈值化则用于将灰度图像转换为二值图像。两者的主要区别在于处理的目标和操作方式。

都是阈值分割和阈值shreshold有什么区别?

阈值shreshold只能将图片全局按照一个阈值进行映射,LUT可以按照自己设置的阈值范围进行映射

兼容了shreshold的二值化,但是可以多阈值划分。不仅仅可以应用于0-255像素值。

原理:映射

lut查找表,opencv,计算机视觉,opencv,图像处理

灰度值低于100映射为0,大于100小鱼253的映射为1,其余映射为2

比如一个灰度图像,其本质就是一个像素矩阵,我将其每一个像素的灰度值与我的映射矩阵进行比较,如果灰度值为150,则将其映射为1

如果此处还不明白,请见实操部分

二、代码源码

 

void::cv::LUT(  InputArray src,
                InputArray lut,
                OutputArray dst
             )
  • src:输入矩阵,其数据类型只能是CV_8U

  • lut:256个灰度值的查找表,只能是单通道或者与src通道数相同(src3通道,lut不能是2通道,只能是1或者3通道,由此可见其是一个n*256的矩阵

  • dst:输出图像矩阵,其尺寸与src相同,但是数据类型和lut相同(因为src经过lut映射后,输出的dst其像素矩阵值只能是我们规定好的值,如图1的0/1/2)

如果src是三通道,lut是单通道。则是将三通道分离后每个通道单独与lut进行映射后再复合在一起,输出一个图像矩阵

如果src是三通道,lut是三通道。则是两两对应的通道进行映射,对应三个图像矩阵映射后复合在一起(src的R和lut的R映射、src的G和lut的G映射、src的B和lut的B映射)

三、实操

原图:

lut查找表,opencv,计算机视觉,opencv,图像处理

 



#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
​
using namespace std;
using namespace cv;
​
​
int main()
{
    Mat img = imread("E://学习//OPEN-CV学习//lena.png");
    if (img.empty())
    {
        cout << "读取失败!" << endl;
        return -1;
    }
​
    uchar Lutfirst[256];
    //lut矩阵的第一个通道的数组值
    for (int i = 0; i < 256; i++)
    {
        if (i <= 100)
        {
            Lutfirst[i] = 0;
        }
        if (i > 100 && i <= 200)
        {
            Lutfirst[i] = 100;
        }
        if (i > 200)
        {
            Lutfirst[i] = 255;
        }
​
        //通过数组的方式构造Mat矩阵
        Mat lutOne(1, 256, CV_8U, Lutfirst);
​
​
        //lut矩阵的第二个通道的数组值
        uchar Lutsecond[256];
        for (int i = 0; i < 256; i++)
        {
            if (i <= 100)
            {
                Lutfirst[i] = 0;
            }
            if (i > 100 && i <= 200)
            {
                Lutfirst[i] = 100;
            }
            if (i > 200)
            {
                Lutfirst[i] = 255;
            }
​
        }
        //通过数组的方式构造Mat矩阵
        Mat lutTwo(1, 256, CV_8U, Lutsecond);
​
        //lut矩阵的第三个通道的数组值
        uchar Lutthrid[256];
        for (int i = 0; i < 256; i++)
        {
            if (i <= 100)
            {
                Lutfirst[i] = 100;
            }
            if (i > 100 && i <= 200)
            {
                Lutfirst[i] = 200;
            }
            if (i > 200)
            {
                Lutfirst[i] = 255;
            }
​
        }
        //通过数组的方式构造Mat矩阵
        Mat lutThree(1, 256, CV_8U, Lutthrid);
​
        vector<Mat> mergeMats;
        mergeMats.push_back(lutOne);
        mergeMats.push_back(lutTwo);
        mergeMats.push_back(lutThree);
​
​
        Mat mergeTree;
        merge(mergeMats, mergeTree);
​
        Mat out_three,img_one,gary,gary_one;
        //原图与单通道进行映射
        LUT(img, lutOne, img_one);
        //原图与多通道进行映射
        LUT(img, mergeTree, out_three);
        imshow("out_three", out_three);
        imshow("out_three", img_one);
        //灰度图与单通道进行映射
        cvtColor(img, gary, COLOR_BGR2GRAY);
        LUT(gary, lutOne, gary_one);
​
​
​
        waitKey(0);
        return 0;
    }
​
}

lut查找表,opencv,计算机视觉,opencv,图像处理

 

生成的三个lut(1*256)矩阵和(3 *256)mergeTree映射矩阵,一个长条形的图像,从长条最左端到最右端代表了0-255

其不同的颜色就代表了映射不同的值

lut查找表,opencv,计算机视觉,opencv,图像处理

 

左图为转换为的单通道灰度图,右图为和lutOne映射矩阵映射后的图像

例子:

lut查找表,opencv,计算机视觉,opencv,图像处理

 

左图为原灰度值图像的截取一部分的像素矩阵图,灰度值高于100的将其映射为灰度值200,原灰度值低于100的将其灰度值映射为100(映射矩阵为实操代码中的lutOne)

lut查找表,opencv,计算机视觉,opencv,图像处理

 

左图为原图和lutOne映射矩阵映射后的图像,右图为原图(三通道)和mergeTree(三通道映射矩阵)映射后的结果图

四、使用时机

选择使用LUT还是二值化阈值化方法取决于你希望实现的图像处理目标。下面是一些指导原则,可以帮助你确定使用哪种方法:

使用LUT:

  1. 颜色空间转换:如果你需要将图像从一种颜色空间(如RGB)转换为另一种颜色空间(如HSV、Lab等),可以使用LUT来实现。

  2. 伪彩色图像:如果你希望将灰度图像转换为伪彩色图像,其中不同的灰度值映射到不同的颜色,你可以使用LUT来进行映射。

使用二值化阈值化:

  1. 图像分割:如果你需要将图像分成具有明显区别的目标和背景,二值化阈值化是一种常用的方法。通过选择合适的阈值,你可以将目标与背景分离开。

  2. 边缘检测:在某些情况下,你可能对图像中的边缘感兴趣。通过将图像转换为二值图像,边缘将以明显的黑白边界显示出来。

此外,还可以根据具体的图像内容和处理需求来决定使用哪种方法。在实际应用中,可以尝试不同的方法,并根据结果进行评估和调整,以达到最佳效果。文章来源地址https://www.toymoban.com/news/detail-739297.html

到了这里,关于【C++ OpenCV】LUT查找表原理、实操、使用时机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA原理与结构(2)——查找表LUT(Look_Up_Table)

    系列文章目录:FPGA原理与结构(0)——目录与传送门 目录 一、查找表(LUT)概述 二、LUT的性能权衡 1、面积效率 2、速度问题 3、权衡结果  三、LUT的组成与应用 1、LUT的组成         2、LUT的应用 3、LUT应用拓展  本文参考xilinx官方手册ug474:ug474         LUT是CLB的重要组成

    2024年02月08日
    浏览(39)
  • verilog 学习笔记(3)输入查找表(LUT)

    今天做了一个关于输入查找表(LUT)的题目,里面关于8-1 MUX的处理方式让我觉得非常的新奇。 题目很简单,大意就是要求设计一个8位的移位寄存器,同时附加随机访问功能。也就是通过输入的ABC三个数字对应的二进制数转换为一个地址(很像存储中的方式),然后访问移位

    2024年02月13日
    浏览(41)
  • LUT 查找表(Look-Up-Table)

            LUT就是查找表,对于4输入的LUT而言,实际上就是4位地址位,一位数据位的存储器,能够存储16位数据,所以我们在FPGA设计中可以用LUT组建分布式的RAM。         如果用传统的逻辑来实现一个4输入的逻辑电路,需要大致三个步骤:1、看真值表找出输入与输出之间

    2024年02月16日
    浏览(36)
  • FPGA结构:LUT(查找表)和 MUX(多路选择器)介绍

    如果你想学习有关FPGA的专业术语,可以参考这一篇:FPGA专业术语介绍 一句话概括,通过将函数的真值表存放在少量内存单元中来实现组合逻辑电路功能的模块称为LUT。 这里以简单的一个3-LUT(3输入查找表)为例,以下给出其示意图的简化描述: 输入1 ----┐ 输入2 ----┼---

    2024年02月04日
    浏览(52)
  • FPGA原理介绍 (CLB, LUT, 进位链, 存储元素, RAM)

    本文首先对 ASIC 和 FPGA 进行了一个对比,然后介绍了 FPGA 的基本结构,最后解释了 FPGA 实现可编程的基本原理。 这里先给出 ASIC 和 FPGA 的优缺点 ASIC FPGA 优点 性能优越 可靠性高 大批量下单位成本低 开发初期无投入资金壁垒 设计工具使用方便,设计简单快速 产品原型机开发

    2024年02月20日
    浏览(40)
  • [C++] opencv - HoughCircles(霍夫圆查找)函数介绍和使用场景

    HoughCircles函数用于在灰度图像中使用霍夫变换查找圆。 该函数通过修改霍夫变换来实现,通常可以很好地检测出圆的中心,但可能无法找到正确的半径。可以通过指定半径范围(minRadius和maxRadius)来协助该函数,或者在#HOUGH_GRADIENT方法中将maxRadius设置为负数以仅返回圆心而不进

    2024年02月03日
    浏览(43)
  • 【C++ OpenCV】阈值二值化、阈值反二值化、截断、阈值取零、阈值反取零、自适应阈值使用方法以及时机

    阈值:简单来说就是一把分割图像像素的标尺,在二值化处理中有固定阈值和自适应阈值两种形式。 那么什么时候用固定阈值,什么时候使用自适应阈值呢? 答:当图像 质量较好 ,且目标和背景容易区分时,可以采用固定阈值 当图像 质量差 ,且有 阴影过度 ,虽然使用大

    2024年02月07日
    浏览(53)
  • FPGA资源之LUT

      Xilinx 7的FPGA可编程逻辑资源为CLB(Configurable Logic Block)   下图白色高亮为CLB资源:   在Xilinx的FPGA中,这样的CLB资源有很多个,组成可编程逻辑阵列;   我们看到在CLB资源中,还有两个区域如下图:   这些资源统称为SLICE,一个CLB中有两个SLICE,当然这两个SLICE片在

    2024年01月18日
    浏览(44)
  • 3D LUT 滤镜 shader 源码分析

    最近在做滤镜相关的渲染学习,目前大部分 LUT 滤镜代码实现都是参考由 GPUImage 提供的 LookupFilter 的逻辑,整个代码实现不多。参考网上的博文也有各种解释,参考了大量博文之后终于理解了,所以自己重新整理了一份,方便以后阅读理解,对整体代码的实现过程结合LUT的原

    2024年02月06日
    浏览(47)
  • FPGA的可编程逻辑单元(LUT和寄存器)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 1.根据PLD器件单片集成度的高低,可将PLD分为低密度可编程逻辑器件和高密度可编程逻辑器件。 2.按器件结构类型划分      

    2024年02月19日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包