有关于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.]]
综上所述,在遇到矩阵不明数值类型的时候可以指定其类型,之后矩阵元素就会以这样的数值类型进行计算。