我有以下图像阈值处理代码,使用Bradley-Roth图像阈值方法。
from PIL import Image
import copy
import time
def bradley_threshold(image, threshold=75, windowsize=5):
ws = windowsize
image2 = copy.copy(image).convert('L')
w, h = image.size
l = image.convert('L').load()
l2 = image2.load()
threshold /= 100.0
for y in xrange(h):
for x in xrange(w):
#find neighboring pixels
neighbors =[(x+x2,y+y2) for x2 in xrange(-ws,ws) for y2 in xrange(-ws, ws) if x+x2>0 and x+x2<w and y+y2>0 and y+y2<h]
#mean of all neighboring pixels
mean = sum([l[a,b] for a,b in neighbors])/len(neighbors)
if l[x, y] < threshold*mean:
l2[x,y] = 0
else:
l2[x,y] = 255
return image2
i = Image.open('test.jpg')
windowsize = 5
bradley_threshold(i, 75, windowsize).show()
当windowsize
较小且图像较小时,此方法工作得很好。我一直在使用这张图片进行测试:
当使用窗口大小为5的时候,我遇到了大约5到6秒的处理时间,但是如果我将窗口大小增加到20,并且算法在每个方向上检查20个像素的平均值,我就会得到该图像的时间超过1分钟。
如果我使用一个大小为2592x1936的图像,而窗口大小仅为5,则需要近10分钟才能完成。
那么,我该如何改善这些时间呢?numpy数组会更快吗?im.getpixel是否比将图像加载到像素访问模式更快?有没有其他的提速小贴士?提前谢谢。
https://stackoverflow.com/questions/33091755
复制相似问题