使用cv2.imshow 與 plt.imshow 的差別
2019/11/26 上午 11:56
電腦視覺深度學習討論版
Vic Chen
觀看數:156
回答數:2
收藏數:0
1. 使用cv2.imshow
r,g,b 三張圖為偏灰圖片
2. 使用 plt.imshow
請問為何r,g,b 三張圖會有點偏綠呢?
最後附上完整程式碼
#!/usr/bin/env python
# coding: utf-8
# In[41]:
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
get_ipython().run_line_magic('matplotlib', 'inline')
# In[4]:
img=cv2.imread('lena.png')
print("opencv 是用 "+str(type(img))+" 表示圖片格式")
print("圖片維度: "+str(img.shape))
# # Opencv在載入圖片時可選擇載入方式的格式 :
# 1. cv2.IMREAD_COLOR(預設)
# * 載入包含RGB 3個channel的彩色圖片
# 2. cv2.IMREAD_GRAYSCALE
# * 灰階格式
# 3. cv2.IMREAD_UNCHANGE
# * 所有channel
# In[18]:
cv2.imshow('rgb',img) #(顯示的視窗名稱,要顯示的圖片)
cv2.waitKey(0)
cv2.destroyAllWindows()
#後⾯面兩兩⾏行行代表顯⽰示圖片之後,按任意鍵關閉視窗
# In[5]:
img_g=cv2.imread('lena.png',cv2.IMREAD_GRAYSCALE)
# In[6]:
while True:
cv2.imshow('rgb',img)
cv2.imshow('gray',img_g)
k=cv2.waitKey(0)
if k == 27 :
cv2.destroyAllWindows()
break
# In[7]:
img_box=cv2.imread('box.png')
# In[11]:
#把顯示圖片包成一個程式
def show_img(window_name,img_name):
cv2.imshow(window_name,img_name)
cv2.waitKey(0)
cv2.destroyAllWindows()
# In[12]:
show_img('box',img_box)
# In[46]:
img_r=img[:,:,0]
img_g=img[:,:,1]
img_b=img[:,:,2]
while True:
cv2.imshow('img',img)
cv2.imshow('img_r',img_r)
cv2.imshow('img_g',img_g)
cv2.imshow('img_b',img_b)
k=cv2.waitKey(0)
if k == 27 :
cv2.destroyAllWindows()
break
# In[45]:
img_plt=mpimg.imread('lena.png')
img_plt_r=img_plt[:,:,0]
img_plt_g=img_plt[:,:,1]
img_plt_b=img_plt[:,:,2]
plt.figure(num='lena',figsize=(8,8))
plt.subplot(2,2,1)
plt.title('original')
plt.imshow(img_plt)
plt.subplot(2,2,2)
plt.title('R channel')
plt.imshow(img_plt_r)
plt.subplot(2,2,3)
plt.title('G channel')
plt.imshow(img_plt_g)
plt.subplot(2,2,4)
plt.title('B channel')
plt.imshow(img_plt_b)
回答列表
-
2019/11/26 下午 01:43K.F贊同數:0不贊同數:0留言數:1
您好阿~同學
我對這個也有疑問呢XD
我猜是cv2跟plt的補值問題
個人在寫這題時
我認為切割RGB後最後呈現結果應該是
R,0,0
0,G,0
0,0,B
但是依照教學的cv2切割法把圖存出來
則會變成
R,R,R
所以我認為你的情況應該是兩種lib使用的補值方式不一樣
你可以試試看把圖片存到png再回讀
就可以知道圖片變成怎樣了:D
再麻煩了
-
2019/11/27 上午 01:02Chen-Ming Yang贊同數:0不贊同數:0留言數:1
Hello,
其實我剛開始學的時候的確也是踩了很多雷
後來才發現 plt 跟 cv2 在存圖片的時候是以不同的格式存
plt 是預設 RGB
cv2 是預設 BGR
所以你看會偏綠是因為他把紅色的值當作綠色的值顯示
如果你用 opencv 處理圖片,最後卻想要用 plt 顯示
我會建議再用 cv2.cvtColor 從 BGR 轉成 RGB 再顯示喔