为什么我的灰度图像显示为黑白?

时间:2015-02-11 06:56:07

标签: python opencv numpy

我正在opencv中进行一些测试,查看模糊和离散余弦变换的结果(每个循环增加内核大小)。我想在同一帧中显示图像和dct结果,以便我可以进行比较。

当我在不同的框架中显示它们时,它们看起来很好。但是当我使用np.hpstack或np.concatenate来显示模糊图像和dct时,灰度图像变得非常阈值。我可以看到内核大小为1的黑色,但之后在我的循环中它几乎变成了白色。

import cv2
import numpy as np
img = cv2.imread('lena.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

for i in xrange(1,31,2):
    median_blur = cv2.medianBlur(img,i)
    string = 'median_blur : kernel size - '+str(i)
    imf = np.float32(median_blur)/255.0  # float conversion/scale
    dst = cv2.dct(imf)           # the dct
    img2 = np.uint8(dst)*255.0    # convert back
    cv2.putText(median_blur,string,(20,20),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,0,0))
    vis = np.hstack([median_blur,img2])

    cv2.imshow('Blur',median_blur)
    cv2.imshow('dct',img2)
    cv2.imshow('together', vis)
    cv2.waitKey(500)

enter image description here

我认为它必须与median_blur和img2有不同的维度,但我很困惑,因为它们自己显示确定。对不起,但是我的屏幕截图一起切断了一些'窗口。我使用的是灰度,因为据我所知,dct一次只能在一个通道上工作。

1 个答案:

答案 0 :(得分:1)

dct结果仍然是float64,因为它乘以255.0而不是255。

通过查看numpy数组的维度和数据类型来诊断问题:

print median_blur.shape, median_blur.dtype
print img2.shape, img2.dtype
print vis.shape, vis.dtype

最初我有:

(512, 512) uint8
(512, 512) float64
(512, 1024) float64

然后将img2 = np.uint8(dst)*255.0更改为img2 = np.uint8(dst)*255后,我得到了:

(512, 512) uint8
(512, 512) uint8
(512, 1024) uint8

enter image description here

编辑:

最后一件事。我不想使用除以255和* 255的除法!消除它们给了我想要的dct。现在你可以精美地看到不同模糊滤镜对dct的影响。

imf = np.float32(blur)  # float conversion (NO scale)
dst = cv2.dct(imf)           # the dct
img2 = np.uint8(dst)    # convert back to unsigned 8bit image

enter image description here