解决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脚本实现代码行数统计代码分享
Mar 10 Python
python根据出生日期返回年龄的方法
Mar 26 Python
在Python的Django框架上部署ORM库的教程
Apr 20 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
用django设置session过期时间的方法解析
Aug 05 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
python代码区分大小写吗
Jun 17 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
python实现简单猜单词游戏
Dec 24 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 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 批量删除数据的方法分析
2009/10/30 PHP
一个比较简单的PHP 分页分组类
2009/12/10 PHP
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
python 快速排序代码
2009/11/23 Python
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
Python简单获取自身外网IP的方法
2016/09/18 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
python测试mysql写入性能完整实例
2018/01/18 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
超市促销活动总结
2014/07/01 职场文书
租房协议书样本
2014/08/20 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
销售辞职信范文
2015/03/02 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android