解决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 Django做网页
Nov 04 Python
Python实现的彩票机选器实例
Jun 17 Python
详解python之简单主机批量管理工具
Jan 27 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
Python 中判断列表是否为空的方法
Nov 24 Python
pandas中的数据去重处理的实现方法
Feb 10 Python
python读取文件指定行内容实例讲解
Mar 02 Python
python 画条形图(柱状图)实例
Apr 24 Python
Python字符串格式化常用手段及注意事项
Jun 17 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
239军机修复记
2021/03/02 无线电
索尼SONY ICF-SW7600GR电路分析与改良
2021/03/02 无线电
php 数组的指针操作实现代码
2011/02/08 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
PHP查询快递信息的方法
2015/03/07 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
jQuery 回车事件enter使用示例
2014/02/18 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
javascript 数组精简技巧小结
2020/02/26 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
Python中IPYTHON入门实例
2015/05/11 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
Python爬豆瓣电影实例
2018/02/23 Python
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
信用社实习人员自我鉴定
2013/09/20 职场文书
水电站项目建议书
2014/05/12 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
党员民主评议总结
2014/10/20 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
2015年科普工作总结
2015/07/23 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技