解决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(Tornado)模拟登录小米抢手机
Nov 12 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
python批量修改文件编码格式的方法
May 31 Python
Django框架实现逆向解析url的方法
Jul 04 Python
django认证系统实现自定义权限管理的方法
Jul 16 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
Dec 05 Python
python 2.7 检测一个网页是否能正常访问的方法
Dec 26 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
详解如何设置Python环境变量?
May 13 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
java关于string最常出现的面试题整理
Jan 18 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基于mcrypt的加密解密实例
2014/10/27 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
基于jQuery实现的无刷新表格分页实例
2016/02/17 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
python 重命名轴索引的方法
2018/11/10 Python
Python列表(List)知识点总结
2019/02/18 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
越南综合购物网站:Lazada越南
2019/06/10 全球购物
《在大海中永生》教学反思
2014/02/24 职场文书
学生打架检讨书
2014/10/20 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
民事撤诉申请书范本
2015/05/18 职场文书
好人好事新闻稿
2015/07/17 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
教你怎么用Python操作MySql数据库
2021/05/31 Python
Java完整实现记事本代码
2022/06/16 Java/Android