解决numpy矩阵相减出现的负值自动转正值的问题


Posted in Python onJune 03, 2020

问题描述

今天在使用Numpy中的矩阵做相减操作时,出现了一些本应为负值的位置自动转换为了正值,

观察发现转换后的正值为原本的负值加上256得到,具体情况如下:

正常情况矩阵相减样例如下

>>> import numpy as np
>>> arr = np.array([98,100,103,161,192,210])
>>> brr = np.array([105,105,106,197,196,195])
>>> crr = arr-brr
>>> print(crr)
[ -7 -5 -3 -36 -4 15]

错误代码如下:

path = './image/Blur/blur5.png'
kernel_size = (21, 21);
sigma = 0;
img = cv2.imread(path)
img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img2blur = cv2.GaussianBlur(img2gray, kernel_size, sigma);
grayMat = np.matrix(img2gray)
blurMat = np.matrix(img2blur)
finalMat = blurMat-grayMat
print(grayMat[0,0:10])
print(blurMat[0,0:10])
print(finalMat[0,0:10])

得到的结果值如下:

[[173 171 169 171 174 179 181 182 180 180]]
[[172 172 172 173 173 174 174 173 171 168]]
[[255 1 3 2 255 251 249 247 247 244]]

解决方案

以上出现的矩阵相减得到的结果值自动转换的问题是因为直接通过grayMat = np.matrix(img2gray)

得到的dtype类型是unit8类型的,只需要在开始时设置为np.int32即可正常完成相减.即:

grayMat = np.matrix(img2gray ,dtype=np.float64)

补充知识:有关于python数字图像处理出现矩阵相减没有负数(值都在0-255)的情况分析

问题的发现:

这些天在做我们本校课程机器学习大作业的过程中遇到了一些瓶颈:在我使用有关数字图像矩阵运算的过程中两个参数矩阵相减(譬如 R通道的值-G通道的值)的时候,测试结果的输出一直是正数,且其值都在(0-255)中,这给我带来了不少麻烦。

测试代码如下

print(imgs_train[1][:,:,1])
print("====================================")
print(imgs_train[1][:,:,2])
print("====================================")
print(imgs_train[1][:,:,1]-imgs_train[1][:,:,2])

输出结果为

[[141 143 144 ... 90 90 68]
 [139 141 141 ... 88 90 68]
 [140 141 140 ... 87 90 68]
 ...
 [ 52 52 52 ... 85 83 81]
 [ 52 52 52 ... 85 83 81]
 [ 52 52 52 ... 85 83 81]]
====================================
[[171 173 172 ... 106 107 84]
 [169 171 169 ... 106 107 86]
 [169 170 169 ... 107 109 88]
 ...
 [ 40 40 43 ... 68 66 64]
 [ 40 40 43 ... 68 66 64]
 [ 40 40 43 ... 68 66 64]]
====================================
[[226 226 228 ... 240 239 240]
 [226 226 228 ... 238 239 238]
 [227 227 227 ... 236 237 236]
 ...
 [ 12 12 9 ... 17 17 17]
 [ 12 12 9 ... 17 17 17]
 [ 12 12 9 ... 17 17 17]]

可以看得出来,虽然两个矩阵相减,但是理应为负值的元素却像是取模了一般又变为了正数(255+计算结果),导致这样情况的原因其实是因为矩阵的元素类型有关。默认来说这样的矩阵类型是uint8即无符号8bit整型,这样进行相减当然得不出正确结果。

问题的解决

在查阅相关资料之后,发现可以通过设置其元素格式进行运算,从而规避了无负数结果的发生。

测试代码如下:

print(imgs_train[1][:,:,1])
print("====================================")
print(imgs_train[1][:,:,2])
print("====================================")
print(imgs_train[1][:,:,1].astype(np.float32)-imgs_train[1][:,:,2].astype(np.float32))

结果显示为:

[[141 143 144 ... 90 90 68]
 [139 141 141 ... 88 90 68]
 [140 141 140 ... 87 90 68]
 ...
 [ 52 52 52 ... 85 83 81]
 [ 52 52 52 ... 85 83 81]
 [ 52 52 52 ... 85 83 81]]
====================================
[[171 173 172 ... 106 107 84]
 [169 171 169 ... 106 107 86]
 [169 170 169 ... 107 109 88]
 ...
 [ 40 40 43 ... 68 66 64]
 [ 40 40 43 ... 68 66 64]
 [ 40 40 43 ... 68 66 64]]
====================================
[[-30. -30. -28. ... -16. -17. -16.]
 [-30. -30. -28. ... -18. -17. -18.]
 [-29. -29. -29. ... -20. -19. -20.]
 ...
 [ 12. 12. 9. ... 17. 17. 17.]
 [ 12. 12. 9. ... 17. 17. 17.]
 [ 12. 12. 9. ... 17. 17. 17.]]

综上所述,在遇到矩阵不明数值类型的时候可以指定其类型,之后矩阵元素就会以这样的数值类型进行计算。

以上这篇解决numpy矩阵相减出现的负值自动转正值的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单介绍Python中的JSON模块
Apr 08 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
python中的格式化输出用法总结
Jul 28 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
Python实现识别图片内容的方法分析
Jul 11 Python
python3使用flask编写注册post接口的方法
Dec 28 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
May 13 Python
python实现局域网内实时通信代码
Dec 22 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 Python
Django DRF路由与扩展功能的实现
Jun 03 #Python
Django中使用Json返回数据的实现方法
Jun 03 #Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 #Python
基于Python绘制美观动态圆环图、饼图
Jun 03 #Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 #Python
浅谈python opencv对图像颜色通道进行加减操作溢出
Jun 03 #Python
python golang中grpc 使用示例代码详解
Jun 03 #Python
You might like
PHP调用C#开发的dll类库方法
2014/07/28 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
浅析PHP开发规范
2018/02/05 PHP
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
jupyter 添加不同内核的操作
2021/02/06 Python
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
史上最全面的Java面试题汇总!
2015/02/03 面试题
国窖1573广告词
2014/03/21 职场文书
股份合作协议书范本
2014/04/14 职场文书
警示教育活动总结
2014/05/05 职场文书
民事调解协议书
2016/03/21 职场文书