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

作者:E_ven518 时间:2021-12-26 11:45:23 

由于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以后就容易丢失。

来源:https://blog.csdn.net/weixin_43211480/article/details/100926662

标签:python,opencv,图像,颜色通道,加减
0
投稿

猜你喜欢

  • SQL Server误区30日谈 第2天 DBCC CHECKDB会导致阻塞

    2024-01-14 10:09:11
  • Python pip安装模块提示错误解决方案

    2022-03-07 02:26:27
  • mysql数据如何通过data文件恢复

    2024-01-17 18:48:18
  • python tkinter制作用户登录界面的简单实现

    2021-01-07 06:00:09
  • PHP addAttribute()函数讲解

    2023-06-06 09:03:45
  • 关于keras多任务多loss回传的思考

    2023-09-16 18:58:47
  • 谈谈为什么你的 JavaScript 代码如此冗长

    2024-04-17 09:50:07
  • 处理SQL Server 2000的命名实例和多实例

    2009-01-19 13:28:00
  • Python控制多进程与多线程并发数总结

    2021-12-26 00:36:27
  • MySQL数据类型enum 枚举类型

    2024-01-14 22:23:52
  • MySQL数据库的主从同步配置与读写分离

    2024-01-20 17:50:58
  • Python还能这么玩之用Python修改了班花的开机密码

    2023-11-23 17:38:40
  • jquery模拟SELECT下拉框取值效果

    2024-04-22 12:58:56
  • 解决vue 给window添加和移除resize事件遇到的坑

    2024-04-10 13:45:45
  • tensorflow学习教程之文本分类详析

    2023-10-18 17:56:40
  • django框架使用方法详解

    2021-07-07 18:12:00
  • python单例模式获取IP代理的方法详解

    2023-11-14 22:22:05
  • javascript打印html内容功能的方法示例

    2024-04-25 13:13:23
  • python把数组中的数字每行打印3个并保存在文档中的方法

    2022-08-13 19:15:30
  • 关于mysql left join 查询慢时间长的踩坑总结

    2024-01-23 14:20:29
  • asp之家 网络编程 m.aspxhome.com