我有一个大小为ndarray
的numpy 112 * 92
。这基本上是使用cv2.imread
读取的灰度图像。由于其灰度,因此其最大值为255
。
我正在尝试使用phe paillier库对该数组进行加密:http://python-paillier.readthedocs.io/en/stable/usage.html#role-1
但是运行public_key.encrypt()
命令时出现错误:
Traceback (most recent call last):
File "/usr/lib/python3.5/code.py", line 91, in runcode
exec(code, self.locals)
File "<input>", line 1, in <module>
File "<input>", line 1, in <listcomp>
File "/usr/local/lib/python3.5/dist-packages/phe/paillier.py", line 169, in encrypt
encoding = EncodedNumber.encode(self, value, precision)
File "/usr/local/lib/python3.5/dist-packages/phe/encoding.py", line 176, in encode
% type(scalar))
TypeError: Don't know the precision of type <class 'numpy.uint8'>.
我尝试过使用float
和int64
,但除了最后一行的类更改外,我一直遇到相同的错误。
奇怪的是,如果我在其人工输入列表的网站上运行该示例,则该示例可以正常工作。我能理解的numpy数组和它们的示例之间的唯一区别是类型。
在检查器中签入时,其类型为int
,而我的类型为uint8
。
secret_number_list = [3.141592653, 300, -4.6e-12]
type(secret_number_list)
<class 'list'>
type(secret_number_list[1])
<class 'int'>
如果我对数组执行相同操作,则会得到:
type(image)
<class 'numpy.ndarray'>
type(image[0][0])
<class 'numpy.uint8'>
我尝试使用int
将其转换为image.astype(int)
,但是我得到了int64
类型,它在加密时给出了相同的错误。
是否可以将所有值转换为int
而不是int64
?
答案 0 :(得分:3)
据我所知(您可以在the sources here中看到它),您应该只传递int
或float
。因此,您需要将ndarray
转换为包含int
或float
项的嵌套列表。参见ndarray.tolist。
例如:
>>> a = np.array([[1, 2], [3, 4]])
>>> b = a.tolist()
>>> type(a)
<class 'numpy.ndarray'>
>>> type(b)
<class 'list'>
>>> type(a[0][0])
<class 'numpy.int64'>
>>> type(b[0][0])
<class 'int'>
答案 1 :(得分:2)
尝试使用列表推导生成python int 的嵌套列表,然后转换回numpy数组:
import numpy
import cv2
from phe import paillier
openfilename = "/path/to/image.jpg"
img = cv2.imread(openfilename,0)
public_key, private_key = paillier.generate_paillier_keypair()
encrypted_number_list = [[public_key.encrypt(int(x)) for x in row] for row in img]
encrypted_number_array = numpy.array(encrypted_number_list)
print(encrypted_number_array)
对于大图像,这将非常慢