通过PIL的fromarray将图像(.tif)存储为np.array [TypeError: 无法处理此数据类型][ValueError: int()的字面值无效]。
通过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))
通道维度将成为最后一个(而不是第一个)
问题出现的原因是在使用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图像的处理展开,包括文件名获取、图像打开和处理结果输出等。同时还涉及了代码调试和测试方法的讨论。