1

我正在使用 python 使用 opencv 编写 pgm,如下所示...

   cv.SaveImage("a.pgm",np.array(image.astype(np.uint16)))

所以,我将我的数据转换为无符号 16 位。问题是在写入pgm时灰度级的最大值设置为65535,我的数据最大值为1103。

我的猜测是,当我们在 opencv 中保存 pgms 时,该值由数据类型计算并设置为最大值,而不是基于实际数据。

有人可以帮忙告诉如何做到这一点,以便写入最大灰度的正确值。

非常感谢。

4

2 回答 2

0

在保存之前,您只需要将图像乘以转换因子。在您的情况下,因素将是65535 / 1103. 您可以使用ConvertScale来执行此操作,它允许您通过一个标量来倍增一个数组。像这样:

cv.ConvertScale(im, im, scale=65535 / 1103.0)
于 2012-05-14T13:36:46.850 回答
0

这有点hacky,使用风险自负。如果 OpenCV 可以本地解决这个问题,我会更喜欢。如果您没有完全填充 16 位范围(Irfanview 中的低对比度等),默认实现会导致各种麻烦。

def write_pgm_realmax(path, img):
    maxval = img.max()
    cv2.imwrite(path, img)
    with open(path, 'rb') as fid:
        s = fid.read()
    # the 1 makes sure we replace only the first occurrence.
    s = s.replace(b'\n65535\n', b"\n" + str(maxval) + "\n", 1)
    with open(path, 'wb') as fid:
        fid.write(s)

该代码可能不是超级健壮,也不是非常高性能,但它是一个开始的地方。它使用 OpenCV 保存 pgm,然后再次打开文件并将第一个单行字符串“65535”(最大可能的 uint16 值)替换为实际最大值。

于 2018-10-08T09:48:40.843 回答