浅谈python opencv对图像颜色通道进行加减操作溢出


Posted in Python onJune 03, 2020

由于opencv读入图片数据类型是uint8类型,直接加减会导致数据溢出现象

(1)用Numpy操作

可以先将图片数据类型转换成int类型进行计算,

data=np.array(image,dtype='int')

经过处理后(如:遍历,将大于255的置为255,小于0的置为0)

再将图片还原成uint8类型

data=np.array(image,dtype='uint8')

注意:

(1)如果直接相加,那么

当像素值 > 255时,结果为对256取模的结果,例如:(240+66) % 256=50

而不是自动按照255处理

(2)如果直接相减,那么

当像素值<0时,结果为加上256的结果,例如:(100-140)+ 256 = 216

而不是自动按照0处理

例如:

选取一张图片R分量做实验

浅谈python opencv对图像颜色通道进行加减操作溢出

情况一:直接numpy操作

先加到240,再加66,超过了255,可以看到,并不默认255,而是变成了50

浅谈python opencv对图像颜色通道进行加减操作溢出

再试试相减操作:再减去100,本来结果是-50,但是可以看到,变成了206(-50+256)

浅谈python opencv对图像颜色通道进行加减操作溢出

(2)用opencv自带函数操作

图像相加:

cv2.add()

像素值>255, 直接自动按照255处理

图像相减:

cv2.subtract()

像素值小于0,直接自动按照0处理

例如:

r加上300,自动变成255

浅谈python opencv对图像颜色通道进行加减操作溢出

同理,小于0的自动变为0

以上两种方法可以根据需要选择。

补充知识:Opencv numpy中uint8类型存储图像

用opencv处理图像时,可以发现获得的矩阵类型都是uint8

import cv2 as cv
img=cv.imread(hello.png)
print(img)
array([[[...],
    [...],
    [...]]],dtype='uint8')

uint8是专门用于存储各种图像的(包括RGB,灰度图像等),范围是从0?255

这里要注意如何转化到uint8类型

1: numpy有np.uint8()函数,但是这个函数仅仅是对原数据和0xff相与(和最低2字节数据相与),这就容易导致如果原数据是大于255的,那么在直接使用np.uint8()后,比第八位更大的数据都被截断了,比如:

>>>a=[2000,100,2]
>>>np.uint8(a)
array([208, 100, 2], dtype=uint8)

2: 用cv2.normalize函数配合cv2.NORM_MINMAX,可以设置目标数组的最大值和最小值,然后让原数组等比例的放大或缩小到目标数组,如下面的例子中是将img的所有数字等比例的放大或缩小到0?255范围的数组中,

cv2.normalize(img, out, 0, 255, cv2.NORM_MINMAX)

然后改变数据类型

np.array([out],dtype=‘uint8')

总结:

要想将当前的数组作为图像类型来进行各种操作,就要转换到uint8类型,转换的方式推荐使用第二种,因为第一种在值大于255以后就容易丢失。

以上这篇浅谈python opencv对图像颜色通道进行加减操作溢出就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
wxPython实现窗口用图片做背景
Apr 25 Python
详解用TensorFlow实现逻辑回归算法
May 02 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
python实现画出e指数函数的图像
Nov 21 Python
Python super()方法原理详解
Mar 31 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
python hmac模块验证客户端的合法性
Nov 07 Python
通用的Django注册功能模块实现方法
Feb 05 Python
python golang中grpc 使用示例代码详解
Jun 03 #Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 #Python
QML用PathView实现轮播图
Jun 03 #Python
Python基于smtplib协议实现发送邮件
Jun 03 #Python
Pytorch环境搭建与基本语法
Jun 03 #Python
如何学习Python time模块
Jun 03 #Python
使用openCV去除文字中乱入的线条实例
Jun 02 #Python
You might like
基于PHP文件操作的详解
2013/06/05 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
浅析php工厂模式
2014/11/25 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
基于jquery的滚动新闻列表
2010/06/19 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
Python调用命令行进度条的方法
2015/05/05 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
python的依赖管理的实现
2019/05/14 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
如何在sublime编辑器中安装python
2020/05/20 Python
QML实现钟表效果
2020/06/02 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
linux系统都有哪些运行级别
2012/04/15 面试题
遇到的Mysql的面试题
2014/06/29 面试题
5s标语大全
2014/06/23 职场文书
百日安全生产活动总结
2014/07/05 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python