logo
Loading...

使用cv2.imshow 與 plt.imshow 的差別 - Cupoy

1. 使用cv2.imshowr,g,b 三張圖為偏灰圖片2. 使用 plt.imshow請問為何r...

使用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:43
    K.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:02
    Chen-Ming Yang
    贊同數:0
    不贊同數:0
    留言數:1

    Hello,


    其實我剛開始學的時候的確也是踩了很多雷

    後來才發現 plt 跟 cv2 在存圖片的時候是以不同的格式存


    plt 是預設 RGB

    cv2 是預設 BGR


    所以你看會偏綠是因為他把紅色的值當作綠色的值顯示

    如果你用 opencv 處理圖片,最後卻想要用 plt 顯示

    我會建議再用 cv2.cvtColor 從 BGR 轉成 RGB 再顯示喔