有关于python数字图像处理出现矩阵相减没有负数(值都在0-255)的情况分析

有关于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.]]

综上所述,在遇到矩阵不明数值类型的时候可以指定其类型,之后矩阵元素就会以这样的数值类型进行计算。

你可能感兴趣的:(有关于python数字图像处理出现矩阵相减没有负数(值都在0-255)的情况分析)