解决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制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
Python中__init__.py文件的作用详解
Sep 18 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
python读写LMDB文件的方法
Jul 02 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
详解Django配置JWT认证方式
May 09 Python
简单了解Django项目应用创建过程
Jul 06 Python
python中time包实例详解
Feb 02 Python
Python爬虫之爬取二手房信息
Apr 27 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 $_SERVER["REQUEST_URI"]获取值的通用解决方法
2010/06/21 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
JavaScript仿支付宝6位数字密码输入框
2016/12/29 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
Python解析nginx日志文件
2015/05/11 Python
Python开发的实用计算器完整实例
2017/05/10 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
python web框架中实现原生分页
2019/09/08 Python
python 监控logcat关键字功能
2020/09/04 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
全球立体声:World Wide Stereo
2018/09/29 全球购物
医务工作者先进事迹材料
2014/01/26 职场文书
模具专业自荐信
2014/05/29 职场文书
品牌服务方案
2014/06/03 职场文书
市场营销策划方案
2014/06/11 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
大国崛起观后感
2015/06/02 职场文书
食品安全主题班会
2015/08/13 职场文书
党员干部学习心得体会
2016/01/23 职场文书
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js