通过PIL的fromarray将图像(.tif)存储为np.array [TypeError: 无法处理此数据类型][ValueError: int()的字面值无效]。

11 浏览
0 Comments

通过PIL的fromarray将图像(.tif)存储为np.array [TypeError: 无法处理此数据类型][ValueError: int()的字面值无效]。

更新

当我按照回答者的建议编写如下代码时:

with open('results.txt', 'a', encoding="utf-8") as f:
    for line in results:
        f.write(line)
        f.write('\n')

所有的文本片段都被正确地追加到result.txt中。但是当我进入命令提示符并执行以下操作时:

magick -density 288 text:"result.txt" -alpha off -compress Group4 filename1.tif

它会将result.txt中的所有字符作为图片创建filename1.tif


原问题:

这段代码访问了一个包含单页.tif文件的文件夹,并提取了文本数据。

data = []
data1 = []
listOfPages = glob.glob(r"C:/Users/name/folder/*.tif")
for entry in listOfPages:
    if os.path.isfile(entry):
        filenames = entry
    data1.append(filenames)
    text1 = pytesseract.image_to_string(
            Image.open(entry), lang="en"
        )
    text = re.sub(r'\n',' ', text1)     
    regex1 = re.compile(r'(www(i|ı)a\s+bbb(\:)?(\s+|\s+\.)?\s+(de(s|r(:)?))?)', flags = re.IGNORECASE)
    try:
        var1a = regex1.search(text)
        if var1a:
            var1 = var1a.group(1)
        else:
            var1 = None
    except:
        pass
    data.append([text, var1])
df0 = pd.DataFrame(data, columns =['raw_text', 'var1'])
df01= pd.DataFrame(data1,columns =['filename'])
df1 = pd.concat([df0, df01], axis=1)

我想调整它以使其适用于多页文件。因此,我试图通过Image.fromarray()进行转换,但出现了以下错误:

text1 = pytesseract.image_to_string(np.array(entry), lang="en")

或者

text1 = pytesseract.image_to_string(Image.fromarray(np.array(entry)), lang="en")

TypeError: Cannot handle this data type: (1, 1),

我使用的是python 3.9.7 pytesseract 0.3.8 numpy 1.21.2 pillow 8.3.2

我阅读了这个PIL TypeError: Cannot handle this data type

并提出了以下解决方法:

text1 = pytesseract.image_to_string(Image.fromarray(np.array(entry * 255).astype(np.uint8)), lang="en")

但是这给我带来了错误:ValueError: invalid literal for int() with base 10: 'C:/Users/name/folder/test\\fff.tifC:/Users/name/folder/test\\ddddd.tif

这暗示需要使用浮点数

但是当我执行以下操作时:

text1 = pytesseract.image_to_string(Image.fromarray(np.array(entry * 255).astype(np.float)), lang="en")

我得到了错误:ValueError: could not convert string to float: 'C:/Users/name/folder/test\\ffff.tif

exiftool 输出

文件类型:TIFF
文件类型扩展名:tif
MIME类型:image/tiff
Exif字节顺序:小端(Intel,II)
子文件类型:完整分辨率图像
图像宽度:2472
图像高度:3495
每样本位数:1
压缩:T6/Group 4 Fax
光度解释:黑色为零
阈值:无抖动或半色调
填充顺序:反转
图像描述:DN31
相机型号名称:SCA
带偏移量:(二进制数据90字节,请使用-b选项提取)
方向:水平(正常)
每像素样本数:1
每条带行数:213
条带字节计数:(二进制数据73字节,请使用-b选项提取)
X分辨率:300
Y分辨率:300
平面配置:厚块
T6选项:(无)
分辨率单位:英寸
软件:DACS Toolkit II
修改日期:1998:03:12 10:29:31
图像大小:2472x3495
百万像素:8.6

SO上的其他建议是

im = Image.fromarray((img[0] * 255).astype(np.uint8)) 如果图像是灰度图像,则需要传递一个2-D数组给PIL,即形状必须是h,w而不是h,w,1。

i = Image.open('image.png').convert('RGB')
a = np.asarray(i, np.uint8)
print(a.shape)
b = abs(np.fft.rfft2(a,axes=(0,1)))
b = np.uint8(b)
j = Image.fromarray(b)

默认情况下,它使用最后两个轴:axes=(-2,-1)。第三个轴表示RGB通道。相反,更有可能希望在空间轴上执行FFT,即axes=(0,1)

img = Image.fromarray(data[0][i].transpose(0,2).numpy().astype(np.uint8)) 通道维度将成为最后一个(而不是第一个)

0
0 Comments

问题出现的原因是在使用PIL库的fromarray方法将图像(.tif)存储到np.array时,出现了TypeError: Cannot handle this data type和ValueError: invalid literal for int()的错误。解决方法是将图像数据转换为合适的数据类型,确保数据可以被正确处理。

在给出的代码中,主要是对多页TIFF图像进行处理和识别文字。使用了pytesseract库进行文字识别,并使用正则表达式匹配特定的文字。代码首先使用glob模块获取所有需要处理的文件名,然后使用Image.open方法打开每个文件,并使用ImageSequence.Iterator方法遍历每个文件的每一页图像。在processPage函数中,使用pytesseract.image_to_string方法将图像转换为文字,并使用正则表达式搜索匹配的结果,将结果保存到results列表中。最后,使用join方法将结果以换行符连接起来输出。

在示例的输出中,展示了处理两个多页TIFF图像的结果。首先输出了正在处理的文件名,然后输出了每个文件的每一页的处理结果。

问题的提问者还询问了如何自动创建文件和批量处理的方法。回答者建议使用glob方法获取所有的文件名,并将其放入一个列表中进行处理。

在对话中还涉及了一些其他的内容,如代码的调试和测试方法等。

总结起来,问题的原因是在使用PIL库的fromarray方法将图像存储到np.array时,数据类型不匹配导致的错误。解决方法是将图像数据转换为合适的数据类型。整个对话主要围绕多页TIFF图像的处理展开,包括文件名获取、图像打开和处理结果输出等。同时还涉及了代码调试和测试方法的讨论。

0