1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

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

          來源:互聯網轉載 時間:2024-05-03 11:42:01

          一、問題

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

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

          importcv2importmatplotlib.pyplotasplt#以灰度模式讀入圖片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()

          運行結果如下:


          左邊是原圖,中間是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”這個參數即可),運行結果如下:


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

          importcv2importmatplotlib.pyplotasplt#讀入彩色圖片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'。示例代碼如下:

          importcv2importmatplotlib.pyplotasplt#讀入彩色圖片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()

          運行結果為:


          左邊是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的實現示例”這篇文章對大家有幫助,同時也希望大家多多支持本站,關注本站行業資訊頻道,更多相關知識等著你來學習!

          標簽:imshow-

          c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...

          2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...

          :喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...

          把錢換成什么東西保值?錢拿來投資什么才保值?錢要保值投資什么好?一起了解下!經壢了疫情之后,錢在當今的環境下變得越來越不值錢,為了能讓錢能長久保值,只有換成能保值的商品,把錢換成什么東西保值?一說起保值的問題,首先想到的自然就是黃金,然后就是房子了。不過對于目前情況來說,大部分人還是會優先選擇房子。接下來就讓小編來介紹一下選擇把錢換成這些的保值原因。1、購買房子或者商鋪:就目前來說,房子肯定是剛需...

          (資料圖片)隨著社會越來越發達,大家都選擇在網絡上汲取相關知識內容,比如請問北京哪里有室內水上樂園,為了更好的解答大家的問題,小編也是翻閱整理了相應內容,下面就一起來看一下吧!1、水立方嬉水樂園,地址:朝陽區北四環中路奧林匹克公園內。2、摩銳水世界,地址:朝陽區東葦路金盞郁金香花園。3、藍月爾水世界,地址:北京市豐臺區宋家莊路撲滿山對面首開福茂。4、英達海灘水世界,地址:北京市昌平區阿牛路富順六環...

          一億越南盾等于多少人民幣2022?越南盾(越南語:??ng, 漢字:銅),越南的貨幣單位。用“?”記號表示。輔幣單位有 hào(毫) 和 xu(樞),1盾=10 hào或100 xu, 由于面值過小,很少使用。通常置于國名后來表示貨幣單位。一些海外越南人,如美籍越南人稱“盾”為“VND”。人民幣(R...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>