解决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中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
使用Python实现租车计费系统的两种方法
Sep 29 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
python给微信好友定时推送消息的示例
Feb 20 Python
Django 大文件下载实现过程解析
Aug 01 Python
django认证系统实现自定义权限管理的方法
Aug 28 Python
Python requests.post方法中data与json参数区别详解
Apr 30 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
浅谈Python 命令行参数argparse写入图片路径操作
Jul 12 Python
scrapy-splash简单使用详解
Feb 21 Python
Python开发简易五子棋小游戏
May 02 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中函数内引用全局变量的方法
2008/10/20 PHP
php 无限级缓存的类的扩展
2009/03/16 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
一个PHP分页类的代码
2011/05/18 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
Postman模拟发送带token的请求方法
2018/03/31 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
python生成特定分布数的实例
2019/12/05 Python
Python tkinter常用操作代码实例
2020/01/03 Python
Python requests获取网页常用方法解析
2020/02/20 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
python如何调用php文件中的函数详解
2020/12/29 Python
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
毕业生找工作求职信
2014/08/05 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
导游词之包公祠
2019/11/25 职场文书
Vue的过滤器你真了解吗
2022/02/24 Vue.js
JavaScript中reduce()的用法
2022/05/11 Javascript