zoukankan      html  css  js  c++  java
  • OpenCV调整彩色图像的饱和度和亮度

    问题

    如何调整彩色图像的饱和度和亮度

    解决思路

    详细步骤:

    1. 将RGB图像值归一化到[0, 1]
    2. 然后使用函数cvtColor进行色彩空间的转换
    3. 接下来可以根据处理灰度图像对比度增强伽马变换或者线性变换调整饱和度和亮度分量
    4. 最后转换到RGB色彩空间

    代码

    # !/usr/bin/env python
    # -*-encoding: utf-8-*-
    # author:LiYanwei
    # version:0.1
    
    
    import numpy as np
    import cv2
    
    
    def main():
        # 加载图片 读取彩色图像
        image = cv2.imread('./Files_image/img1.jpg', cv2.IMREAD_COLOR)
        # print(image)
        # cv2.imshow("image", image)
        # 图像归一化,且转换为浮点型
        fImg = image.astype(np.float32)
        fImg = fImg / 255.0
        # 颜色空间转换 BGR转为HLS
        hlsImg = cv2.cvtColor(fImg, cv2.COLOR_BGR2HLS)
        l = 100
        s = 100
        MAX_VALUE = 100
        # 调节饱和度和亮度的窗口
        cv2.namedWindow("l and s", cv2.WINDOW_AUTOSIZE)
        def nothing(*arg):
            pass
        # 滑动块
        cv2.createTrackbar("l", "l and s", l, MAX_VALUE, nothing)
        cv2.createTrackbar("s", "l and s", s, MAX_VALUE, nothing)
        # 调整饱和度和亮度后的效果
        lsImg = np.zeros(image.shape, np.float32)
        # 调整饱和度和亮度
        while True:
            # 复制
            hlsCopy = np.copy(hlsImg)
            # 得到 l 和 s 的值
            l = cv2.getTrackbarPos('l', 'l and s')
            s = cv2.getTrackbarPos('s', 'l and s')
            # 1.调整亮度(线性变换) , 2.将hlsCopy[:, :, 1]和hlsCopy[:, :, 2]中大于1的全部截取
            hlsCopy[:, :, 1] = (1.0 + l / float(MAX_VALUE)) * hlsCopy[:, :, 1]
            hlsCopy[:, :, 1][hlsCopy[:, :, 1] > 1] = 1
            # 饱和度
            hlsCopy[:, :, 2] = (1.0 + s / float(MAX_VALUE)) * hlsCopy[:, :, 2]
            hlsCopy[:, :, 2][hlsCopy[:, :, 2] > 1] = 1
            # HLS2BGR
            lsImg = cv2.cvtColor(hlsCopy, cv2.COLOR_HLS2BGR)
            # 显示调整后的效果
            cv2.imshow("l and s", lsImg)
    
            ch = cv2.waitKey(5)
            # 按 ESC 键退出
            if ch == 27:
                break
            elif ch == ord('s'):
                # 按 s 键保存并退出
                # 保存结果
                lsImg = lsImg * 255
                lsImg = lsImg.astype(np.uint8)
                cv2.imwrite("lsImg.jpg", lsImg)
                break
    
        # 关闭所有的窗口
        cv2.destroyAllWindows()
    
    
    if __name__ == "__main__":
        main()
    
  • 相关阅读:
    链表VS数组
    数组VS集合
    最好、最坏、平均、均摊时间复杂度
    代码时间、空间复杂度分析
    “echo >”和“echo >>”的区别
    两数之和
    hadoop学习之----------IntelliJ IDEA上实现MapReduce中最简单的单词统计的程序(本地 和 hadoop 两种实现方式)
    Ubuntu16.04中解决关于The Internet Topology Zoo 的gml文件的读取并画图的问题
    Ubuntu16.04解决Ubuntu Sofware打开后无反应
    Ubuntu16.04中如何启用floodlight的一种方式
  • 原文地址:https://www.cnblogs.com/Py00/p/8876825.html
Copyright © 2011-2022 走看看