• 【opencv】颜色映射表操作-applyColorMap()和LUT()函数使用介绍


    opencv颜色映射表操作-applyColorMap()和LUT()函数使用介绍

    来自:ColorMaps in OpenCV

    人眼对颜色的变化更敏感,所以当一张灰度图的细微变化不是很明显时,可以对灰度图重新着色。

    opencv提供函数applyColorMap()实现这种功能。其内部算法基本是查表法LUT实现,首先构建查找表,然后应用查找表。应用表的过程类似: d s t ( i , j ) = L U T ( s r c ( i , j ) ) dst(i,j) = LUT(src(i,j)) dst(i,j)=LUT(src(i,j)),LUT是事先创建好的表,每一个像素值都有它对应的值。

    比如我们都知道Gamma校正, d s t = K ∗ E r = 255 ∗ E ( l o g ( p ( x , y ) / 255 ) ∗ g a m m a dst = K*E^r = 255 * E^{(log(p(x,y)/255)*gamma} dst=KEr=255E(log(p(x,y)/255)gamma, p ( x , y ) p(x,y) p(x,y)就是图像中坐标为(x,y)点处的像素值。

    函数applyColorMap()声明如下:

    C++

    void cv::applyColorMap(InputArray src,OutputArray dst,int colormap);
    
    void cv::applyColorMap(InputArray src,OutputArray dst,InputArray userColor);
    
    • 1
    • 2
    • 3

    python:

    cv.applyColorMap(src, colormap[, dst]) ->	dst
    cv.applyColorMap(src, userColor[, dst]) ->	dst
    
    • 1
    • 2

    参数说明:

    • src,原始图像,灰度图或彩色图,图片格式为CV_8UC1或CV_8UC3(opencv4.5.4版本);
    • dst,色彩重映射后的图像;
    • colormap,应用的colormap,值为枚举类型ColormapTypes;
    • userColor,自定义的colormap,可以是CV_8UC1或CV_8UC3,大小为256

    ColormapTypes枚举值:

    在这里插入图片描述

    使用示例,使用滑动条改变colorMap类型,观察每种类型的图片输出结果

    def ColorMap_demo():
        img = cv.imread("lena.jpg",cv.IMREAD_GRAYSCALE)
        if img.shape[0]==0:
            print("load image fail!")
            return
        windowname="applyColorMap"
        cv.namedWindow(windowname,cv.WINDOW_AUTOSIZE)
        pos=0
        cv.createTrackbar("Type",windowname,pos,22,callback_trackbar)
        while True:
            pos = cv.getTrackbarPos("Type",windowname)
            imgdst = np.copy(img)
            if pos != 0 :
                imgdst = cv.applyColorMap(img,pos-1)
            cv.imshow(windowname,imgdst)
            if cv.waitKey(10) == 27:
                break
    if __name__ == "__main__":
        ColorMap_demo()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    结果显示,右边是读取的原始灰度图,左边是颜色映射后的图片。
    在这里插入图片描述

    函数cv::LUT()执行数组的查找表转换,函数声明:

    // C++:
    void cv::LUT(InputArray src, InputArray lut, OutputArray dst)		
    # Python:
    cv.LUT(	src, lut[, dst]	) ->	dst
    
    • 1
    • 2
    • 3
    • 4

    参数说明:

    • src,8bit输入
    • lut,查找表,要与src保持通道一致;256个元素
    • dst,输出数组,大小和通道数与src一致,深度与LUT一致;

    使用示例,gamma校正

    def Gamma_LUT():
        # 构建查找表
        gamma = 0.7
        lut = np.zeros((256,1,3), dtype=np.uint8)  # 建立查找表
        for i in range(256):
            # print(i,'--',np.log(i/255.0))
            if i == 0:
                lut[i] = (0,0,0)
            else:
                tmp = int(np.exp(np.log(i / 255.0) * gamma) * 255.0)  # dst = K*E^r = 255 * E^(log(p(x,y)/255)*gamma
                lut[i]=(tmp,tmp,tmp)
        print(lut)
        # 应用表数据
        img = cv.imread("butterfly.jpg")
        cv.imshow("input", img)
        imgdst = cv.LUT(img,lut)
        cv.imshow("output_gamma", imgdst)
        cv.imwrite("lut2.jpg",imgdst)
        cv.waitKey(0)
    
    if __name__ == "__main__":
        Gamma_LUT()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    显示结果:

    在这里插入图片描述

  • 相关阅读:
    【跟乐乐学seata分布式事务组件】springCloudAlibaba分布式组件Seata 1.3.0集成教程
    Day9_9 Java学习之Dao层模式与JDBC事务
    【Go语言精进之路】构建高效Go程序:零值可用、使用复合字面值作为初值构造器
    AVR单片机开发5——串口通信仿真
    java毕业设计——基于java+Java awt+swing的愤怒的小鸟游戏设计与实现(毕业论文+程序源码)——愤怒的小鸟游戏
    搭建个人知识付费应用系统-(2)用户 Session 管理
    GenerationMixin类
    java计算机毕业设计高原特色农产品网站设计源码+mysql数据库+系统+lw文档+部署
    iNavFlight之MSP Sensor报文格式
    一起Talk Android吧(第四百一十一回:绘制文字)
  • 原文地址:https://blog.csdn.net/sinat_41752325/article/details/127834882