小编Hap*_*ppy的帖子

使用Python + PIL对图像进行强度归一化 - 速度问题

我在业余时间处理一个小问题,包括分析通过显微镜获得的一些图像.这是一个带有一些东西的晶圆,最终我想制作一个程序来检测某些材料何时出现.

无论如何,第一步是规范化图像的强度,因为镜头不能提供均匀的闪电.目前,我使用的图像没有任何东西,只有基板,作为背景或参考图像.我找到了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)

python normalization python-imaging-library

7
推荐指数
1
解决办法
2万
查看次数

在Python中将单个整数像素的数组转换为RGB三元组

我正在玩一台使用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三元组?不用说,转换应该尽可能高效.

python camera opencv numpy

7
推荐指数
1
解决办法
2792
查看次数

Python:如何使用16位通道保存图像(例如48 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通道的最大值).

知道怎么办吗?

python opencv

5
推荐指数
1
解决办法
7683
查看次数

Python中的快速RGB阈值处理(可能是一些智能的OpenCV代码?)

我需要对大量图像进行一些快速阈值处理,每个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

python rgb opencv threshold

4
推荐指数
2
解决办法
9701
查看次数