中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenCV中imshow()和Matplotlib.pyplot的實現示例

發布時間:2021-06-04 11:20:04 來源:億速云 閱讀:245 作者:小新 欄目:開發技術

這篇文章主要介紹了OpenCV中imshow()和Matplotlib.pyplot的實現示例,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、問題

在Python里使用OpenCV時,一般是通過cv2.imread讀入圖片,然后用plt.imshow顯示圖片,但最近學習OpenCV時這樣做的結果與預期的結果有較大的出入。查找資料后,才明白OpenCV里的imshow()和Matplotlib.pyplot的imshow()在使用上有一些區別,不注意的話很容易就會導致很奇怪的結果。

下面的示例代碼及運行結果顯示了這種差異:

import cv2
import matplotlib.pyplot as plt

#以灰度模式讀入圖片
messi=cv2.imread('messi.jpg',0)

#使用matplotlib.pyplot的imshow顯示圖片
plt.imshow(messi),plt.title('messi_plt')
plt.xticks([]),plt.yticks([]) #隱藏坐標軸
plt.show()

#使用opencv的imshow顯示圖片
cv2.imshow('messi_cv',messi)
cv2.waitKey(0)
cv2.destroyAllWindows()

運行結果如下:

OpenCV中imshow()和Matplotlib.pyplot的實現示例

左邊是原圖,中間是cv2.imshow的顯示結果,右邊是plt.imshow的顯示結果。很明顯地看到,明明是讀入灰度圖,plt.imshow的結果卻更像是張彩圖,這顯然是有問題的。

二、分析和解決辦法

為了比較和分析OpenCV里imshow()和Matplotlib.pyplot里imshow()這兩者的差異,下面分別對顯示彩圖以及顯示灰度圖這兩種情況來進行說明。

彩色圖

對于彩色圖片,一般由R,G,B三個通道構成。然而,需要注意的是,OpenCV里彩色圖片加載時是按照BGR的順序,Matplotlib里彩色圖片加載時是按照RGB的順序。所以,當我們用cv2.imread讀入圖片,用cv2.imshow來顯示時自然是不會出問題的,但若用plt.imshow來顯示就會出現問題,如下面的結果所示。
這里省略示例代碼(和上面的幾乎相同,只是不要在cv2.imread里設置“0”這個參數即可),運行結果如下:

OpenCV中imshow()和Matplotlib.pyplot的實現示例

左邊是原圖,中間是cv2.imshow的顯示結果,右邊是plt.imshow的顯示結果。顯然,plt.imshow的結果出現了問題。
為了解決這個問題,方法很簡單,就是將通道R和通道B的內容調換一下,再用plt.imshow顯示時就正常了。下面給出該方法的示例代碼:

import cv2
import matplotlib.pyplot as plt

#讀入彩色圖片
messi=cv2.imread('messi.jpg',1)

#使用matplotlib.pyplot的imshow顯示圖片
plt.imshow(messi),plt.title('messi_plt')
plt.xticks([]),plt.yticks([]) #隱藏坐標軸
plt.show()

##調換r、b通道,生成rgb順序的圖片并顯示
b,g,r=cv2.split(messi) #通道的拆分
messi_rgb=cv2.merge((r,g,b)) #通道的融合
plt.imshow(messi_rgb),plt.title('messi_rgb_plt')
plt.xticks([]),plt.yticks([])
plt.show()

#使用opencv的imshow顯示圖片
cv2.imshow('messi_cv',messi)
cv2.waitKey(0)
cv2.destroyAllWindows()

灰度圖

灰度圖是單通道圖片,按理說不會出現上面彩色圖的那種問題,不管是用cv2.imshow顯示還是用plt.imshow顯示,結果都應該是一樣的。然而,事實卻并非如此(如最開始的示例所示)。我糾結了好久不知道原因是什么,一開始以為是opencv和matplotlib的版本不匹配,結果更新版本之后還是有這個問題。后來,去找來matplotlib的API文檔才明白是咋回事。
matplotlib.pyplot.imshow函數里,有一個參數是cmap,API文檔里給出的說明是:

cmap : str or Colormap, optional
The Colormap instance or registered colormap name used to map scalar data to colors. This parameter is ignored for RGB(A) data. Defaults to rcParams[“image.cmap”] = ‘viridis'.

大致的意思是說,cmap給出了標量值如何映射到顏色空間,并且對于RGB(A)圖像此參數是忽略的;默認參數可查看rcParams[“image.cmap”]。鏈接轉過去的文檔是matplotlib的示例配置文檔matplotlibrc,里面定義了各種變量的默認值(這也是為什么我們在調用matplotlib里的函數時,有些參數我們沒給值也能正常運行的原因)。在這里能看到,cmap的默認值是viridis,這也就說明了在使用plt.imshow顯示灰度圖時出現問題的原因。

因此,為了解決該問題,使plt.imshow能正常地顯示灰度圖,方法也很簡單,就是修改cmap的值為'gray'。示例代碼如下:

import cv2
import matplotlib.pyplot as plt

#讀入彩色圖片
messi=cv2.imread('messi.jpg',0)

#使用opencv的imshow顯示圖片
cv2.imshow('messi_cv',messi)
cv2.waitKey(0)
cv2.destroyAllWindows()

#使用matplotlib.pyplot的imshow顯示圖片
#cmap使用默認值
plt.imshow(messi),plt.title('messi_camp_default')
plt.xticks([]),plt.yticks([]) #隱藏坐標軸
plt.show()

#使用matplotlib.pyplot的imshow顯示圖片
#cmap設置為'gray'
plt.imshow(messi,cmap='gray'),plt.title('messi_camp_gray')
plt.xticks([]),plt.yticks([]) #隱藏坐標軸
plt.show()

運行結果為:

OpenCV中imshow()和Matplotlib.pyplot的實現示例

左邊是cv2.imshow的顯示結果,中間和右邊的是plt.imshow的顯示結果。

另外,cmap的值除了可以取默認參數及'gray'外,還有很多值可供我們選擇,詳細的說明在這里。其實這些東西了解下就行,等實際使用時,查閱下、試一試。根據需要選擇合適的就可以了。

注:
1.關于matplotlib里的imshow函數更詳細的說明在這里。
2.關于matplotlib.matplotlibrc文檔更詳細的說明在這里。
3.如果想查看或編輯自己電腦里的matplotlibrc文件,可使用此命令matplotlib.matplotlib_fname()獲取路徑。

三、總結

由于OpenCV里的imshow和Matplotlib里的imshow的一些差異,在使用時主要是要注意兩點:
1.顯示彩色圖時,要把b、r通道調換一下。
2.顯示灰度圖時,記得設置cmap的值為'gray'。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“OpenCV中imshow()和Matplotlib.pyplot的實現示例”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文水县| 祁连县| 宜良县| 湘乡市| 观塘区| 东乌| 榆树市| 永康市| 定陶县| 青浦区| 隆子县| 平顶山市| 长汀县| 元氏县| 玉林市| 东平县| 辽宁省| 沅陵县| 民乐县| 泰来县| 锦屏县| 荃湾区| 鄄城县| 宜章县| 天津市| 抚顺县| 海城市| 衡南县| 马关县| 凉城县| 岢岚县| 鄂伦春自治旗| 迁安市| 启东市| 镶黄旗| 永嘉县| 安新县| 平泉县| 巴青县| 新密市| 肥乡县|