解决numpy矩阵相减出现的负值自动转正值的问题
作者:木易依 发布时间:2021-10-07 19:49:16
问题描述
今天在使用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.]]
综上所述,在遇到矩阵不明数值类型的时候可以指定其类型,之后矩阵元素就会以这样的数值类型进行计算。
来源:https://blog.csdn.net/Noonebirdyou/article/details/83547244


猜你喜欢
- 不难,代码总共也就25行,大致逻辑如下。总共分为是下面两步在云服务器上部署自定义消息处理服务这里需要我们自定义来处理用户发送过来的消息首先导
- 目录1. 警告不是异常2. 警告能捕获吗3. 捕获警告方法一4. 捕获警告方法二5. 捕获警告方法三1. 警告不是异常你是不是经常在使用一些
- 1.确保系统中有依赖的libaio 软件,如果没有: yum -y
- 一般事件事件浏览器支持描述onClickHTML: 2 | 3 | 3.2 |
- 验证码制作#string模块自带数字、字母、特殊字符变量集合,不需要我们手写集合import stringimport randomimpo
- Python是一门简单易学的编程语言。阅读好的Python程序感觉就像阅读英语,尽管是非常严格的英语。Python的这种伪代码特性是其最大强
- 从我们论坛中收集了这段HTML制作页面需要最大化、最小化时可以借鉴参考。最大化效果:<OBJECT id="max
- 前一段时间有发过一个简单的JMAIL邮件发邮件的代码,今天就把这个代码做一个具体的注解,并增加了另外两个格式的代码,并举几个简单
- 相信做过自动化运维的同学都用过REST API接口来完成某些动作。API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化
- 一、在控制器中引用:use cache;二、基本方法及使用1、put() 键 值 有效时间(分钟)Cache::put('key1&
- 这篇文章主要介绍了Python pygame绘制文字制作滚动文字过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 简介说明本文用示例介绍Vuex的五大核心之一:actions。官网Action | VuexAPI 参考 | Vuexactions概述说明
- 本文实例代码主要实现的是python遍历文件目录的操作,有三种方法,具体代码如下。#coding:utf-8 # 方法1:递归遍历目录 im
- 本文实例讲述了Python使用MD5加密算法对字符串进行加密操作。分享给大家供大家参考,具体如下:# encoding: utf-8from
- JavaScript Length 字符长度函数,在很多时间我们会用length函数了,因为你得前台判断一个用户输入
- 引言caffe是C++语言写的,可能很多人不太熟悉,因此想用更简单的脚本语言来实现。caffe提供matlab接口和python接口,这两种
- 一个封装好的链接Oracle数据库的工具类,可以方便的获取Connection对象关闭Statement、ResultSet、Statmen
- 打开SQL Server企业管理器,突然弹出一个窗口,内容是: 错误提示: “Microsoft Management Console ——
- 语言原生的map存在2个问题:1)不是线程安全的;2)数据量大时候需要尽量避免使用string等,GC压力很大;有人使用泛型实现了相关的co
- GO语言结构体方法跟结构体指针方法的区别首先,我定了三个接口、一个结构和三个方法:type DeptModeA interface {Nam