【问题标题】:Image Type conversion with OpenCV imwrite使用 OpenCV imwrite 进行图像类型转换
【发布时间】:2018-01-05 13:31:14
【问题描述】:

我正在使用以下代码计算图像的 DCT:

img = cv2.imread(imgName,0)
imf = np.float32(img)
dctimg = cv2.dct(imf)

问题是当使用 OpenCV 的 imwrite 函数保存图像时,我得到了所需的输出。

cv2.imwrite('output-dct.png',dctimg)

但是在使用 matplotlib 保存为 plt.imshow(dctimg, cmap='gray') 时,我得到了一个完全黑色的图像。

我了解 OpenCV 正在将其转换为 8 位图像。所以我尝试使用规范化来做同样的事情

cv2.normalize(orgDct, dctimg,alpha=0, beta=1, 
                           norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
dctimg = np.uint8(dctimg)*255
plt.imshow(dctimg, cmap='gray')

但结果不一样。

使用matplotlib绘图时如何达到imwrite同样的效果?

【问题讨论】:

  • 规范化错误 - 您将范围设置为 0-1 和数据类型 CV_8U。后面的行没有意义,直接归一化到 0-255 范围内即可。

标签: python image opencv matplotlib


【解决方案1】:

我使用了imshow 函数的vminvmax 参数。它可以根据需要提供与 OpenCV 的 imwrite 等效的 DCT 图像。

所以程序看起来像这样:

img = cv2.imread(imgName,0)
imf = np.float32(img)
dctimg = cv2.dct(imf)
plt.imshow(dctimg, cmap='gray', vmin = 0, vmax = 255)

这是上面代码的输出:

【讨论】:

    【解决方案2】:

    你错了:

    dctimg = np.uint8(dctimg)*255
    

    应该是

    dctimg = np.uint8(dctimg*255)
    

    因为假设您的 dctimg 的值介于 0.0 和 1.0 之间,您的代码只会将最高值转换为 1,将其余值转换为 0,然后将结果乘以 255——“几乎无处不在”产生 0。

    另外,请确保您的 DCT 实际上只产生正值。我认为通常情况并非如此。

    【讨论】:

    • 是的,这无济于事,但问题甚至更早 - dtype=cv2.CV_8U 当规范化到 0 和 1 之间的范围时。所以它已经只是 1 和 0,转换为 @987654324 @ 可能是多余的。
    猜你喜欢
    • 2020-03-17
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多