• 利用OpenCV的函数LUT()对矩阵的数据进行查表映射


    利用OpenCV的函数LUT()对矩阵的数据进行查表映射

    LUT是Look Up Table 的缩写,意为查表映射。

    OpenCV的函数LUT()能实现图像灰度值或者说矩阵元素值的查表映射功能。

    函数LUT()的C++原型如下:

    void cv::LUT(InputArray src,
                 InputArray lut,
                 OutputArray dst)
    
    • 1
    • 2
    • 3

    函数LUT()的Python原型如下:

    dst=cv.LUT(src, lut[, dst])
    
    • 1

    第一个参数src仅支持8位的数据,但可以是多通道的图像。

    第二个参数lut是一个1×256的矩阵,其中存放着每个灰度值经过映射后的数值,可以是单通道的图像或者与第一个参数具有相同的通道数。
    如果第二个参数是单通道图像,则src中的每个通道都按照一个LUT进行映射;
    如果第二个参数是多通道图像,则src中的第i个通道按照第二个参数的第i个通道的LUT进行映射。

    函数LUT()输出图像或矩阵的数据类型与第二个参数lut的数据类型一致。

    进行映射操作的时候,原图像或矩阵中的元素值作为lut的索引值,索引对应元素的值作为映射后的新值。

    这个函数的使用非常简单,大家看了上面的叙述再结合下面的例子,就能掌握它的使用了。

    C++示例代码如下:

    //出处:昊虹AI笔记网(hhai.cc)
    //用心记录计算机视觉和AI技术
    
    //博主微信/QQ 2487872782
    //QQ群 271891601
    //欢迎技术交流与咨询
    
    //OpenCV版本 OpenCV3.0
    
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    
    
    int main()
    {
    
    	cv::Mat A1 = (cv::Mat_<uchar>(3, 3) << 41, 41, 41,
    		111, 111, 111,
    		240, 240, 240);
    	cout << "A1中的数据为:\n" << A1 << endl << endl;
    
    	Mat LUT_1 = Mat::zeros(1, 256, CV_8UC1);
    
    	LUT_1.colRange(0, 100) = 50;
    	LUT_1.colRange(100, 200) = 70;
    	LUT_1.colRange(200, 256) = 80;
    
    	// cout << "LUT_1中的数据为:\n" << LUT_1 << endl << endl;
    
    	cv::Mat B1;
    	LUT(A1, LUT_1, B1);
    
    	cout << "A1中的数据经查表映射后为:\n" << B1 << endl << endl;
    
    
    	return(0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    运行结果如下:
    在这里插入图片描述
    Python示例代码如下:

    # -*- coding: utf-8 -*-
    # 出处:昊虹AI笔记网(hhai.cc)
    # 用心记录计算机视觉和AI技术
    
    # 博主微信/QQ 2487872782
    # QQ群 271891601
    # 欢迎技术交流与咨询
    
    # OpenCV的版本为4.4.0
    
    import numpy as np
    import cv2 as cv
    
    if __name__ == '__main__':
        A1 = np.array([[40, 40, 40],
                      [110, 110, 110],
                      [240, 240, 240]], dtype='uint8')
    
        LUT_1 = np.zeros(256, dtype='uint8')
        LUT_1[0: 100] = 50
        LUT_1[100: 200] = 70
        LUT_1[200:] = 80
    
        B1 = cv.LUT(A1, LUT_1)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    运行结果如下:
    在这里插入图片描述

  • 相关阅读:
    Android managed configurations(设置受管理的配置)
    字符串函数的模拟实现(上)
    浅层砂过滤器 全自动浅层介质过滤系统
    手写一个简单爬虫--手刃豆瓣top250排行榜
    二十三、设计模式之组合模式![
    【仿写spring之ioc篇】四、实现bean的初始化阶段
    C#(asp.net)电商后台管理系统-计算机毕业设计源码70015
    web3.0 nft 是什么? nft的意义是什么?
    springboot基于web的摩托车销售系统的设计与实现毕业设计源码031706
    征稿丨IJCAI‘23大模型论坛,优秀投稿推荐AI Open和JCST发表
  • 原文地址:https://blog.csdn.net/wenhao_ir/article/details/128142018