matplotlib & visdom 的圖片顯示問題

這篇文章只是為了做個記錄

  1. matplotlib的圖片顯示問題
  2. matplotlib 與 cv2 的交互
  3. visdom的圖片顯示問題
  4. visdom 與 cv2 的交互
  • matplotlib的圖片顯示問題
    • 在使用過程中, 我本來以為matplotlib的plt.imshow() 是直接對像素值的顯示,即在灰色圖中, 一個value=5 的矩陣點會被在畫圖時表現為5亮度的像素點. 但其實不是這樣,主要原因是 imshow() 會自動將數值歸一化 再映射到color map上
    • matplotlib 函數會重新將輸入的數據歸一到0.0 與1.0之間, 能處理float32 和uint8兩種類型,所有圖片類型除了PNG 都會被限制在8bits, 為什麼8bits, 因為8bits已經足夠每個通道進行渲染,因為人眼只能看到這麼長的色彩範圍

import matplotlib.pyplot as pltnimport matplotlib.image as mpimgnimport numpy as npnn# 如果你使用 ipython 或 jupyter notebookn%matplotlib inlinenna=np.arange(100)nprint(a.shape)nna=a.reshape(10,10)nnnplt.subplot(131)nplt.imshow(a,cmap=gray)nna=a/10nplt.subplot(132)nplt.imshow(a,cmap=gray)nna=np.ones((10,10))nplt.subplot(133)nplt.imshow(a,cmap=gray)n

從結果可以看到, 矩陣 a的range對圖片沒有影響,第一個a是0到100,第二個a是0到10, 因為矩陣a都被歸一化了. 當矩陣中的值都相同時, 呈現的是全黑的圖片

  • matplotlib 與 cv2 的交互
    • cv2 讀取圖片是(xxx,xxx,3) 的結構, 顏色順序為BGR
    • plt.imshow()顯示顏色通道為RGB

原圖為

import matplotlib.pyplot as pltnimport matplotlib.image as mpimgnimport numpy as npnimport cv2nn# 如果你使用 ipython 或 jupyter notebookn%matplotlib inlinennimage=cv2.imread(./data/person.jpg)nnplt.subplot(121)nplt.imshow(image)nn#convert bgr to rgb channelsnb,g,r=cv2.split(image)nimage=cv2.merge([r,g,b])nplt.subplot(122)nplt.imshow(image)n

  • visdom的圖片顯示問題
    • 當image 為uint8則 顯示圖片按照 value%255 顯示, 即 -1 顯示 255 (最亮), 257 顯示 2 (很暗)
    • 當image為float 則轉為uint8來顯示, 如果float 最大值 < 1, 則先乘以255 再轉為uint8

import matplotlib.pyplot as pltnimport matplotlib.image as mpimgnimport numpy as npnimport cv2nnna=np.arange(100)na=a.reshape(10,10)nb=np.arange(100,200)nb=b.reshape(10,10)nna=np.stack((a,b+100))na=np.expand_dims(a,1)nprint(a.shape)nnvis.images(a)n

左邊的圖片是顯示value 為 0-100的亮度變化,右邊的圖片顯示的是value 為 200-300的亮度變化

  • visdom 與 cv2 的交互
    • visdom 中vis.image() 顯示圖片為( 3,xxx,xxx), 其中vis.images() 的結構為(num,3,xxx,xxx), 且其圖片通道為RGB
    • CV2.imread() 圖片通道為BGR, 圖片size 為(xxx,xxx,3)

import torch nfrom torchvision import modelsnimport matplotlib.pyplot as pltnimport cv2nfrom torch.autograd import Variablenfrom __future__ import absolute_importnfrom __future__ import divisionnfrom __future__ import print_functionnfrom __future__ import unicode_literalsnnfrom visdom import Visdomnimport numpy as npnimport mathnimport os.pathnimport getpassnfrom sys import platform as _platformnfrom six.moves import urllibnnvis = Visdom()nnassert vis.check_connection()nn#------------------------------------------------------------------------------------------------#ndef image_process(path):n ##image_dog_1 shape is (1871,2878,3)n image_dog_1=cv2.imread(path)nnn ## image_dog_1 shape is (224,224,3)n image_dog_1=cv2.resize(image_dog_1,(224,224))nnn ## image_dog_1 shape is (224,224,3), but change the bgr to rgbn b,g,r = cv2.split(image_dog_1)n image_dog_1=cv2.merge((r,g,b))nnn ## shape is change from (224,224,3) to (3,224,224)n image_dog_1=image_dog_1.transpose(2,0,1)n # print(image_dog_1.shape)n #image_dog_1= np.expand_dims(image_dog_1,axis=0)n #image_dog_1.unsqueeze(dims=0)nn return image_dog_1n#------------------------------------------------------------------------------------------------#npath=./data/person.jpgnimage_var=image_process(path)nvis.image(image)n

當我們沒有轉換通道時圖片如下

推薦閱讀:

Matplotlib 可視化系列一
使用Matplotlib畫動態圖實例
Python數據抓取與可視化實戰——網易雲課堂人工智慧與大數據板塊課程實戰
基於matplotlib的2D/3D抽象網格和能量曲線繪製程序
Seaborn(sns)官方文檔學習筆記(第三章 分布數據集的可視化)

TAG:可视化 | Matplotlib | PyTorch |