解决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 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
python实现壁纸批量下载代码实例
Jan 25 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
浅析Python 读取图像文件的性能对比
Mar 07 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
使用python计算三角形的斜边例子
Apr 15 Python
如何在sublime编辑器中安装python
May 20 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
python numpy中setdiff1d的用法说明
Apr 22 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类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
jquery延迟对象解析
2016/10/26 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
python getpass模块用法及实例详解
2019/10/07 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
个人自我鉴定怎么写
2013/10/28 职场文书
英语专业毕业生自我鉴定
2013/11/09 职场文书
关于期中考试的反思
2014/02/02 职场文书
承诺书的格式范文
2014/03/28 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
青春奉献演讲稿
2014/05/08 职场文书
电影雨中的树观后感
2015/06/15 职场文书
医院病假条范文
2015/08/17 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers