解决numpy矩阵相减出现的负值自动转正值的问题
问题描述
今天在使用Numpy中的矩阵做相减操作时,出现了一些本应为负值的位置自动转换为了正值,
观察发现转换后的正值为原本的负值加上256得到,具体情况如下:
正常情况矩阵相减样例如下
>>>importnumpyasnp >>>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-415]
错误代码如下:
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])
得到的结果值如下:
[[173171169171174179181182180180]] [[172172172173173174174173171168]] [[255132255251249247247244]]
解决方案
以上出现的矩阵相减得到的结果值自动转换的问题是因为直接通过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])
输出结果为
[[141143144...909068] [139141141...889068] [140141140...879068] ... [525252...858381] [525252...858381] [525252...858381]] ==================================== [[171173172...10610784] [169171169...10610786] [169170169...10710988] ... [404043...686664] [404043...686664] [404043...686664]] ==================================== [[226226228...240239240] [226226228...238239238] [227227227...236237236] ... [12129...171717] [12129...171717] [12129...171717]]
可以看得出来,虽然两个矩阵相减,但是理应为负值的元素却像是取模了一般又变为了正数(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))
结果显示为:
[[141143144...909068] [139141141...889068] [140141140...879068] ... [525252...858381] [525252...858381] [525252...858381]] ==================================== [[171173172...10610784] [169171169...10610786] [169170169...10710988] ... [404043...686664] [404043...686664] [404043...686664]] ==================================== [[-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矩阵相减出现的负值自动转正值的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。