解决利用 opencv 调亮图片时,颜色改变问题_rocketeerLi的博客-程序员秘密

技术标签: 图像亮度调整  计算机视听觉  

问题复现

今天写代码时,需要将图片的亮度进行调整,我是直接在读出来的 R、G、B三个通道上分别增加了一个固定的值。由于颜色值是在[0, 255]区间内的,正常来讲,即使超出了这个范围,利用 opencv 进行展示之前的合并中,也是会自动截断的。但是还是出现了颜色改变的问题。代码如下:

调整亮度的函数:

def imgeAdjustmentLightness(img) :
    B, G, R = cv2.split(img)
    b = copy.deepcopy(B)
    g = copy.deepcopy(G)
    r = copy.deepcopy(R)
    for row in range(len(b)) :
        for col in range(len(b[row])) :
            b[row][col] = b[row][col] + 20
            g[row][col] = g[row][col] + 20
            r[row][col] = r[row][col] + 20
    merged = cv2.merge([b, g, r])
    cv2.imshow("after adjust lightness", merged)

主函数:

# -*- coding: UTF-8 -*-
import numpy as np
import cv2
import copy

# 读取图片信息
img = cv2.imread("01.bmp")
cv2.imshow("origin image", img)
imgeAdjustmentLightness(img)
cv2.waitKey(0)

改变之前的原图:

原图

调整亮度,改变之后的图片:

调整亮度之后

可以看到,很多原来白色的地方都已经变了颜色,一猜就知道,肯定是溢出的问题,但是,为什么会发生溢出呢?为什么没有自动截断呢?

原因

原因其实很简单,因为在调整亮度,加一个特定值的时候,由于通道里的数据类型已经是 np.int8 了,也就是说只有一个子节,最大的存储值也只是 255, 当发生溢出的时候,直接从 0 开始了。。。

也就是说,还没等我们对其进行截断呢,它自己就已经限制住存储范围了。

解决方法

找到问题的原因了,解决发法也比较简单,直接在改变之前进行亮度调整就可以了。

更改调整亮度的函数为:

def imgeAdjustmentLightness(img) :
    B, G, R = cv2.split(img)
    b = copy.deepcopy(B)
    g = copy.deepcopy(G)
    r = copy.deepcopy(R)
    for row in range(len(b)) :
        for col in range(len(b[row])) :
            if b[row][col] > 235 :
                b[row][col] = 255
            else :
                b[row][col] = b[row][col] + 20
            if g[row][col] > 235 :
                g[row][col] = 255
            else :
                g[row][col] = g[row][col] + 20
            if r[row][col] > 235 :
                r[row][col] = 255
            else :
                r[row][col] = r[row][col] + 20
    merged = cv2.merge([b, g, r])
    cv2.imshow("after adjust lightness", merged)

改变之后的效果:

图像亮度调整

其实,就是在增加亮度之前就先判断一波。如果是调低亮度,也是一样的,可以在调低之前,先判断是否能够减去那个亮度的变化值,以防溢出。

调整亮度也可以直接使用 HLS 这个颜色空间,L 就代表了亮度,改变它的效果与 RGB 单通道增加特定值是一样的。但是,溢出的问题就没有这么容易解决了。所以,改变亮度的话,还是 RGB 比较方便一点。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rocketeerLi/article/details/84947888

智能推荐

上传文件失败 Failed to load resource: the server responded with a status of 413 (Request Entity Too Large)_DaraLyn的博客-程序员秘密

写了一个简单的文件上传页面,但是在上传较大文件(大于20M)时,网页上传后无任何提示。打开控制台,发现报错如下:Failed to load resource: the server responded with a status of 413 (Request Entity Too Large) 简单来说呢,就是请求实体过大导致的错误。我用的服务器是n

java数据在内存中存储详解_程序员驴子酱的博客-程序员秘密

有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构。说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但掌握Java的底层实现对Java程序员来说是至关重要的,本文介绍了Java中的数据在内存中的存储。    2 内存中的堆(stack)与栈(heap)  Java程序运行时有6个地方可以存储数据,它们分别是寄存器、栈、堆、静态存储、常量存储和非RAM存储,主要是堆与栈的存储。   &nb

土狼向狮子的演进z_ga34ga34的博客-程序员秘密

