我在业余时间处理一个小问题,包括分析通过显微镜获得的一些图像.这是一个带有一些东西的晶圆,最终我想制作一个程序来检测某些材料何时出现.
无论如何,第一步是规范化图像的强度,因为镜头不能提供均匀的闪电.目前,我使用的图像没有任何东西,只有基板,作为背景或参考图像.我找到了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() …Run Code Online (Sandbox Code Playgroud) 我正在玩一台使用Micro-Manager 1.4的显微镜相机.使用Python界面,我设法访问相机,更改曝光时间等,我可以捕获单个图像.
但是,每个图像作为NumPy数组返回,其中每个像素表示为单个整数,例如"7765869".据我所知,这在Java中被称为"BufferedImage",它意味着RGB值被编码为:
BufferedImage = R * 2^16 + G * 2^8 + B
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何使用例如Numpy或OpenCV将这种数组转换为更方便的数组,其中每个像素是uint8值的RGB三元组?不用说,转换应该尽可能高效.
我正在科学地使用显微镜中的图像,其中3个RGB通道中的每一个都被编码为uint16(0-65536).目前我使用OpenCV2和NumPy来处理图像,并使用标志"cv2.IMREAD_UNCHANGED"一切都可以正常阅读,我可以对图像做一些工作并将其返回到uint16,
img = cv2.imread('dummy.tif',cv2.IMREAD_UNCHANGED )
#do some work here
img = img.astype(numpy.uint16)
cv2.imwrite('processed.tif',img )
Run Code Online (Sandbox Code Playgroud)
但是,到目前为止,我似乎无法找到任何方法将处理后的图像再次保存为16位RGB.使用cv2.imwrite命令只需将图像转换为uint8,从而将所有内容都变为白色(即,所有内容都被截断为255,uint8通道的最大值).
知道怎么办吗?
我需要对大量图像进行一些快速阈值处理,每个RGB通道都有一个特定的范围,即去除(使黑色)不在[100; 110]中的所有R值,所有G值都不在[80; 85]和所有B值不在[120; 140]
使用到OpenCV的python绑定为我提供了一个快速阈值处理,但它将所有三个RGP通道阈值设置为单个值:
cv.Threshold(cv_im,cv_im,threshold+5, 100,cv.CV_THRESH_TOZERO_INV)
cv.Threshold(cv_im,cv_im,threshold-5, 100,cv.CV_THRESH_TOZERO)
Run Code Online (Sandbox Code Playgroud)
或者,我尝试通过将图像从PIL转换为numpy来手动完成:
arr=np.array(np.asarray(Image.open(filename).convert('RGB')).astype('float'))
for x in range(img.size[1]):
for y in range(img.size[0]):
bla = 0
for j in range(3):
if arr[x,y][j] > threshold2[j] - 5 and arr[x,y][j] < threshold2[j] + 5 :
bla += 1
if bla == 3:
arr[x,y][0] = arr[x,y][1] = arr[x,y][2] = 200
else:
arr[x,y][0] = arr[x,y][1] = arr[x,y][2] = 0
Run Code Online (Sandbox Code Playgroud)
虽然这是按预期工作的,但速度非常慢!
关于如何快速实现这一点的任何想法?
非常感谢,Bjarke