使用OpenCV imwrite进行图像类型转换

时间:2017-07-29 15:46:10

标签: python image opencv matplotlib

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

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相同的效果?

2 个答案:

答案 0 :(得分:2)

我使用了vmin函数的vmaximshow参数。这使DCT图像与OpenCV的imwrite等效。

所以程序看起来像这样:

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

答案 1 :(得分:0)

你犯了一个错误:

dctimg = np.uint8(dctimg)*255

应该是

dctimg = np.uint8(dctimg*255)

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

另外,请确保您的DCT实际上只产生正值。我不认为通常就是这种情况。