【发布时间】:2011-11-17 08:14:08
【问题描述】:
我在业余时间处理一个小问题,包括分析通过显微镜获得的一些图像。它是一个到处都有一些东西的晶圆,最终我想制作一个程序来检测某些材料何时出现。
无论如何,第一步是标准化整个图像的强度,因为镜头不会产生均匀的闪电。目前我使用一张没有任何东西的图像,只有基板作为背景或参考图像。我找到了 RGB 的三个(强度)值中的最大值。
from PIL import Image
from PIL import ImageDraw
rmax = 0;gmax = 0;bmax = 0;rmin = 300;gmin = 300;bmin = 300
im_old = Image.open("test_image.png")
im_back = Image.open("background.png")
maxx = im_old.size[0] #Import the size of the image
maxy = im_old.size[1]
im_new = Image.new("RGB", (maxx,maxy))
pixback = im_back.load()
for x in range(maxx):
for y in range(maxy):
if pixback[x,y][0] > rmax:
rmax = pixback[x,y][0]
if pixback[x,y][1] > gmax:
gmax = pixback[x,y][1]
if pixback[x,y][2] > bmax:
bmax = pixback[x,y][2]
pixnew = im_new.load()
pixold = im_old.load()
for x in range(maxx):
for y in range(maxy):
r = float(pixold[x,y][0]) / ( float(pixback[x,y][0])*rmax )
g = float(pixold[x,y][1]) / ( float(pixback[x,y][1])*gmax )
b = float(pixold[x,y][2]) / ( float(pixback[x,y][2])*bmax )
pixnew[x,y] = (r,g,b)
代码的第一部分逐像素确定背景图像的红色、绿色和蓝色通道的最大强度,但只需执行一次。
第二部分采用“真实”图像(上面有东西),并根据背景逐像素标准化红色、绿色和蓝色通道。这需要一些时间,一张 1280x960 的图像需要 5-10 秒,如果我需要对多张图像执行此操作,这太慢了。
我能做些什么来提高速度?我想过将所有图像移动到 numpy 数组中,但我似乎无法为 RGB 图像找到快速的方法。 我宁愿不要离开 python,因为我的 C++ 是相当低级的,并且获得一个工作的 FORTRAN 代码可能需要比我在速度方面节省的时间更长:P
【问题讨论】:
-
这可能比这里更属于codereview.stackexchange.com。
-
@S.Lott,我认为这是一个灰色地带。问题毕竟是关于特定技术的。
-
@Mark Ransom:“特定技术”是如何让它变灰的?是代码。待审核。
-
@S.Lott,也许你是对的,毕竟它不是灰色的。我刚刚重新阅读了常见问题解答,我看不出这个问题有任何问题。
-
@Bjarke:你考虑过 OpenCV 吗?它是一个带有 Python 绑定的强大图像处理库。它的读写速度很快,并且具有例如自适应阈值算法。
标签: python normalization python-imaging-library