土狼向狮子的演进 来自:IT经理世界 孙丽   通信制造业的草原上有三种动物:狮子——跨国公司;豹子——跨国公司在中国的合资企业; 土狼——地道的中国本土企业。   在狮子眼中,土狼是什么?就是以100对1的兵力蚕食狮子的边缘战场,直至腹心;就是以狮子难以理解的目的疯狂发动价格战,使狮子的利润直线下降;就是以对中国本土市场无与伦比的适应性和理解能力,运用各种“不规范竞争手段”,在复杂的利益关系中灵

道听途说:高速增长的民生银行瑕不掩瑜_谈谈对民生银行的了解_Labber的博客-程序员秘密

※道听途说对于银行业的熟悉、认识程度远高于我。在此,我代表持有民生的朋友及我自己向你表示感谢!呵呵,我就试试看,试着从里面找一点问题出来,那么就可以得到更多道听途说先生的精辟解释。来吧!大家都来找其中的问题,以方便于我们更客观的了解我们所持有的民生是什么东东? 民生银行中报浅析——高速增长的民生银行瑕不掩瑜来源:搜狐博客  作者: 道听途说 大致从头看了一遍民生银行半年报,就我个人来说是较为满意

mvc dao层、service层 到底怎么写?_mvc loginservice怎么写_thewindkee的博客-程序员秘密

转自:http://blog.sina.com.cn/s/blog_4adc4b090101kvek.html首先解释面上意思,service是业务层,dao是数据访问层。呵呵,这个问题我曾经也有过,记得以前刚学编程的时候,都是在service里直接调用dao,service里面就new一个dao类对象,调用,其他有意义的事没做,也不明白有这个有什么用,参加工作久了以后就会知道,业务才

随便推点

【搭建物联网后台】基于Workerman的物联网后端管理平台设计_workerman 物联网_Laity000的博客-程序员秘密

项目地址:https://github.com/Laity000/SmartBed-Workerman-AngularJS在线演示(手机端登录虚拟设备admin1):部分功能展示:通过二维码绑定设备:控制设备并实时反馈:查询设备历史数据:写在前面最近开发了一款关于物联网项目的后端管理平台,可以实现对设备的管理,包括设备的连接、区分,状态反馈...

DB_16K_CACHE_SZIE_cldxnu7133的博客-程序员秘密

oracle数据库中有个db_block_size,这个参数是数据库读取数据和存储数据的一个单位。一般默认为8k,这个参数一般是在安装oracle的时候指定,不能修改。为了让数据库里能够有其他的大小的数据库,oracle引进...

Centos7下部署k8s集群_河 静的博客-程序员秘密

Centos7下部署k8s集群1.环境准备角色/主机名ipk8s-master192.168.132.155k8s-node1192.168.132.1562.基础设置2.1 关闭防火墙(master/node操作)systemctl stop firewalld && systemctl disable firewalld2.2 关闭selinux(master/node操作)setenforce 0 && sed -i

Android中隐式Intent的用途(转)_weixin_30411819的博客-程序员秘密

转自:http://blog.csdn.net/coder80/article/details/7879259和 http://blog.csdn.net/coder80/article/details/7881406感谢原作者。==========================================================================...

字节面试官:Android开发真等于废人?已拿offer附真题解析_字节安卓面试_Java老猴子的博客-程序员秘密

开头技术的发展产生了程序员这个职位,从这些年各大互联网公司曝光的一些员工收入水平来看,程序员的工资还是相对比较高的,可是我们在互联网上还听到了另外一种声音,很多程序员想转行,特别是大龄程序员,这可能会令很多人纳闷。为什么工资这么高还想转行呢?其实他们也很无奈,从下面几点可以看得出来。面试题PS:由于文章篇幅问题,只以图片形式展示本次面过程我把他整理成了一份2124页的PDF(包含本次面试及解析,按系统知识分类)一面二面三面答案整理经验总结有的面试官不让你做自我介绍,上来直接

TP5使用微信支付JSAPI完整示例_tp5 jsapi调起支付api_一条爱哭的鲨鱼的博客-程序员秘密

1.下载jsapi SDK 放在vendor目录在WxPayConfig.php 配置参数 const APPID = '**********************'; //公众号appid const MCHID = '**********************'; //商户id const KEY = '**********************...

推荐文章

热门文章

相关标签