当我尝试运行此代码以在Dropbox link上使用笔触宽度变换算法时,出现此错误: D:/swt_up.py,第305行,以_find_letters
fulllayer = np.zeros((shape_w,shape_h),dtype = np.uint16)
内存错误
def _find_letters(swt, shapes, shape_h, shape_w):
# STEP: Discard shapes that are probably not letters
swts = []
heights = []
widths = []
topleft_pts = []
images = []
for label,layer in shapes.items():
#print(label)
#print((layer[0],layer[1]))
(nz_y, nz_x) = (layer[0],layer[1])
east, west, south, north = max(nz_x), min(nz_x), max(nz_y), min(nz_y)
width, height = east - west, south - north
if width < 4 or height < 4:
continue
if width / height > 10 or height / width > 10:
continue
diameter = math.sqrt(width * width + height * height)
median_swt = np.median(swt[(nz_y, nz_x)])
#if diameter / median_swt > 10:
# continue
#if width / shape_w > 0.4 or height / shape_h > 0.4:
# continue
#if diagnostics:
# print (" written to image.")
# print(layer )
# cv2.imwrite('layer'+ str(label) +'.jpg', layer*255)
# we use log_base_2 so we can do linear distance comparison later using k-d tree
# ie, if log2(x) - log2(y) > 1, we know that x > 2*y
# Assumption: we've eliminated anything with median_swt == 1
swts.append([math.log(median_swt, 2)])
heights.append([math.log(height, 2)])
topleft_pts.append(np.asarray([north, west]))
widths.append(width)
fulllayer = np.zeros((shape_w, shape_h), dtype=np.uint16)
for i in range(len(layer[0])):
fulllayer[layer[0][i], layer[1][i]] = 1
images.append(fulllayer)
return swts, heights, widths, topleft_pts, images
我该如何解决这个问题?我找不到任何错误,也许该错误来自Window OS,但我不知道如何解决。
谢谢
答案 0 :(得分:0)
内存错误
我该如何解决这个问题?
在较低分辨率的灰度图像上运行, 或在水平小的图像带上, 如果增加可用内存不可行。
答案 1 :(得分:0)
您的电脑有多少RAM?在过去,我尝试过相同的代码,经过一番疯狂之后,我意识到具有4GB RAM的Windows 10计算机无法使用完。
我发现了以下问题,当代码“过滤”字母时,它开始为每个真实字母创建一个具有与原始图像相同大小的图像,其中该层的所有像素均设置为1,另一个为零。因此,如果图像中最后有100个字母,则会在图像中为每个字母创建100个副本。这是一台PC的空间。
我解决了这个问题,只需更改一点代码即可。对于该图层,我存储了属于该图层的坐标的列表,当我使用它时,我会创建一个“地图”,然后在转到下一个地图时销毁它。 这是我从您显示的GitHub/GoldMyr1994/IDTEXT
相同的代码开始实现的代码现在我开始尝试在看代码之前可以尝试另一件事。 我看到这行
fulllayer = np.zeros((shape_w, shape_h), dtype=np.uint16)
但是我认为您只需要一个布尔映射,因此可以尝试将类型设置为np.bool,并希望您保存的内存足以达到代码的结尾。