2017-07-29 121 views
0

我用下面的代码来计算图像的DCT:图像类型转换用的OpenCV imwrite

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

的问题是保存与OpenCV的的imwrite功能的图像时,我发现了期望的输出。

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

enter image description here

不过,虽然与matplotlib为plt.imshow(dctimg, cmap='gray')节省我得到全黑图像。
enter image description here

我知道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') 

但是结果并不一样。
enter image description here
如何在使用matplotlib绘图时达到与imwrite相同的效果?

+0

正常化是错误的 - 你设定的范围,以0-1和数据类型CV_8U。该行之后的行是毫无意义的,只是直接规范化到范围0-255。 –

回答

0

我使用了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) 

这里是上面代码的输出:
enter image description here

0

你犯了一个错误:

dctimg = np.uint8(dctimg)*255 

也许应该

dctimg = np.uint8(dctimg*255) 

,因为假设你dctimg的值是0.0到1.0之间,你的代码将只极高转换值为1,其余为0,然后将结果乘以255 - 几乎在任何地方产生0。

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

+1

是的,这没有什么帮助,但问题甚至更早 - 当标准化为0到1之间的范围时,“dtype = cv2.CV_8U”。因此,它只是一个和零,转换为'np.uint8'可能是多余的。 –