解决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实现全角半角转换的方法
Aug 18 Python
使用Pyrex来扩展和加速Python程序的教程
Apr 13 Python
python插入数据到列表的方法
Apr 30 Python
Python 多线程实例详解
Mar 25 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
Python多线程扫描端口代码示例
Feb 09 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
在Python中表示一个对象的方法
Jun 25 Python
Python实现微信小程序支付功能
Jul 25 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
使用npy转image图像并保存的实例
Jul 01 Python
Python+OpenCV实现在图像上绘制矩形
Mar 21 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
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
php实现的简单检验登陆类
2015/06/18 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
JQuery循环滚动图片代码
2011/12/08 Javascript
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
py中的目录与文件判别代码
2008/07/16 Python
Python常用算法学习基础教程
2017/04/13 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
Python实战购物车项目的实现参考
2019/02/20 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
python2 对excel表格操作完整示例
2020/02/23 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
大学生年度自我鉴定
2013/10/31 职场文书
《火烧云》教学反思
2014/04/12 职场文书
活动总结的格式
2014/05/07 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
离婚民事起诉状
2015/08/03 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python