python中无符号整型数据的减法运算

一、问题描述


cv2.imread读入图像,并显示读入图像间的残差热图,获取的结果明显不是我们想要的结果。

import matplotlib.pyplot as plt
import numpy as np
import cv2
import seaborn as sns

dirpath = r"C:/Users/zhang/Desktop/testResult/ImageQuality/Image/DuiBi49_13/"
CBCT0 = cv2.imread(dirpath + 'CBCT.png')
PCT0 = cv2.imread(dirpath + 'PCT.png')
SPCT0 = cv2.imread(dirpath + 'MindCg.png')

CPerr = CBCT-PCT
SPerr = SPCT-PCT

热图中显示的像素值有大量的200以上的像素值,与我预期想得到的很不一样。

二、解决


查看读取的图像的数据类型是uint8类型的,无符号整型的数据求差,我们将问题简化一下:

import numpy as np

a = np.uint8([1,2,3,4,5])
b = np.uint8([5,4,3,2,1])
e = a - b
print(e)

 这[252,254,0,2,4]显然不是我们想要的结果[-4,-2,02,4],主要是因为无符号整型的运算:就是那些源码、反码、补码的那些知识。那我们可以将a,b转换为有符号整型吗:

import numpy as np

a = np.uint8([1,2,3,4,5])
b = np.uint8([5,4,3,2,1])
c = int(a)
b = int(b)
e = c - d
print(e)

 没有查询到python中的无符号整型如何强制类型转换成有符号数,但是我们分情况处理仍然能解决,记录一下:

import numpy as np

a = np.uint8([1,2,3,4,5])
b = np.uint8([5,4,3,2,1])

n = len(a)
e = [1]*n
for i in range(n):
    if a[i] >= b[i]:
        e[i] = a[i] - b[i]
    else:
        e[i] = (a[i] -b[i]) - 256
print(e)

 应用到开始的图像上:

import matplotlib.pyplot as plt
import numpy as np
import cv2
import seaborn as sns

dirpath = r"C:/Users/zhang/Desktop/testResult/ImageQuality/Image/DuiBi49_13/"
CBCT0 = cv2.imread(dirpath + 'CBCT.png')
PCT0 = cv2.imread(dirpath + 'PCT.png')
SPCT0 = cv2.imread(dirpath + 'MindCg.png')

CPerr = [[1 for i in range(256)] for i in range(256)]
SPerr = [[1 for i in range(256)] for i in range(256)]
for i in range(256):
    for j in range(256):
        if CBCT[i][j] >= PCT[i][j]:
            CPerr[i][j] = CBCT[i][j] - PCT[i][j]
        else:
            CPerr[i][j] = (CBCT[i][j] - PCT[i][j]) - 256

for i in range(256):
    for j in range(256):
        if SPCT[i][j] >= PCT[i][j]:
            SPerr[i][j] = SPCT[i][j] - PCT[i][j]
        else:
            SPerr[i][j] = (SPCT[i][j] - PCT[i][j]) - 256

cmap = sns.diverging_palette(0,230,90,60,as_cmap=True)
plt.subplot(2,3,1)
plt.imshow(PCT0)
plt.subplot(2,3,2)
plt.imshow(CBCT0)
plt.subplot(2,3,3)
plt.imshow(SPCT0)
plt.subplot(2,2,3)
sns.heatmap(CPerr,vmin=-100,vmax=100,cmap=cmap)
plt.subplot(2,2,4)
sns.heatmap(SPerr,vmin=-100,vmax=100,cmap=cmap)
plt.tight_layout()
plt.show()

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python ,整数类型是动态类型,可以自动转换为长整型。如果你的整数超出了普通整数的范围,Python 会自动将其转换为长整型。你也可以使用 `long()` 函数来将一个整数转换为长整型,例如: ``` a = 123456789012345678901234567890 print(type(a)) # <class 'int'> b = long(123456789012345678901234567890) print(type(b)) # <class 'int'> ``` 在 Python 3 ,`long()` 函数已经被移除,整数类型可以表示任意大小的整数。 ### 回答2: Python的长整型变量是一种用于存储较大整数的数据类型。在Python 2.x版本,有int和long两种整数类型,其int类型可以存储有符号整数的取值范围为-2^31到2^31-1,而long类型则可以存储更大范围的整数。而在Python 3.x版本,不再区分int和long类型,统一使用int类型,但可以存储任意大小的整数。 当整数超过int类型的取值范围时,Python会自动将其转换为长整型,以便能够存储更大的整数。可以使用内置函数type()来查看一个变量的数据类型,例如type(1234567890)会返回<class 'int'>,而type(12345678901234567890)则会返回<class 'int'>。 在进行长整型变量的计算时,Python会自动处理溢出问题,不需要手动进行处理。因为Python的长整型变量可以动态地调整大小,所以理论上可以存储无限大的整数。当进行大数计算时,长整型变量的运算速度会比较慢,因为它需要动态分配更多的内存空间。 使用长整型变量时,可以直接进行基本的数学运算,例如加法、减法、乘法和除法等。另外,还可以使用内置函数来进行一些特殊的运算,例如求幂运算(pow())、取模运算(mod())和求绝对值(abs())等。 总之,Python的长整型变量提供了一种方便灵活的方式来存储和处理较大的整数,为数值计算和科学研究提供了很大的便利。 ### 回答3: 在Python,长整型变量是一种用于表示长整数的数据类型。长整型变量可以存储任意大小的整数值,而不会受到内存限制的影响,因此可以用来处理非常大的整数。 在Python 2.x版本,长整型变量需要显式地指定为`long`数据类型,例如`x = long(1000000000000)`。而在Python 3.x版本,长整型变量会自动处理,无需指定特定的数据类型,例如`x = 1000000000000`。 长整型变量支持与其他数值类型的运算,可以进行加减乘除等基本算术运算,也可以进行位运算和比较运算。例如,可以使用`x + y`进行两个长整型变量的相加运算,或者使用`x * y`进行两个长整型变量的相乘运算。 此外,长整型变量还支持一些内置函数和方法,用于对长整型变量进行操作和转换。例如,可以使用`abs(x)`函数获取长整型变量的绝对值,或者使用`int(x)`函数将长整型变量转换为普通整数。 需要注意的是,由于长整型变量对内存使用较大,所以在进行大规模计算时可能会影响运行速度。此时,可以考虑使用其他的数据结构和算法来替代长整型变量的使用,以提高程序的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值