解决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卸载模块的方法汇总
Jun 07 Python
python3.x实现发送邮件功能
May 22 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
python基础 range的用法解析
Aug 23 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
Python程序暂停的正常处理方法
Nov 07 Python
jupyter 使用Pillow包显示图像时inline显示方式
Apr 24 Python
Selenium自动化测试工具使用方法汇总
Jun 12 Python
python如何调用java类
Jul 05 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
python字符串常规操作大全
May 02 Python
让文件路径提取变得更简单的Python Path库
May 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输出数组中重名的元素的几种处理方法
2012/09/05 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
JObj预览一个JS的框架
2008/03/13 Javascript
Jquery 基础学习笔记
2009/05/29 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
python实现月食效果实例代码
2019/06/18 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
详解Python 中的容器 collections
2020/08/17 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
仓库班组长岗位职责
2013/12/12 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
亮剑观后感500字
2015/06/05 职场文书
法制教育观后感
2015/06/17 职场文书
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python