解决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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
python转换摩斯密码示例
Feb 16 Python
python正则表达式match和search用法实例
Mar 26 Python
python笔记:mysql、redis操作方法
Jun 28 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
基于Python解密仿射密码
Oct 21 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
Eclipse配置python默认头过程图解
Apr 26 Python
Pandas读取csv时如何设置列名
Jun 02 Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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生成带有雪花背景的验证码
2006/10/09 PHP
php下MYSQL limit的优化
2008/01/10 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
PHP PDO操作总结
2014/11/17 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
利用Python爬取可用的代理IP
2016/08/18 Python
在Django同1个页面中的多表单处理详解
2017/01/25 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
python3.7.0的安装步骤
2018/08/27 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
化验室技术员岗位职责
2013/12/24 职场文书
个人职业生涯规划书1500字
2013/12/31 职场文书
加油口号大全
2014/06/13 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书
七年级生物教学反思
2016/02/20 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
Go 语言结构实例分析
2021/07/04 Golang
mysql如何能有效防止删库跑路
2021/10/05 MySQL
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技