【发布时间】:2021-10-30 08:52:12
【问题描述】:
更新 当我写的时候(正如回答者所说)
with open('results.txt', 'a', encoding="utf-8") as f:
for line in results:
f.write(line)
f.write('\n')
所有文本都正确附加到result.txt。但是当我进入 cmd 并执行
magick -density 288 text:"result.txt" -alpha off -compress Group4 filename1.tif
它会创建filename1.tif,并将所有result.txt 字符作为图片。
原问题: 此代码访问单页 .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), <U52
我用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 输出
File Type : TIFF
File Type Extension : tif
MIME Type : image/tiff
Exif Byte Order : Little-endian (Intel, II)
Subfile Type : Full-resolution image
Image Width : 2472
Image Height : 3495
Bits Per Sample : 1
Compression : T6/Group 4 Fax
Photometric Interpretation : BlackIsZero
Thresholding : No dithering or halftoning
Fill Order : Reversed
Image Description : DN31
Camera Model Name : SCA
Strip Offsets : (Binary data 90 bytes, use -b option to extract)
Orientation : Horizontal (normal)
Samples Per Pixel : 1
Rows Per Strip : 213
Strip Byte Counts : (Binary data 73 bytes, use -b option to extract)
X Resolution : 300
Y Resolution : 300
Planar Configuration : Chunky
T6 Options : (none)
Resolution Unit : inches
Software : DACS Toolkit II
Modify Date : 1998:03:12 10:29:31
Image Size : 2472x3495
Megapixels : 8.6
关于 SO 的其他建议是
im = Image.fromarray((img[0] * 255).astype(np.uint8))如果你的图片是灰度的,你需要给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)) 频道维度将是最后一个(而不是第一个)
【问题讨论】:
-
肯定
entry是文件名而不是 Numpy 数组? -
对于每个循环,
entry是不同的文件名,是的。否则我会得到不同的错误描述 -
你不能用
np.array(entry*255)将文件名变成Numpy数组 -
我可以建议您在您的 TIFF 上运行
exiftool以检查它们是单通道(灰度)还是彩色,它们是整数还是浮点数等等?然后请将一个 TIFF 的输出粘贴到您的问题中(而不是 cmets)。谢谢。 -
根据我从其他帖子中了解到的情况,从文件名创建数组时会出现问题
标签: numpy python-imaging-library tiff python-tesseract