我正在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)
我认为这一定与中位数和img2的尺寸不同有关,但我感到困惑,因为它们本身显示还可以。抱歉,我的屏幕截图切断了“一起”窗口的位置。我使用灰度,是因为据我所知,该dct一次只能在一个通道上工作。
最佳答案
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
编辑:
最后一件事。我不想一并使用除以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
关于python - 为什么我的灰度图像以黑白显示?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28448276/