Python分割文本图像为单行图像时生成全黑图像的问题
文本行图像分割全黑问题的原因与修复
核心问题分析
你遇到的全黑图像问题,本质是数据类型不匹配+数组维度逻辑错误共同导致的:
数据类型错误
你初始化的cut_imgs是默认的float64浮点数组,存入整数后变成浮点值(比如100.0)。后续用astype(int)转成的是int32类型,但PIL处理灰度图时,仅支持uint8类型(0-255范围的无符号整数)。int32数组会被PIL错误解析,导致原本的非零数值无法正常显示,最终全黑。维度逻辑错误
cut_imgs定义为[200, 1000, 500],意味着每个分割后的图像是1000行×500列,但你实际需要的是单文本行的图像(1行×原图像宽度)。当前逻辑把原图像的多行数据存入同一个cut_imgs[c]的不同行,导致每个分割图像大部分区域都是0(黑色),视觉上接近全黑。
修复方案
方案1:简化逻辑(推荐)
直接筛选非空行并保存,避免复杂的索引操作:
import numpy as np from PIL import Image import sys np.set_printoptions(threshold=sys.maxsize) img = Image.open("C:/Users/name/Desktop/Pytorch AI/download.png") img_data = np.array(img) # 二值化处理,直接转为uint8类型 img_data = np.where(img_data > 10, 100, 0).astype(np.uint8) # 计算每行像素和,提取非空行 row_sums = np.sum(img_data, axis=1) non_empty_rows = img_data[row_sums != 0] # 逐行保存 for idx, row in enumerate(non_empty_rows): # 将单行转为(1, 宽度)的数组,符合灰度图格式 row_img = row.reshape(1, -1) Image.fromarray(row_img).save(f'C:/Users/name/Desktop/Pytorch AI/row_{idx}.png')
方案2:修改原代码的问题点
如果要保留原逻辑,需修正数据类型和维度:
import numpy as np from PIL import Image import tensorflow as tf import sys np.set_printoptions(threshold=sys.maxsize) img = Image.open("C:/Users/name/Desktop/Pytorch AI/download.png") img_data = np.array(img) # 初始化时指定uint8类型,避免浮点转换 cut_imgs = np.zeros([200, img_data.shape[1]], dtype=np.uint8) # 二值化处理 img_data = np.where(img_data > 10, 100, 0).astype(np.uint8) z = np.sum(img_data, axis=1) c = 0 d = 0 for a in img_data: if z[d] != 0: # 直接将整行存入cut_imgs[c],而非cut_imgs[c][d] cut_imgs[c] = a c += 1 d += 1 # 只保存有内容的行,避免空图像 for g in range(c): # 转为(1, 宽度)的数组,确保PIL正确识别为灰度图 img1 = Image.fromarray(cut_imgs[g].reshape(1, -1)) img1.save(f'C:/Users/name/Desktop/Pytorch AI/{g}.png')
关于“乘以100修复”的原因
你提到的乘以100能临时解决,是因为浮点值放大后转int得到的数值更大,若此时PIL误将数组解析为16位灰度图(支持0-65535范围),较大的数值才能被显示。但这是治标不治本的方法,核心还是要保证数组类型为uint8,且维度符合图像要求。
内容的提问来源于stack exchange,提问作者Christopher Cabit
相关产品推荐
相关产品推荐

