版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PythonOpenCV從入門到精通目錄\h第1篇入門篇\h第1章Python與OpenCV\h1.1Python概述\h1.1.1什么是Python\h1.1.2Python的版本\h1.1.3Python的應(yīng)用\h1.2OpenCV概述\h1.2.1計(jì)算機(jī)視覺\h1.2.2OpenCV包含的模塊\h1.2.3OpenCV的發(fā)展歷程\h1.2.4OpenCV的應(yīng)用\h1.2.5PythonOpenCV的開發(fā)工具\(yùn)h1.3小結(jié)\h第2章搭建開發(fā)環(huán)境\h2.1Python的下載和安裝\h2.1.1下載Python\h2.1.2安裝Python\h2.1.3測試Python是否安裝成功\h2.2PythonOpenCV的下載和安裝\h2.2.1下載和安裝OpenCV-Contrib-Python庫\h2.2.2測試OpenCV-Contrib-Python庫和Numpy庫是否安裝成功\h2.3PyCharm的下載和安裝\h2.3.1下載PyCharm\h2.3.2安裝PyCharm\h2.3.3啟動(dòng)并配置PyCharm\h2.4小結(jié)\h第3章圖像處理的基本操作\h3.1讀取圖像\h3.2顯示圖像\h3.3保存圖像\h3.4獲取圖像屬性\h3.5小結(jié)\h第4章像素的操作\h4.1像素\h4.1.1確定像素的位置\h4.1.2獲取像素的BGR值\h4.1.3修改像素的BGR值\h4.2使用NumPy模塊操作像素\h4.2.1NumPy概述\h4.2.2數(shù)組的類型\h4.2.3創(chuàng)建數(shù)組\h4.2.4操作數(shù)組\h4.2.5數(shù)組的索引和切片\h4.2.6創(chuàng)建圖像\h4.2.7拼接圖像\h4.3小結(jié)\h第5章色彩空間與通道\h5.1色彩空間\h5.1.1GRAY色彩空間\h5.1.2HSV色彩空間\h5.2通道\h5.2.1拆分通道\h5.2.2合并通道\h5.2.3綜合運(yùn)用拆分通道和合并通道\h5.2.4alpha通道\h5.3小結(jié)\h第2篇基礎(chǔ)篇\h第6章繪制圖形和文字\h6.1線段的繪制\h6.2矩形的繪制\h6.3圓形的繪制\h6.4多邊形的繪制\h6.5文字的繪制\h6.5.1文字的斜體效果\h6.5.2文字的垂直鏡像效果\h6.5.3在圖像上繪制文字\h6.6動(dòng)態(tài)繪制圖形\h6.7小結(jié)\h第7章圖像的幾何變換\h7.1縮放\h7.1.1dsize參數(shù)實(shí)現(xiàn)縮放\h7.1.2fx和fy參數(shù)實(shí)現(xiàn)縮放\h7.2翻轉(zhuǎn)\h7.3仿射變換\h7.3.1平移\h7.3.2旋轉(zhuǎn)\h7.3.3傾斜\h7.4透視\h7.5小結(jié)\h第8章圖像的閾值處理\h8.1閾值處理函數(shù)\h8.2“非黑即白”的圖像\h8.2.1二值化處理\h8.2.2反二值化處理\h8.3零處理\h8.3.1低于閾值零處理\h8.3.2超出閾值零處理\h8.4截?cái)嗵幚韁h8.5自適應(yīng)處理\h8.6Otsu方法\h8.7閾值處理的作用\h8.8小結(jié)\h第9章圖像的運(yùn)算\h9.1掩模\h9.2圖像的加法運(yùn)算\h9.3圖像的位運(yùn)算\h9.3.1按位與運(yùn)算\h9.3.2按位或運(yùn)算\h9.3.3按位取反運(yùn)算\h9.3.4按位異或運(yùn)算\h9.4合并圖像\h9.4.1加權(quán)和\h9.4.2覆蓋\h9.5小結(jié)\h第3篇進(jìn)階篇\h第10章模板匹配\h10.1模板匹配方法\h10.2單模板匹配\h10.2.1單目標(biāo)匹配\h10.2.2多目標(biāo)匹配\h10.3多模板匹配\h10.4小結(jié)\h第11章濾波器\h11.1均值濾波器\h11.2中值濾波器\h11.3高斯濾波器\h11.4雙邊濾波器\h11.5小結(jié)\h第12章腐蝕與膨脹\h12.1腐蝕\h12.2膨脹\h12.3開運(yùn)算\h12.4閉運(yùn)算\h12.5形態(tài)學(xué)運(yùn)算\h12.5.1梯度運(yùn)算\h12.5.2頂帽運(yùn)算\h12.5.3黑帽運(yùn)算\h12.6小結(jié)\h第13章圖形檢測\h13.1圖像的輪廓\h13.2輪廓擬合\h13.2.1矩形包圍框\h13.2.2圓形包圍框\h13.3凸包\h13.4Canny邊緣檢測\h13.5霍夫變換\h13.5.1直線檢測\h13.5.2圓環(huán)檢測\h13.6小結(jié)\h第14章視頻處理\h14.1讀取并顯示攝像頭視頻\h14.1.1VideoCapture類\h14.1.2如何使用VideoCapture類\h14.2播放視頻文件\h14.2.1讀取并顯示視頻文件\h14.2.2視頻的暫停播放和繼續(xù)播放\h14.2.3獲取視頻文件的屬性\h14.3保存視頻文件\h14.3.1VideoWriter類\h14.3.2如何使用VideoWriter類\h14.4小結(jié)\h第15章人臉檢測和人臉識(shí)別\h15.1人臉檢測\h15.1.1級(jí)聯(lián)分類器\h15.1.2方法\h15.1.3分析人臉位置\h15.2檢測其他內(nèi)容\h15.2.1眼睛檢測\h15.2.2貓臉檢測\h15.2.3行人檢測\h15.2.4車牌檢測\h15.3人臉識(shí)別\h15.3.1Eigenfaces人臉識(shí)別器\h15.3.2Fisherfaces人臉識(shí)別器\h15.3.3LocalBinaryPatternHistogram人臉識(shí)別器\h15.4小結(jié)\h第4篇項(xiàng)目篇\h第16章MR智能視頻打卡系統(tǒng)\h16.1需求分析\h16.2系統(tǒng)設(shè)計(jì)\h16.2.1開發(fā)環(huán)境\h16.2.2功能結(jié)構(gòu)\h16.2.3業(yè)務(wù)流程\h16.2.4項(xiàng)目結(jié)構(gòu)\h16.3文件系統(tǒng)設(shè)計(jì)\h16.4數(shù)據(jù)實(shí)體模塊設(shè)計(jì)\h16.5工具模塊設(shè)計(jì)\h16.5.1公共工具模塊\h16.5.2IO流模塊\h16.5.3攝像頭工具模塊\h16.6服務(wù)模塊設(shè)計(jì)\h16.6.1人事服務(wù)模塊\h16.6.2人臉識(shí)別服務(wù)模塊\h16.7程序入口設(shè)計(jì)\h16.7.1用戶權(quán)限管理\h16.7.2主菜單設(shè)計(jì)\h16.7.3人臉打卡功能\h16.7.4為新員工登記人臉照片樣本\h16.7.5刪除員工全部數(shù)據(jù)\h16.7.6查詢員工打卡記錄\h16.7.7生成考勤報(bào)表\h16.7.8自定義上下班時(shí)間\h16.7.9啟動(dòng)程序\h16.8小結(jié)第1篇入門篇本篇包括Python與OpenCV、搭建開發(fā)環(huán)境、圖像處理的基本操作、像素的操作和色彩空間與通道。這5章的作用相當(dāng)于“掃盲”,即完成一個(gè)從“什么都不知道”到“掌握關(guān)鍵知識(shí)點(diǎn)”的轉(zhuǎn)變過程,為學(xué)習(xí)后面的內(nèi)容奠定基礎(chǔ)。第1章Python與OpenCVPython是當(dāng)下熱門的一種編程語言,語法簡潔、功能強(qiáng)大。OpenCV是一個(gè)開源的計(jì)算機(jī)視覺庫,能夠讓開發(fā)人員更專注處理圖像本身,而非處理圖像時(shí)的具體實(shí)現(xiàn)算法。也就是說,OpenCV讓結(jié)構(gòu)復(fù)雜的計(jì)算機(jī)視覺應(yīng)用變得非常容易。因此,OpenCV被廣泛地應(yīng)用于各個(gè)領(lǐng)域。本章將從Python出發(fā),途經(jīng)OpenCV,走進(jìn)PythonOpenCV。1.1Python概述1.1.1什么是PythonPython本義是巨蟒。1989年,荷蘭人GuidovanRossum發(fā)明了一種面向?qū)ο蟮慕忉屝透呒?jí)編程語言,將其命名為Python,其標(biāo)志如圖1.1所示。Python的設(shè)計(jì)思想為優(yōu)雅、明確和簡單,實(shí)際上,Python始終貫徹著這一理念,以至于現(xiàn)在網(wǎng)絡(luò)上流傳著“人生苦短,我用Python”的說法,可見Python有著簡單、開發(fā)速度快、節(jié)省時(shí)間和容易學(xué)習(xí)等特點(diǎn)。圖1.1Python的標(biāo)志Python是一種擴(kuò)充性強(qiáng)大的編程語言,它具有豐富和強(qiáng)大的庫,能夠把使用其他語言制作的各種模塊(尤其是C/C++)很輕松地聯(lián)結(jié)在一起,所以Python常被稱為“膠水”語言。1991年,Python的第一個(gè)公開發(fā)行版問世。從2004年開始,Python的使用率呈線性增長,越來越受到編程者的歡迎和喜愛。最近幾年,伴隨著大數(shù)據(jù)和人工智能的蓬勃發(fā)展,Python語言越來越火爆,也越來越受到開發(fā)者的青睞,圖1.2是2021年6月TIBOE編程語言排行榜,Python排在第2位。圖1.22021年6月TIBOE編程語言排行榜1.1.2Python的版本Python自發(fā)布以來,主要有3個(gè)版本:1994年發(fā)布的Python1.x版本(已過時(shí))、2000年發(fā)布的Python2.x版本和2008年發(fā)布的Python3.x版本。1.1.3Python的應(yīng)用Python作為一種功能強(qiáng)大的編程語言,因其簡單易學(xué)而受到很多開發(fā)者的青睞。那么Python的應(yīng)用領(lǐng)域有哪些呢?概括起來主要有以下幾個(gè)。Web開發(fā)。大數(shù)據(jù)處理。人工智能。自動(dòng)化運(yùn)維開發(fā)。云計(jì)算。爬蟲。游戲開發(fā)。例如,我們經(jīng)常訪問的集電影、讀書、音樂于一體的創(chuàng)新型社區(qū)豆瓣、國內(nèi)著名網(wǎng)絡(luò)問答社區(qū)知乎、國際上知名的游戲SidMeier'sCivilization即《文明》等都是使用Python開發(fā)的。這些網(wǎng)站和應(yīng)用的效果如圖1.3~圖1.5所示。圖1.3豆瓣首頁圖1.4知乎首頁很多企業(yè)都將Python作為其項(xiàng)目開發(fā)的主要語言,例如世界上最大的搜索引擎Google公司、專注編程教育二十年的明日科技、世界最大的短視頻網(wǎng)站YouTube和覆蓋范圍最廣的社交網(wǎng)站facebook等,如圖1.6所示。圖1.5《文明》游戲首頁圖1.6應(yīng)用Python的公司說明Python語言不僅可以應(yīng)用到網(wǎng)絡(luò)編程、游戲開發(fā)等領(lǐng)域,還在圖形圖像處理、智能機(jī)器人、爬取數(shù)據(jù)、自動(dòng)化運(yùn)維等多方面嶄露頭角,為開發(fā)者提供簡約、優(yōu)雅的編程體驗(yàn)。1.2OpenCV概述OpenCV是一個(gè)開源的計(jì)算機(jī)視覺庫,可以在Windows、Linux、MacOS等操作系統(tǒng)上運(yùn)行。它起源于英特爾性能實(shí)驗(yàn)室的實(shí)驗(yàn)研究,由俄羅斯的專家負(fù)責(zé)實(shí)現(xiàn)和優(yōu)化,并以為計(jì)算機(jī)視覺提供通用性接口為目標(biāo)。1.2.1計(jì)算機(jī)視覺人類由于被賦予了視覺,因此很容易認(rèn)為“計(jì)算機(jī)視覺是一種很容易實(shí)現(xiàn)的功能”。但是,這種想法是錯(cuò)誤的。如圖1.7所示,人類的視覺能夠很輕易地從這幅圖像中識(shí)別花朵。但是,計(jì)算機(jī)視覺不會(huì)像人類視覺那樣能夠?qū)D像進(jìn)行感知和識(shí)別,更不會(huì)自動(dòng)控制焦距和光圈,而是把圖像解析為按照柵格狀排列的數(shù)字。以圖1.7為例,計(jì)算機(jī)視覺將其解析為如圖1.8所示的按照柵格狀排列的數(shù)字(圖1.8只是圖1.7的一部分)。圖1.7一幅顯示花朵的彩色圖像圖1.8計(jì)算機(jī)視覺中的圖1.7這些按照柵格狀排列的數(shù)字包含大量的噪聲,噪聲在圖像上常表現(xiàn)為引起較強(qiáng)視覺效果的孤立像素點(diǎn)或像素塊,使得圖像模糊不清。因此,噪聲是計(jì)算機(jī)視覺面臨的一個(gè)難題。要讓圖片變得清晰,就需要對(duì)抗噪聲。計(jì)算機(jī)視覺使用統(tǒng)計(jì)的方法對(duì)抗噪聲,例如,計(jì)算機(jī)視覺雖然很難通過某個(gè)像素或者這個(gè)像素的相鄰像素判斷這個(gè)像素是否在圖像主體的邊緣上,但是如果對(duì)圖像某一區(qū)域內(nèi)的像素做統(tǒng)計(jì),那么上述判斷就變得簡單了,即在指定區(qū)域內(nèi),圖像主體的邊緣應(yīng)該表現(xiàn)為一連串獨(dú)立的像素,而且這一連串像素的方向應(yīng)該是一致的。這部分內(nèi)容就是本書第13章要為讀者講解的圖形檢測。例如,使用圖形檢測的相關(guān)方法,能夠把圖1.9中的圖形邊緣繪制成紅色,進(jìn)而得到如圖1.10所示的效果。圖1.9簡單的幾何圖像圖1.10把圖形邊緣繪制成紅色為了有效地解決計(jì)算機(jī)視覺面臨的難題,OpenCV提供了許多模塊,這些模塊中的方法具有很好的完備性。1.2.2OpenCV包含的模塊OpenCV是由很多模塊組成的,這些模塊可以分為很多層,具體如圖1.11所示。那么,OpenCV包含的模塊有哪些呢?表1.1列舉的是OpenCV常用的模塊。圖1.11OpenCV包含的模塊的層級(jí)結(jié)構(gòu)表1.1OpenCV常用的模塊及其說明說明表1.1中的模塊隨著OpenCV的版本不斷地更新而發(fā)生變化,有的可能被取消,有的可能被融合到其他模塊中。為了快速建立精巧的視覺應(yīng)用,OpenCV提供了許多模塊和方法。開發(fā)人員不必過多關(guān)注這些模塊和方法的具體實(shí)現(xiàn)細(xì)節(jié),只需關(guān)注圖像處理本身,就能夠很方便地使用它們對(duì)圖像進(jìn)行相應(yīng)的處理。1.2.3OpenCV的發(fā)展歷程圖1.12自2009年OpenCV的發(fā)展歷程從2009年3月至今,OpenCV的發(fā)展歷程如圖1.12所示。隨著OpenCV被越來越多的用戶認(rèn)可并提供越來越多的技術(shù)支持,OpenCV的研發(fā)團(tuán)隊(duì)也加大了研究人員和研究經(jīng)費(fèi)的投入,這使得OpenCV的下載量逐年增長。OpenCV的發(fā)展不是一帆風(fēng)順的。OpenCV在發(fā)展歷程中,不僅受到了互聯(lián)網(wǎng)行業(yè)泡沫經(jīng)濟(jì)的沖擊,還受到了管理層和管理方向不斷變更的影響,有時(shí)甚至沒有研究人員和研究經(jīng)費(fèi)的投入。但是,隨著多核處理器的出現(xiàn)以及計(jì)算機(jī)視覺的應(yīng)用越來越廣泛,OpenCV的應(yīng)用價(jià)值開始上升。截至目前,OpenCV已經(jīng)得到了基金會(huì)、一些上市公司和私人機(jī)構(gòu)的支持。OpenCV的宗旨是促進(jìn)商業(yè)(利用OpenCV構(gòu)建商業(yè)產(chǎn)品)和研究,因此OpenCV是開源并且免費(fèi)的。這不僅使得OpenCV擁有著龐大的用戶群體,還使得OpenCV在世界各國逐漸流行起來。1.2.4OpenCV的應(yīng)用因?yàn)镺penCV是一個(gè)開源的計(jì)算機(jī)視覺庫,所以在舉例介紹OpenCV的應(yīng)用之前,先對(duì)計(jì)算機(jī)視覺的應(yīng)用進(jìn)行介紹。計(jì)算機(jī)視覺不僅被廣泛地應(yīng)用到安保行業(yè)(見圖1.13中的監(jiān)控?cái)z像頭),還被應(yīng)用到網(wǎng)頁端的圖像和視頻處理以及游戲交互中,甚至在某些現(xiàn)代化工廠里,被應(yīng)用到產(chǎn)品質(zhì)檢工作上。此外,計(jì)算機(jī)視覺還被應(yīng)用到一些高精尖領(lǐng)域,包括無人機(jī)領(lǐng)域和航空航天領(lǐng)域等,這些領(lǐng)域使用計(jì)算機(jī)視覺中的圖像拼接技術(shù)獲取街景圖像(見圖1.14)或者航空?qǐng)D像(見圖1.15)。圖1.13監(jiān)控?cái)z像頭圖1.14街景圖像圖1.15航空?qǐng)D像OpenCV自發(fā)布起便得到廣泛應(yīng)用,其中包括在安保以及工業(yè)檢測系統(tǒng),網(wǎng)絡(luò)產(chǎn)品以及科研工作,醫(yī)學(xué)、衛(wèi)星和網(wǎng)絡(luò)地圖(例如,醫(yī)學(xué)圖像的降噪,街景圖像或者航空?qǐng)D像的拼接及其掃描校準(zhǔn)等),汽車自動(dòng)駕駛,相機(jī)校正等。此外,OpenCV還被應(yīng)用到處理聲音的頻譜圖像上,進(jìn)而實(shí)現(xiàn)對(duì)聲音的識(shí)別。1.2.5PythonOpenCV的開發(fā)工具Python相比Java、C、C++等編程語言,其優(yōu)勢(shì)在于集成度高。雖然Python的執(zhí)行效率低,但是可以調(diào)用大量免費(fèi)使用的類庫。Java、C、C++語言如果要實(shí)現(xiàn)一個(gè)功能,那么需要先實(shí)現(xiàn)其中的基本功能模塊。Python直接調(diào)用相應(yīng)的類庫就能將這個(gè)功能輕松實(shí)現(xiàn)。簡單地說,Python通過簡短的代碼就能夠?qū)崿F(xiàn)很強(qiáng)大的功能。此外,Python在OpenCV、Web、爬蟲、數(shù)據(jù)分析等方向都有很好的發(fā)展前景。PythonOpenCV的優(yōu)勢(shì)在于Python能夠借助OpenCV庫輕輕松松地實(shí)現(xiàn)對(duì)圖像的處理操作。手巧不如家什妙,PythonOpenCV的開發(fā)工具如圖1.16所示。圖1.16PythonOpenCV的開發(fā)工具1.3小結(jié)本章先介紹了什么是Python和Python的版本及應(yīng)用,然后介紹了什么是計(jì)算機(jī)視覺、OpenCV中的模塊和OpenCV的發(fā)展歷程及應(yīng)用,還闡述了PythonOpenCV的優(yōu)勢(shì)。讀者學(xué)習(xí)本章后,要掌握PythonOpenCV常用的2個(gè)庫:一個(gè)是OpenCV-Contrib-Python庫;另一個(gè)是Numpy庫。關(guān)于這2個(gè)庫的簡單描述,讀者可以參考如圖1.16所示的思維導(dǎo)圖。第2章搭建開發(fā)環(huán)境第1章介紹了本書要使用的開發(fā)工具,它們分別是Python解釋器、OpenCV-Contrib-Python庫、Numpy庫和集成開發(fā)工具PyCharm。使用這些開發(fā)工具前,需先對(duì)它們進(jìn)行下載和安裝。為了方便讀者操作,本章將通過圖文結(jié)合的方式詳細(xì)講解上述開發(fā)工具的下載和安裝。2.1Python的下載和安裝工欲善其事,必先利其器。為了使用PythonOpenCV對(duì)圖像進(jìn)行處理,本節(jié)介紹Python的下載和安裝。Python是跨平臺(tái)的開發(fā)工具,可以在Windows、Linux和MacOS等操作系統(tǒng)上使用。說明本節(jié)使用的是64位的Windows10操作系統(tǒng)。2.1.1下載Python在Python的官網(wǎng)中,可以很方便地下載Python的開發(fā)工具,具體下載步驟如下。(1)打開瀏覽器,在瀏覽器的地址欄中輸入Python的官網(wǎng)地址/,按Enter鍵后,進(jìn)入Python的官網(wǎng)首頁;將鼠標(biāo)移動(dòng)到Downloads菜單上,顯示如圖2.1所示的菜單項(xiàng)。說明推薦使用Python3.8.2及其以上版本。(2)單擊圖2.1中的Windows菜單項(xiàng)后,將進(jìn)入詳細(xì)的下載列表,如圖2.2所示。圖2.1Downloads菜單中的菜單項(xiàng)圖2.2適合Windows系統(tǒng)的Python下載列表說明在如圖2.2所示的下載列表中,帶有“x86”字樣的壓縮包,表示該開發(fā)工具可以在Windows32位系統(tǒng)上使用;而帶有“x86-64”字樣的壓縮包,則表示該開發(fā)工具可以在Windows64位系統(tǒng)上使用。另外,標(biāo)記為“web-basedinstaller”字樣的壓縮包,表示需要通過聯(lián)網(wǎng)完成安裝;標(biāo)記為“executableinstaller”字樣的壓縮包,表示通過可執(zhí)行文件(*.exe)方式離線安裝;標(biāo)記為“embeddablezipfile”字樣的壓縮包,表示嵌入式版本,可以集成到其他應(yīng)用中。(3)在如圖2.2所示的下載列表中,列出了各個(gè)版本的下載鏈接,可以根據(jù)需要選擇相應(yīng)的版本進(jìn)行下載。因?yàn)楸緯褂玫氖?4位的Windows10操作系統(tǒng),所以選擇并單擊Windowsx86-64executableinstaller超鏈接進(jìn)行下載。(4)下載完成后,將得到一個(gè)名為python-3.8.2-amd64.exe的安裝文件。2.1.2安裝Python安裝Python的步驟如下。(1)雙擊下載完成后得到的安裝文件python-3.8.2-amd64.exe,將顯示如圖2.3所示的安裝向?qū)?duì)話框;選中當(dāng)前對(duì)話框中的AddPython3.8toPATH復(fù)選框,表示自動(dòng)配置環(huán)境變量。(2)單擊圖2.3中的Customizeinstallation按鈕,進(jìn)行自定義安裝;在彈出的如圖2.4所示的安裝選項(xiàng)對(duì)話框中,都采用默認(rèn)設(shè)置。圖2.3Python安裝向?qū)?duì)話框圖2.4安裝選項(xiàng)對(duì)話框(3)單擊圖2.4中的Next按鈕,彈出如圖2.5所示的高級(jí)選項(xiàng)對(duì)話框。在當(dāng)前對(duì)話框中,除了默認(rèn)設(shè)置外,選中Installforallusers復(fù)選框(表示當(dāng)前計(jì)算機(jī)的所有用戶都可以使用);單擊Browse按鈕,設(shè)置Python的安裝路徑。注意在設(shè)置安裝路徑時(shí),建議路徑中不要使用中文或空格,避免使用過程中出現(xiàn)錯(cuò)誤。(4)單擊圖2.5中的Install按鈕后,將顯示如圖2.6所示的Python安裝進(jìn)度。圖2.5高級(jí)選項(xiàng)對(duì)話框圖2.6Python安裝進(jìn)度(5)安裝完成后,將顯示如圖2.7所示的對(duì)話框,單擊Close按鈕關(guān)閉當(dāng)前對(duì)話框即可。圖2.7安裝完成對(duì)話框2.1.3測試Python是否安裝成功測試Python是否安裝成功的步驟如下。(1)單擊開始菜單,直接輸入cmd,如圖2.8所示。(2)按Enter鍵后,打開“命令提示符”窗口,如圖2.9所示。圖2.8單擊開始菜單輸入cmd圖2.9“命令提示符”窗口(3)在“命令提示符”窗口中的光標(biāo)處輸入python,按Enter鍵;如果當(dāng)前窗口顯示如圖2.10所示的信息,說明Python安裝成功。圖2.10安裝成功后輸入python顯示的信息說明圖2.10中的信息是在“命令提示符”窗口中的光標(biāo)處輸入python后顯示的。如果讀者朋友選擇的版本不同,測試時(shí)顯示的信息會(huì)與圖2.10中顯示的有所差異。當(dāng)“命令提示符”窗口出現(xiàn)>>>時(shí),說明Python已經(jīng)安裝成功,而且已經(jīng)進(jìn)入Python,正在等待用戶輸入Python命令。2.2PythonOpenCV的下載和安裝為了更快速、更簡單地下載和安裝PythonOpenCV,本書將從清華鏡像下載和安裝OpenCV-Contrib-Python庫。在這個(gè)庫中,除包括OpenCV-Contrib-Python庫外,還包括Numpy庫。Numpy庫是Python語言的一個(gè)擴(kuò)展程序庫,支持大量的維度數(shù)組與矩陣運(yùn)算。2.2.1下載和安裝OpenCV-Contrib-Python庫從清華鏡像下載和安裝OpenCV-Contrib-Python庫的步驟如下。(1)讀者朋友可以參照?qǐng)D2.8和圖2.9,打開“命令提示符”窗口。(2)在“命令提示符”窗口中的光標(biāo)處輸入pipinstall-i/simpleopencv-contrib-python,如圖2.11所示。圖2.11輸入pip命令說明(1)/simple是清華大學(xué)提供的用于下載和安裝OpenCV-Contrib-Python庫的鏡像地址。(2)pip命令是用于查找、下載、安裝和卸載Python庫的管理工具。如果圖2.11中的pip命令得不到如圖2.12所示的界面,那么要將pip命令修改為pipinstallopencv-python。(3)按Enter鍵后,系統(tǒng)將自動(dòng)從/simple先下載OpenCV-Contrib-Python庫,再下載Numpy庫。待OpenCV-Contrib-Python庫和Numpy庫都下載完成后,系統(tǒng)將自動(dòng)安裝Numpy庫和OpenCV-Contrib-Python庫,如圖2.12所示。圖2.12安裝Numpy庫和OpenCV-Contrib-Python庫2.2.2測試OpenCV-Contrib-Python庫和Numpy庫是否安裝成功測試OpenCV-Contrib-Python庫和Numpy庫是否安裝成功的步驟如下。(1)如圖2.13所示,在光標(biāo)處輸入python,按Enter鍵,進(jìn)入Python。(2)當(dāng)“命令提示符”窗口出現(xiàn)>>>時(shí),在光標(biāo)處輸入importcv2,按Enter鍵。如果“命令提示符”窗口在新的一行出現(xiàn)>>>,說明OpenCV-Contrib-Python庫安裝成功。(3)在新的一行的>>>后的光標(biāo)處輸入importnumpyasnp,按Enter鍵。如果“命令提示符”窗口在新的一行出現(xiàn)>>>,說明Numpy庫安裝成功。(4)在新的一行的>>>后的光標(biāo)處輸入exit(),按Enter鍵,退出Python。(5)在“命令提示符”窗口的光標(biāo)處輸入exit或者exit(),按Enter鍵,退出“命令提示符”窗口。說明exit()用于退出Python,exit或exit()用于退出“命令提示符”窗口。圖2.13測試OpenCV-Contrib-Python庫和Numpy庫是否安裝成功2.3PyCharm的下載和安裝PyCharm是由JetBrains公司開發(fā)的一款Python開發(fā)工具,在Windows、MacOS和Linux操作系統(tǒng)中都可以使用,它具有語法高亮顯示、Project(項(xiàng)目)管理代碼跳轉(zhuǎn)、智能提示、自動(dòng)完成、調(diào)試、單元測試和版本控制等功能。使用PyCharm可以大大提高Python項(xiàng)目的開發(fā)效率,本節(jié)將對(duì)PyCharm的下載和安裝進(jìn)行講解。2.3.1下載PyCharmPyCharm的下載非常簡單,打開瀏覽器,在瀏覽器的地址欄中輸入PyCharm的官網(wǎng)地址:/pycharm/download/。單擊PyCharm官網(wǎng)首頁右側(cè)Community下的Download按鈕,即可下載PyCharm的免費(fèi)社區(qū)版,如圖2.14所示。圖2.14PyCharm官網(wǎng)首頁說明PyCharm有兩個(gè)版本,一個(gè)是社區(qū)版(免費(fèi)并且提供源程序),另一個(gè)是專業(yè)版(免費(fèi)試用,正式使用時(shí)需要付費(fèi))。建議讀者下載免費(fèi)的社區(qū)版本。下載完成的PyCharm安裝文件如圖2.15所示。圖2.15下載完成的PyCharm安裝文件說明筆者在下載PyCharm時(shí),最新版本是PyCharm2019.3.3版本。讀者在下載時(shí),不用擔(dān)心版本的匹配,只要下載官方提供的最新版本,即可正常使用。2.3.2安裝PyCharm安裝PyCharm的步驟如下。(1)雙擊圖2.15中的PyCharm安裝文件,單擊歡迎界面中的Next按鈕,進(jìn)入更改PyCharm安裝路徑的界面。(2)如圖2.16所示,建議單擊Browse按鈕更改PyCharm默認(rèn)的安裝路徑。更改安裝路徑后,單擊Next按鈕,進(jìn)入設(shè)置快捷方式和關(guān)聯(lián)文件界面。(3)如圖2.17所示,首先選中64-bitlauncher復(fù)選框(因?yàn)楣P者使用的操作系統(tǒng)是64位的Windows10),然后選中.py復(fù)選框(默認(rèn)使用PyCharm打開.py文件(Python腳本文件)),最后選中AddlaunchersdirtothePATH復(fù)選框。單擊Next按鈕,進(jìn)入選擇開始菜單文件夾界面。注意當(dāng)更改PyCharm安裝路徑時(shí),強(qiáng)烈建議不要把軟件安裝到操作系統(tǒng)所在的磁盤,避免因重裝系統(tǒng),損壞PyCharm路徑下的Python程序。此外,在新的安裝路徑中,建議不要使用中文和空格。圖2.16更改PyCharm安裝路徑圖2.17設(shè)置快捷方式和關(guān)聯(lián)文件(4)如圖2.18所示,選擇開始菜單文件夾界面中的內(nèi)容采用默認(rèn)設(shè)置即可。單擊Install按鈕(安裝時(shí)間大概10min左右,請(qǐng)耐心等待)。(5)如圖2.19所示,安裝完成后,單擊Finish按鈕。圖2.18選擇開始菜單文件夾界面圖2.19完成PyCharm的安裝2.3.3啟動(dòng)并配置PyCharm圖2.20PyCharm桌面快捷方式啟動(dòng)并配置PyCharm的步驟如下。(1)如圖2.20所示,雙擊桌面上的PyCharmCommunityEdition2019.3.3快捷方式,即可啟動(dòng)PyCharm。(2)啟動(dòng)PyCharm后,進(jìn)入如圖2.21所示的接受PyCharm協(xié)議界面,先選中IconfirmthatIhavereadandacceptthetermsofthisUserAgreement復(fù)選框,再單擊Continue按鈕。(3)進(jìn)入如圖2.22所示的PyCharm歡迎界面后,單擊CreateNewProject,創(chuàng)建一個(gè)名為PythonDevelop的Python項(xiàng)目。圖2.21接受PyCharm協(xié)議圖2.22PyCharm歡迎界面(4)如圖2.23所示,當(dāng)PyCharm第一次創(chuàng)建Python項(xiàng)目時(shí),需先設(shè)置Python項(xiàng)目的存儲(chǔ)位置和虛擬環(huán)境路徑(python.exe的存儲(chǔ)位置)。圖2.23設(shè)置項(xiàng)目路徑及虛擬環(huán)境路徑注意當(dāng)設(shè)置Python項(xiàng)目的存儲(chǔ)位置和虛擬環(huán)境路徑時(shí),建議路徑中不要使用中文。(5)單擊圖2.23中的Create按鈕,即可進(jìn)入如圖2.24所示的PyCharm主窗口。圖2.24PyCharm主窗口(6)如圖2.25所示,在PyCharm中,右擊PythonDevelop,然后在彈出的快捷菜單中依次選擇New→PythonFile,這樣就能夠在PythonDevelop中新建一個(gè).py文件。圖2.25在PythonDevelop中新建一個(gè).py文件(7)如圖2.26所示,在彈出的對(duì)話框中輸入文件名(即ImageTest)。(8)按Enter鍵后,進(jìn)入ImageTest.py文件。在ImageTest.py文件中,輸入importcv2,這時(shí)PyCharm出現(xiàn)如圖2.27所示的錯(cuò)誤。圖2.26輸入.py文件的文件名圖2.27輸入importcv2時(shí)出現(xiàn)錯(cuò)誤說明導(dǎo)致錯(cuò)誤的原因是PythonDevelop沒有添加OpenCV-Contrib-Python庫(包括Numpy庫)。(9)為了排除圖2.27中出現(xiàn)的錯(cuò)誤,在PyCharm菜單欄中依次選擇File→Settings命令,操作步驟如圖2.28所示。圖2.28打開Settings對(duì)話框(10)打開Settings對(duì)話框后,單擊Project:PythonDevelop,在彈出的下拉列表中選擇ProjectInterpreter命令,界面效果如圖2.29所示。圖2.29單擊ProjectInterpreter后的界面效果(11)單擊圖2.29右上角的齒輪按鈕,齒輪圖標(biāo)會(huì)彈出如圖2.30所示的對(duì)話框,選擇并單擊對(duì)話框中的Add。圖2.30選擇并單擊Add(12)打開如圖2.31所示的AddPythonInterpreter對(duì)話框,選擇并單擊VirtualenvEnvironment,在右側(cè)的選項(xiàng)卡中選中Existingenvironment單選按鈕,然后單擊“省略號(hào)”按鈕,把python.exe的存儲(chǔ)位置輸入Interpreter文本框中,單擊OK按鈕。說明筆者把python.exe存儲(chǔ)在D盤下的Python文件夾中,因此圖2.31中Interpreter后的文本框中的路徑是D:\Python\python.exe。讀者朋友需根據(jù)具體情況輸入python.exe的存儲(chǔ)位置。(13)這時(shí)窗口將返回至如圖2.29所示的界面,但是與圖2.29不同的是OpenCV-Contrib-Python庫和Numpy庫已經(jīng)添加到PythonDevelop項(xiàng)目中,如圖2.32所示。圖2.31輸入python.exe的存儲(chǔ)位置圖2.32成功添加OpenCV-Contrib-Python庫和Numpy庫(14)單擊圖2.32中的OK按鈕后,即可排除圖2.27中出現(xiàn)的錯(cuò)誤,如圖2.33所示。PyCharm排除錯(cuò)誤會(huì)耗時(shí)30s左右,請(qǐng)耐心等待。圖2.33排除圖2.27中出現(xiàn)的錯(cuò)誤2.4小結(jié)本章分別介紹了Python、OpenCV-Contrib-Python庫、Numpy庫和PyCharm的下載和安裝方法。讀者需要掌握其中的3個(gè)方面內(nèi)容:一是下載可以離線安裝的、標(biāo)記為executableinstaller字樣的Python壓縮包;二是使用pip命令下載OpenCV-Contrib-Python庫和Numpy庫;三是把OpenCV-Contrib-Python庫和Numpy庫配置到PyCharm中。第3章圖像處理的基本操作OpenCV的作用在于讓開發(fā)人員更容易地通過編碼來處理圖像。那么,處理圖像需要執(zhí)行哪些操作呢?圖像處理的基本操作包含4個(gè)方面的內(nèi)容:讀取圖像、顯示圖像、保存圖像和獲取圖像屬性。其中,常用的圖像屬性有3個(gè):shape、size和dtype。本章將依次詳解實(shí)現(xiàn)圖像處理的4個(gè)基本操作,并分別闡明常用的3個(gè)圖像屬性各自的含義及其使用方法。3.1讀取圖像要對(duì)一幅圖像進(jìn)行處理,首先要做的就是讀取這幅圖像。那么,如何才能讀取這幅圖像呢?OpenCV提供了用于讀取圖像的imread()方法,其語法格式如下:
image=cv2.imread(filename,flags)
參數(shù)說明:image:imread()方法的返回值,返回的是讀取到的圖像。filename:要讀取的圖像的完整文件名。例如,要讀取當(dāng)前項(xiàng)目目錄下的3.1.jpg,filename的值為"3.1.jpg"(雙引號(hào)是英文格式的)。flags:讀取圖像顏色類型的標(biāo)記。當(dāng)flags的默認(rèn)值為1時(shí),表示讀取的是彩色圖像,此時(shí)的flags值可以省略;當(dāng)flags的值為0時(shí),表示讀取的是灰度圖像(如果讀取的是彩色圖像,也將轉(zhuǎn)換為與彩色圖像對(duì)應(yīng)的灰度圖像)。說明灰度圖像是一種每個(gè)像素都是從黑到白,被處理為256個(gè)灰度級(jí)別的單色圖像。256個(gè)灰度級(jí)別分別用0(純黑色)~255(純白色)的數(shù)值表示?!緦?shí)例3.1】讀取當(dāng)前項(xiàng)目目錄下的圖像。(實(shí)例位置:資源包\TM\sl\3\01)如圖3.1所示,在PyCharm中的PythonDevelop項(xiàng)目下,有一幅名為3.1.jpg的圖像。在ImageTest.py文件中,先使用imread()方法讀取3.1.jpg,再使用print()方法打印3.1.jpg,代碼如下:
importcv2
#讀取3.1.jpg,等價(jià)于image=cv2.imread("3.1.jpg",1)
image=cv2.imread("3.1.jpg")
print(image)#打印3.1.jpg
上述代碼打印的部分結(jié)果如圖3.2所示。圖3.1PythonDevelop項(xiàng)目下的3.1.jpg圖3.2打印3.1.jpg說明圖3.2輸出的數(shù)字是3.1.jpg的部分像素值。有關(guān)像素和像素值的內(nèi)容,將在本書的第4章進(jìn)行講解。如果3.1.jpg在D盤的根目錄下,應(yīng)該如何使用imread()方法進(jìn)行讀取呢?只需將實(shí)例3.1代碼:
image=cv2.imread("3.1.jpg")
修改為如下代碼:
image=cv2.imread("D:/3.1.jpg")#路徑中不能出現(xiàn)中文
注意"D:/3.1.jpg"等價(jià)于"D:\\3.1.jpg"。3.2顯示圖像相比圖3.2中密密麻麻的數(shù)字,如果能夠?qū)⑦@幅圖像顯示出來,就可以更加直觀地看到它。為此,OpenCV提供了imshow()方法、waitKey()方法和destroyAllWindows()方法。(1)imshow()方法用于顯示圖像,其語法格式如下:
cv2.imshow(winname,mat)
參數(shù)說明:winname:顯示圖像的窗口名稱。mat:要顯示的圖像。(2)waitKey()方法用于等待用戶按下鍵盤上按鍵的時(shí)間。當(dāng)用戶按下鍵盤上的任意按鍵時(shí),將執(zhí)行waitKey()方法,并且獲取waitKey()方法的返回值。其語法格式如下:
retval=cv2.waitKey(delay)
參數(shù)說明:retval:與被按下的按鍵對(duì)應(yīng)的ASCII碼。例如,Esc鍵的ASCII碼是27,當(dāng)用戶按Esc鍵時(shí),waitKey()方法的返回值是27。如果沒有按鍵被按下,waitKey()方法的返回值是-1。delay:等待用戶按下鍵盤上按鍵的時(shí)間,單位為毫秒(ms)。當(dāng)delay的值為負(fù)數(shù)、0或者空時(shí),表示無限等待用戶按下鍵盤上按鍵的時(shí)間。(3)destroyAllWindows()方法用于銷毀所有正在顯示圖像的窗口,其語法格式如下:
cv2.destroyAllWindows()
【實(shí)例3.2】顯示圖像。(實(shí)例位置:資源包\TM\sl\3\02)編寫一個(gè)程序,使用imread()方法、imshow()方法、waitKey()方法和destroyAllWindows()方法,讀取并顯示PythonDevelop項(xiàng)目下的3.1.jpg,代碼如下:
importcv2
image=cv2.imread("3.1.jpg")#讀取3.1.jpg
cv2.imshow("flower",image)#在名為flower的窗口中顯示3.1.jpg
cv2.waitKey()#按下任何鍵盤按鍵后
cv2.destroyAllWindows()#銷毀所有窗口
上述代碼的運(yùn)行結(jié)果如圖3.3所示。注意(1)顯示圖像的窗口名稱不能使用中文(例如,把實(shí)例3.2第4行代碼中的"flower"修改為"鮮花"),否則會(huì)出現(xiàn)如圖3.4所示的亂碼。(2)為了能夠正常顯示圖像,要在cv2.imshow()之后緊跟著cv2.waitKey()。圖3.3顯示3.1.jpg圖3.4窗口名稱是中文時(shí)出現(xiàn)亂碼依據(jù)imread()方法的語法,如果把實(shí)例3.2第3行代碼:
image=cv2.imread("3.1.jpg")
修改為如下代碼:
image=cv2.imread("3.1.jpg",0)
即可得到由3.1.jpg轉(zhuǎn)換得到的灰度圖像,如圖3.5所示。圖3.5由3.1.jpg轉(zhuǎn)換得到的灰度圖像如果想設(shè)置窗口顯示圖像的時(shí)間為5s,又該如何編寫代碼呢?只需將實(shí)例3.2第5行代碼:
cv2.waitKey()
修改為如下代碼:
cv2.waitKey(5000)#1000ms為1s,5000ms為5s
3.3保存圖像在實(shí)際開發(fā)的過程中,對(duì)一幅圖像進(jìn)行一系列的處理后,需要保存處理圖像后的結(jié)果。為此,OpenCV提供了用于按照指定路徑保存圖像的imwrite()方法,其語法格式如下:
cv2.imwrite(filename,img)
參數(shù)說明:filename:保存圖像時(shí)所用的完整路徑。img:要保存的圖像?!緦?shí)例3.3】保存圖像。(實(shí)例位置:資源包\TM\sl\3\03)編寫一個(gè)程序,把PythonDevelop項(xiàng)目下的3.1.jpg保存為E盤根目錄下的、Pictures文件夾中的1.jpg,代碼如下:
importcv2
image=cv2.imread("3.1.jpg")#讀取3.1.jpg
#把3.1.jpg保存為E盤根目錄下的、Pictures文件夾中的1.jpg
cv2.imwrite("E:/Pictures/1.jpg",image)
運(yùn)行上述代碼前,確認(rèn)E盤根目錄下有Pictures文件夾。如果沒有,在E盤根目錄下新建一個(gè)空的Pictures文件夾。運(yùn)行上述代碼后,打開E盤根目錄下的Pictures文件夾,即可看到1.jpg,如圖3.6所示。圖3.6E盤根目錄下Pictures文件夾中的1.jpg3.4獲取圖像屬性在處理圖像的過程中,經(jīng)常需要獲取圖像的大小、類型等圖像屬性。為此,OpenCV提供了shape、size和dtype3個(gè)常用屬性,具體含義分別如下。shape:如果是彩色圖像,那么獲取的是一個(gè)包含圖像的水平像素、垂直像素和通道數(shù)的數(shù)組,即(垂直像素,水平像素,通道數(shù));如果是灰度圖像,那么獲取的是一個(gè)包含圖像的水平像素和垂直像素的數(shù)組,即(垂直像素,水平像素)。說明垂直像素指的是垂直方向上的像素,水平像素指的是水平方向上的像素。有關(guān)像素、灰度圖像和通道的內(nèi)容,將在本書的第4章和第5章進(jìn)行講解。size:獲取的是圖像包含的像素個(gè)數(shù),其值為“水平像素×垂直像素×通道數(shù)”?;叶葓D像的通道數(shù)為1。dtype:獲取的是圖像的數(shù)據(jù)類型?!緦?shí)例3.4】分別獲取彩色圖像和灰度圖像的屬性。(實(shí)例位置:資源包\TM\sl\3\04)編寫一個(gè)程序,先獲取PythonDevelop項(xiàng)目下的3.1.jpg的屬性,再獲取由3.1.jpg轉(zhuǎn)換得到的灰度圖像的屬性。代碼如下:上述代碼的運(yùn)行結(jié)果如圖3.7所示。圖3.7獲取并打印彩色圖像的屬性說明圖3.7中(292,219,3)的含義是3.1.jpg的垂直像素是292,水平像素是219,通道數(shù)是3。(292,219)的含義是由3.1.jpg轉(zhuǎn)換得到的灰度圖像的垂直像素是292,水平像素是219,通道數(shù)是1。3.5小結(jié)本章主要詳解了兩個(gè)內(nèi)容:圖像處理的基本操作和常用的圖像屬性。讀者在完成圖像處理的基本操作的過程中,要注意3個(gè)問題:一是通過更改參數(shù),imread()方法讀取到的圖像既可以是一幅彩色圖像,也可以是一幅灰度圖像;二是為了能夠正常顯示圖像,要在cv2.imshow()方法后緊跟著cv2.waitKey()方法;三是當(dāng)聲明路徑名時(shí),“/”和“\\”的作用是等價(jià)的(例如,D:/3.1.jpg等價(jià)于D:\\3.1.jpg)。第4章像素的操作像素是圖像的最小單位。每一幅圖像都是由M行N列的像素組成的,其中每一個(gè)像素都存儲(chǔ)一個(gè)像素值。以灰度圖像為例,計(jì)算機(jī)通常把灰度圖像的像素處理為256個(gè)灰度級(jí)別,256個(gè)灰度級(jí)別分別使用區(qū)間[0,255]中的整數(shù)數(shù)值表示。其中,“0”表示純黑色;“255”表示純白色。本章將圍繞著像素展開,介紹如何使用NumPy模塊操作像素。4.1像素像素是構(gòu)成數(shù)字圖像的基本單位?,F(xiàn)有一幅顯示花朵的圖像(見圖4.1),在花瓣邊緣提取一個(gè)小圓圈圈住的區(qū)域,將得到一幅如圖4.2所示的圖像。圖4.1一幅顯示花朵的圖像圖4.2提取并放大圖4.1中被圓圈圈住的區(qū)域不難發(fā)現(xiàn),圖4.2所示的圖像是由許多小方塊組成的,通常把一個(gè)小方塊稱作一個(gè)像素。因此,一個(gè)像素是具有一定面積的一個(gè)塊,而不是一個(gè)點(diǎn)。需要注意的是,像素的形狀是不固定的,大多數(shù)情況下,像素被認(rèn)為是方形的,但有時(shí)也可能是圓形的或者是其他形狀的。4.1.1確定像素的位置以圖4.1為例,在訪問圖4.1中的某個(gè)像素前,要確定這個(gè)像素在圖4.1中的位置。那么,這個(gè)位置應(yīng)該如何確定呢?首先,確定圖4.1在水平方向和垂直方向的像素個(gè)數(shù)。圖4.1的水平方向和垂直方向如圖4.3所示。在Windows10系統(tǒng)的“畫圖”工具中打開圖4.1,得到如圖4.4所示的界面。在這個(gè)界面中,就會(huì)得到圖4.1在水平方向的像素是219個(gè),在垂直方向的像素是292個(gè)。圖4.3圖4.1的水平方向和垂直方向圖4.4用“畫圖”工具打開圖4.1然后,根據(jù)圖4.1在水平方向和垂直方向的像素,繪制如圖4.5所示的坐標(biāo)系。圖4.5根據(jù)圖4.1在水平方向和垂直方向的像素繪制坐標(biāo)系說明圖4.1在水平方向的像素是219個(gè),與其對(duì)應(yīng)的是x軸的取值范圍,即0~218;同理,在垂直方向的像素是292個(gè),與其對(duì)應(yīng)的是y軸的取值范圍,即0~291。這樣,就能夠通過坐標(biāo)來確定某個(gè)像素在圖4.1中的位置。在OpenCV中,正確表示圖4.1中某個(gè)像素坐標(biāo)的方式是(y,x)。例如,在如圖4.5所示的坐標(biāo)系中,圖4.1右下角的像素坐標(biāo)是(291,218)?!緦?shí)例4.1】表示圖4.1中的指定像素。(實(shí)例位置:資源包\TM\sl\4\01)編寫一段代碼,先讀取D盤根目錄下的4.1.jpg,再表示坐標(biāo)(291,218)上的像素,具體如下:
importcv2
image=cv2.imread("D:/4.1.jpg")#讀取D盤根目錄下的4.1.jpg
px=image[291,218]#坐標(biāo)(291,218)上的像素
4.1.2獲取像素的BGR值在4.1.1節(jié)中,已經(jīng)得到了坐標(biāo)(291,218)上的像素px?,F(xiàn)使用print()方法打印這個(gè)像素,將得到這個(gè)像素的BGR值,代碼如下:
print("坐標(biāo)(291,218)上的像素的BGR值是",px)
上述代碼的運(yùn)行結(jié)果如下:
坐標(biāo)(291,218)上的像素的BGR值是[364249]
不難發(fā)現(xiàn),坐標(biāo)(291,218)上的像素的BGR值是由36、42和49這3個(gè)數(shù)值組成的。在講解這3個(gè)數(shù)值各自代表的含義之前,先了解什么是三基色。如圖4.6所示,人眼能夠感知紅色、綠色和藍(lán)色3種不同的顏色,因此把這3種顏色稱作三基色。如果將這3種顏色以不同的比例進(jìn)行混合,人眼就會(huì)感知到豐富多彩的顏色。那么,對(duì)于計(jì)算機(jī)而言,是如何對(duì)這些顏色進(jìn)行編碼的呢?答案就是利用色彩空間。也就是說,色彩空間是計(jì)算機(jī)對(duì)顏色進(jìn)行編碼的模型。以較為常用的RGB色彩空間為例,在RGB色彩空間中,存在3個(gè)通道,即R通道、G通道和B通道。其中,R通道指的是紅色通道;G通道指的是綠色通道;B通道指的是藍(lán)色通道;并且每個(gè)色彩通道都在區(qū)間[0,255]內(nèi)取值。這樣,計(jì)算機(jī)將利用3個(gè)色彩通道的不同組合來表示不同的顏色。如圖4.7所示,通過截圖工具,能夠得到坐標(biāo)(291,218)上的像素值為(49,42,36)。圖4.6三基色圖4.7坐標(biāo)(291,218)上的像素的像素值使用print()方法打印圖4.1中坐標(biāo)(291,218)上的像素px,其結(jié)果是(36,42,49)。而圖4.7中這個(gè)坐標(biāo)上的像素值為(49,42,36)。這時(shí)會(huì)發(fā)現(xiàn)這兩個(gè)結(jié)果中的數(shù)值是相同的,但順序是相反的,這是為什么呢?原因是在RGB色彩空間中,彩色圖像的通道順序是R(49)→G(42)→B(36);但是,在OpenCV中,RGB色彩空間被BGR色彩空間取代,使得彩色圖像的通道順序變?yōu)榱薆(36)→G(42)→R(49)。從上文能夠知曉,在BGR色彩空間的圖像中,每3個(gè)數(shù)值表示一個(gè)像素,這3個(gè)數(shù)值分別表示藍(lán)色、綠色和紅色3種顏色分量,把每一種顏色分量所在的區(qū)域稱作通道。那么,OpenCV是如何獲取指定位置上的像素的B通道、G通道和R通道的值呢?有如下兩種方式(以坐標(biāo)(291,218)上的像素為例)。(1)同時(shí)獲取坐標(biāo)(291,218)上的像素的B通道、G通道和R通道的值,代碼如下:
importcv2
image=cv2.imread("D:/4.1.jpg")
px=image[291,218]#坐標(biāo)(291,218)上的像素
print(px)
上述代碼的運(yùn)行結(jié)果如下:
[364249]
(2)分別獲取坐標(biāo)(291,218)上的像素的B通道、G通道和R通道的值,代碼如下:
importcv2
image=cv2.imread("D:/4.1.jpg")
blue=image[291,218,0]#坐標(biāo)(291,218)上的像素的B通道的值
green=image[291,218,1]#坐標(biāo)(291,218)上的像素的G通道的值
red=image[291,218,2]#坐標(biāo)(291,218)上的像素的R通道的值
print(blue,green,red)
上述代碼的運(yùn)行結(jié)果如下:
364249
說明(1)image[291,218,0]中的最后一個(gè)數(shù)值0表示B通道。(2)image[291,218,1]中的最后一個(gè)數(shù)值1表示G通道。(3)image[291,218,2]中的最后一個(gè)數(shù)值2表示R通道。4.1.3修改像素的BGR值在4.1.2節(jié)中,已經(jīng)獲取了圖4.5中坐標(biāo)(291,218)上的像素px的BGR值,即(36,42,49)?,F(xiàn)要將像素px的BGR值由原來的(36,42,49)修改為(255,255,255),代碼如下:
importcv2
image=cv2.imread("D:/4.1.jpg")
px=image[291,218]
print("坐標(biāo)(291,218)上的像素的初始BGR值是",px)
px=[255,255,255]#把坐標(biāo)(291,218)上的像素的值修改為[255,255,255]
print("坐標(biāo)(291,218)上的像素修改后的BGR值是",px)
上述代碼的運(yùn)行結(jié)果如下:
坐標(biāo)(291,218)上的像素的初始BGR值是[364249]
坐標(biāo)(291,218)上的像素修改后的BGR值是[255,255,255]
說明對(duì)于BGR色彩空間的圖像,當(dāng)每個(gè)像素的B、G、R的3個(gè)數(shù)值相等時(shí),就可以得到灰度圖像。其中,B=G=R=0為純黑色,B=G=R=255為純白色。【實(shí)例4.2】修改圖4.1中指定區(qū)域內(nèi)的所有像素。(實(shí)例位置:資源包\TM\sl\4\02)編寫一個(gè)程序,將圖4.1中的坐標(biāo)(241,168)、(241,218)、(291,168)和(291,218)的4個(gè)點(diǎn)所圍成的區(qū)域內(nèi)的所有像素都修改為純白色,代碼如下:上述代碼的運(yùn)行結(jié)果如圖4.8所示(左側(cè)的圖片是原圖)。圖4.8把指定區(qū)域內(nèi)的所有像素都修改為白色4.2使用NumPy模塊操作像素圖像在OpenCV中以二維或三維數(shù)組表示,數(shù)組中的每一個(gè)值就是圖像的像素值。善于操作數(shù)組的NumPy模塊就成了OpenCV的依賴包。OpenCV中很多操作都要依賴NumPy模塊,例如創(chuàng)建純色圖像、創(chuàng)建掩模和創(chuàng)建卷積核等。本節(jié)將簡單介紹NumPy模塊的常用操作方法,并演示如何利用NumPy模塊創(chuàng)建圖像。4.2.1NumPy概述NumPy(見圖4.9)更像是一個(gè)魔方(見圖4.10),它是Python數(shù)組計(jì)算、矩陣運(yùn)算和科學(xué)計(jì)算的核心庫,NumPy來源于Numerical和Python兩個(gè)單詞。NumPy提供了一個(gè)高性能的數(shù)組對(duì)象,以及可以輕松創(chuàng)建一維數(shù)組、二維數(shù)組和多維數(shù)組等大量實(shí)用方法,幫助開發(fā)者輕松地進(jìn)行數(shù)組計(jì)算,從而廣泛地應(yīng)用于數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、圖像處理和計(jì)算機(jī)圖形學(xué)、數(shù)學(xué)任務(wù)等領(lǐng)域中。由于NumPy是由C語言實(shí)現(xiàn)的,所以其運(yùn)算速度非???。具體功能如下。有一個(gè)強(qiáng)大的N維數(shù)組對(duì)象ndarray。廣播功能方法。線性代數(shù)、傅里葉變換、隨機(jī)數(shù)生成、圖形操作等功能。整合C/C++/Fortran代碼的工具。圖4.9NumPy圖4.10魔方4.2.2數(shù)組的類型在對(duì)數(shù)組進(jìn)行基本操作前,首先了解一下NumPy的數(shù)據(jù)類型。NumPy比Python增加了更多種類的數(shù)值類型,如表4.1所示,為了區(qū)別于Python數(shù)據(jù)類型,NumPy中的bool、int、float、complex等數(shù)據(jù)類型名稱末尾都加了短下畫線“_”。表4.1NumPy數(shù)據(jù)類型每一種數(shù)據(jù)類型都有相應(yīng)的數(shù)據(jù)轉(zhuǎn)換方法。舉例如下:
8(3.141)
np.float64(8)
np.float(True)
結(jié)果為:
3
8.0
1.0
4.2.3創(chuàng)建數(shù)組NumPy提供了很多創(chuàng)建數(shù)組的方法,下面分別介紹。1.最常規(guī)的array()方法NumPy創(chuàng)建簡單的數(shù)組主要使用array()方法,通過傳遞列表、元組來創(chuàng)建NumPy數(shù)組,其中的元素可以是任何對(duì)象,語法如下:
numpy.array(object,dtype,copy,order,subok,ndmin)
參數(shù)說明:object:任何具有數(shù)組接口方法的對(duì)象。dtype:數(shù)據(jù)類型。copy:可選參數(shù),布爾型,默認(rèn)值為True,則object對(duì)象被復(fù)制;否則,只有當(dāng)__array__返回副本,object參數(shù)為嵌套序列,或者需要副本滿足數(shù)據(jù)類型和順序要求時(shí),才會(huì)生成副本。order:元素在內(nèi)存中的出現(xiàn)順序,其值為K、A、C、F。如果object參數(shù)不是數(shù)組,則新創(chuàng)建的數(shù)組將按行排列(C),如果值為F,則按列排列;如果object參數(shù)是一個(gè)數(shù)組,則以下順序成立:C(按行)、F(按列)、A(原順序)、K(元素在內(nèi)存中的出現(xiàn)順序)。說明當(dāng)order是'A',object是一個(gè)既不是'C'也不是'F'order的數(shù)組,并且由于dtype的更改而強(qiáng)制執(zhí)行了一個(gè)副本時(shí),那么結(jié)果的順序不一定是'C'。這可能是一個(gè)bug。subok:布爾型。如果值為True,則傳遞子類,否則返回的數(shù)組將強(qiáng)制為基類數(shù)組(默認(rèn)值)。ndmin:指定生成數(shù)組的最小維數(shù)。下面通過一個(gè)實(shí)例演示如何創(chuàng)建一維數(shù)組和二維數(shù)組?!緦?shí)例4.3】創(chuàng)建一維和二維數(shù)組。(實(shí)例位置:資源包\TM\sl\4\03)分別創(chuàng)建一維數(shù)組和二維數(shù)組,效果如圖4.11所示。圖4.11簡單數(shù)組具體代碼如下:
importnumpyasnp#導(dǎo)入numpy模塊
n1=np.array([1,2,3])#創(chuàng)建一個(gè)簡單的一維數(shù)組
n2=np.array([0.1,0.2,0.3])#創(chuàng)建一個(gè)包含小數(shù)的一維數(shù)組
n3=np.array([[1,2],[3,4]])#創(chuàng)建一個(gè)簡單的二維數(shù)組
【實(shí)例4.4】創(chuàng)建浮點(diǎn)類型數(shù)組。(實(shí)例位置:資源包\TM\sl\4\04)NumPy支持比Python更多種類的數(shù)據(jù)類型,通過dtype參數(shù)可以指定數(shù)組的數(shù)據(jù)類型,具體代碼如下:運(yùn)行結(jié)果如下:
[1.2.3.]
float64
<class'numpy.float64'>
【實(shí)例4.5】創(chuàng)建三維數(shù)組。(實(shí)例位置:資源包\TM\sl\4\05)創(chuàng)建三維數(shù)組是將ndmin參數(shù)值設(shè)為3即可得到三維數(shù)組,具體代碼如下:
importnumpyasnp
nd1=[1,2,3]
nd2=np.array(nd1,ndmin=3)#三維數(shù)組
print(nd2)
運(yùn)行結(jié)果如下:
[[[123]]]
由此結(jié)果可以看出一維數(shù)組被轉(zhuǎn)換成了三維數(shù)組。2.創(chuàng)建指定維度和數(shù)據(jù)類型未初始化的數(shù)組創(chuàng)建指定維度和數(shù)據(jù)類型未初始化的數(shù)組主要使用empty()方法,數(shù)組元素因?yàn)槲幢怀跏蓟瘯?huì)自動(dòng)取隨機(jī)值。如果要改變數(shù)組類型,可以使用dtype參數(shù),如將數(shù)組類型設(shè)為整型,dtype=int?!緦?shí)例4.6】創(chuàng)建2行3列的未初始化數(shù)組。(實(shí)例位置:資源包\TM\sl\4\06)創(chuàng)建2行3列的未初始化數(shù)組,具體代碼如下:
importnumpyasnp
n=np.empty([2,3])
print(n)
運(yùn)行結(jié)果如下:
[[2.22519099e-3072.33647355e-3071.23077925e-312]
[2.33645827e-3072.67023123e-3071.69117157e-306]]
3.創(chuàng)建用0填充的數(shù)組創(chuàng)建用0填充的數(shù)組需要使用zeros()方法,該方法創(chuàng)建的數(shù)組元素均為0。OpenCV經(jīng)常使用該方法創(chuàng)建純黑圖像?!緦?shí)例4.7】創(chuàng)建純0數(shù)組。(實(shí)例位置:資源包\TM\sl\4\07)創(chuàng)建3行、3列、數(shù)字類型為無符號(hào)8位整數(shù)的純0數(shù)組,具體代碼如下:
importnumpyasnp
n=np.zeros((3,3),np.uint8)
print(n)
運(yùn)行結(jié)果如下:
[[000]
[000]
[000]]
4.創(chuàng)建用1填充的數(shù)組創(chuàng)建用1填充的數(shù)組需要使用ones()方法,該方法創(chuàng)建的數(shù)組元素均為1。OpenCV經(jīng)常使用該方法創(chuàng)建純掩模、卷積核等用于計(jì)算的二維數(shù)據(jù)。【實(shí)例4.8】創(chuàng)建純1數(shù)組。(實(shí)例位置:資源包\TM\sl\4\08)創(chuàng)建3行、3列、數(shù)字類型為無符號(hào)8位整數(shù)的純1數(shù)組,具體代碼如下:
importnumpyasnp
n=np.ones((3,3),np.uint8)
print(n)
運(yùn)行結(jié)果如下:
[[111]
[111]
[111]]
5.創(chuàng)建隨機(jī)數(shù)組randint()方法用于生成一定范圍內(nèi)的隨機(jī)整數(shù)數(shù)組,左閉右開區(qū)間([low,high)),語法如下:
numpy.random.randint(low,high,size)
參數(shù)說明:low:隨機(jī)數(shù)最小取值范圍。high:可選參數(shù),隨機(jī)數(shù)最大取值范圍。若high為空,取值范圍為(0,low)。若high不為空,則high必須大于low。size:可選參數(shù),數(shù)組維數(shù)?!緦?shí)例4.9】創(chuàng)建隨機(jī)數(shù)組。(實(shí)例位置:資源包\TM\sl\4\09)生成一定范圍內(nèi)的隨機(jī)數(shù)組,具體代碼如下:
importnumpyasnp
n1=np.random.randint(1,3,10)
print('隨機(jī)生成10個(gè)1~3且不包括3的整數(shù):')
print(n1)
n2=np.random.randint(5,10)
print('size數(shù)組大小為空隨機(jī)返回一個(gè)整數(shù):')
print(n2)
n3=np.random.randint(5,size=(2,5))
print('隨機(jī)生成5以內(nèi)二維數(shù)組:')
print(n3)
運(yùn)行結(jié)果如下:
隨機(jī)生成10個(gè)1~3且不包括3的整數(shù):
[1121112221]
size數(shù)組大小為空隨機(jī)返回一個(gè)整數(shù):
7
隨機(jī)生成5以內(nèi)二維數(shù)組:
[[24322]
[12241]]
4.2.4操作數(shù)組不用編寫循環(huán)即可對(duì)數(shù)據(jù)執(zhí)行批量運(yùn)算,這就是NumPy數(shù)組運(yùn)算的特點(diǎn),NumPy稱為矢量化。大小相等的數(shù)組之間的任何算術(shù)運(yùn)算都可以用NumPy實(shí)現(xiàn)。本節(jié)主要介紹如何復(fù)制數(shù)組和簡單的數(shù)組運(yùn)算。1.加法運(yùn)算例如,加法運(yùn)算是數(shù)組中對(duì)應(yīng)位置的元素相加(即每行對(duì)應(yīng)相加),如圖4.12所示。圖4.12數(shù)組加法運(yùn)算示意圖【實(shí)例4.10】對(duì)數(shù)組做加法運(yùn)算。(實(shí)例位置:資源包\TM\sl\4\10)使用NumPy創(chuàng)建2個(gè)數(shù)組,并讓2個(gè)數(shù)據(jù)進(jìn)行加法運(yùn)算,具體代碼如下:
importnumpyasnp
n1=np.array([1,2])#創(chuàng)建一維數(shù)組
n2=np.array([3,4])
print(n1+n2)#加法運(yùn)算
運(yùn)行結(jié)果如下:
[46]
2.減法和乘除法運(yùn)算除了加法運(yùn)算,還可以實(shí)現(xiàn)數(shù)組的減法、乘法和除法,如圖4.13所示。圖4.13數(shù)組減法和乘除法運(yùn)算示意圖【實(shí)例4.11】對(duì)數(shù)組做減法、乘法和除法運(yùn)算。(實(shí)例位置:資源包\TM\sl\4\11)使用NumPy創(chuàng)建2個(gè)數(shù)組,并讓2個(gè)數(shù)組進(jìn)行減法、乘法和除法運(yùn)算,具體代碼如下:運(yùn)行結(jié)果如下:
[-2-2]
[38]
[0.333333330.5]
3.冪運(yùn)算冪是數(shù)組中對(duì)應(yīng)位置元素的冪運(yùn)算,使用“**”運(yùn)算符進(jìn)行運(yùn)算,效果如圖4.14所示。從圖中得出:數(shù)組n1的元素1和數(shù)組n2的元素3,通過冪運(yùn)算得到的是1的3次冪;數(shù)組n1的元素2和數(shù)組n2的元素4,通過冪運(yùn)算得到的是2的4次冪。圖4.14數(shù)組冪運(yùn)算示意圖【實(shí)例4.12】兩個(gè)數(shù)組做冪運(yùn)算。(實(shí)例位置:資源包\TM\sl\4\12)使用NumPy創(chuàng)建2個(gè)數(shù)組,并讓2個(gè)數(shù)組做冪運(yùn)算,具體代碼如下:
importnumpyasnp
n1=np.array([1,2])#創(chuàng)建一維數(shù)組
n2=np.array([3,4])
print(n1**n2)#冪運(yùn)算
運(yùn)行結(jié)果如下:
[116]
4.比較運(yùn)算NumPy創(chuàng)建的數(shù)組可以使用邏輯運(yùn)算符進(jìn)行比較運(yùn)算,運(yùn)算的結(jié)果是布爾值數(shù)組,數(shù)組中的布爾值為相比較的數(shù)組在相同位置元素的比較結(jié)果?!緦?shí)例4.13】使用邏輯運(yùn)算符比較數(shù)組。(實(shí)例位置:資源包\TM\sl\4\13)使用NumPy創(chuàng)建2個(gè)數(shù)組,分別使用“>=”“==”“<=”和“!=”運(yùn)算符比較2個(gè)數(shù)組,具體代碼如下:運(yùn)行結(jié)果如下:
[FalseFalse]
[FalseFalse]
[TrueTrue]
[TrueTrue]
5.復(fù)制數(shù)組NumPy提供的array()方法可以使用如下語法復(fù)制數(shù)據(jù):
n2=np.array(n1,copy=True)
但開發(fā)過程中更常用的是copy()方法,其語法如下:
n2=n1.copy()
這兩種方法都可以按照原數(shù)組的結(jié)構(gòu)、類型、元素值創(chuàng)建出一個(gè)副本,修改副本中的元素不會(huì)影響到原數(shù)組?!緦?shí)例4.14】復(fù)制數(shù)據(jù),比較復(fù)制的結(jié)果與原數(shù)組是否相同。(實(shí)例位置:資源包\TM\sl\4\14)使用copy()方法復(fù)制數(shù)組,比較2個(gè)數(shù)組是否相同。修改副本數(shù)組中的元素值后,再查看2個(gè)數(shù)組是否相同,具體代碼如下:運(yùn)行結(jié)果如下:
[TrueTrue]
[12]
[92]
[FalseTrue]
4.2.5數(shù)組的索引和切片NumPy數(shù)組元素是通過數(shù)組的索引和切片來訪問和修改的,因此索引和切片是NumPy中最重要、最常用的操作。1.索引所謂數(shù)組的索引,即用于標(biāo)記數(shù)組中對(duì)應(yīng)元素的唯一數(shù)字,從0開始,即數(shù)組中的第一個(gè)元素的索引是0,依次類推。NumPy數(shù)組可以使用標(biāo)準(zhǔn)Python語法x[obj]的語法對(duì)數(shù)組進(jìn)行索引,其中x是數(shù)組,obj是選擇方式?!緦?shí)例4.15】查找一維數(shù)組索引為0的元素。(實(shí)例位置:資源包\TM\sl\4\15)查找數(shù)組n1索引為0的元素,具體代碼如下:
importnumpyasnp
n1=np.array([1,2,3])#創(chuàng)建一維數(shù)組
print(n1[0])
運(yùn)行結(jié)果如下:
1
2.切片式索引數(shù)組的切片可以理解為對(duì)數(shù)組的分割,按照等分或者不等分,將一個(gè)數(shù)組切割為多個(gè)片段,與Python中列表的切片操作一樣。NumPy中用冒號(hào)分隔切片參數(shù)來進(jìn)行切片操作,語法如下:
[start:stop:step]
參數(shù)說明:start:起始索引,若不寫任何值,則表示從0開始的全部索引。stop:終止索引,若不寫任何值,則表示直到末尾的全部索引。step:步長。例如,對(duì)數(shù)組n1進(jìn)行一系列切片式索引操作的示意圖如圖4.15所示。圖4.15切片式索引示意圖【實(shí)例4.16】獲取數(shù)組中某范圍內(nèi)的元素。(實(shí)例位置:資源包\TM\sl\4\16)按照?qǐng)D4.15所示的切片式索引操作獲取數(shù)據(jù)中某范圍的元素,具體代碼如下:運(yùn)行結(jié)果如下:
1
2
[12]
[23]
[12]
切片式索引操作需要注意以下幾點(diǎn)。(1)索引是左閉右開區(qū)間,如上述代碼中的n1[0:2],只能取到索引從0~1的元素,而取不到索引為2的元素。(2)當(dāng)沒有start參數(shù)時(shí),代表從索引0開始取數(shù),如上述代碼中的n1[:2]。(3)start、stop和step3個(gè)參數(shù)都可以是負(fù)數(shù),代表反向索引。以step參數(shù)為例,如圖4.16所示。圖4.16反向索引示意圖【實(shí)例4.17】使用不同的切片式索引操作獲取數(shù)組中的元素。(實(shí)例位置:資源包\TM\sl\4\17)分別演示start、stop、step3種索引的切片場景,具體代碼如下:運(yùn)行結(jié)果如下:
[0123456789]
[012]
[345]
[6789]
[0123456789]
[0123456789]
[02468]
[16]
[28]
[9876543210]
[98]
[76]
[543210]
3.二維數(shù)組索
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025民間個(gè)人向個(gè)人借款合同
- 2025年度知識(shí)產(chǎn)權(quán)保密協(xié)議范本(含研發(fā)成果)3篇
- 二零二五年度科技園區(qū)銀行貸款擔(dān)保協(xié)議2篇
- 2025年度農(nóng)村自建房合同協(xié)議書(含空氣源熱泵安裝)
- 二零二五年度農(nóng)業(yè)現(xiàn)代化農(nóng)村土地承包經(jīng)營權(quán)租賃協(xié)議
- 二零二五年度特種設(shè)備制造許可證轉(zhuǎn)讓合同3篇
- 2025年度飼料行業(yè)人才培養(yǎng)合作協(xié)議詳盡版3篇
- 二零二五年度XX教育機(jī)構(gòu)收取管理費(fèi)服務(wù)協(xié)議3篇
- 2025年二零二五企業(yè)研發(fā)基地場地租賃合作協(xié)議3篇
- 2025年度碼頭租賃及集裝箱裝卸業(yè)務(wù)一體化合作協(xié)議3篇
- 護(hù)理分級(jí)標(biāo)準(zhǔn)2023版(新舊標(biāo)準(zhǔn)對(duì)比詳解)
- 機(jī)電運(yùn)輸安全基本知識(shí)
- XX藥業(yè)公司受試者日記卡
- 連鎖藥店GSP質(zhì)量管理體系詳細(xì)文件
- 《電氣工程講》課件
- 甘肅省蘭州市城關(guān)區(qū)2022-2023學(xué)年三年級(jí)上學(xué)期期末數(shù)學(xué)試卷
- GB/T 26940-2023牡蠣干
- 計(jì)算機(jī)網(wǎng)絡(luò)安全第9章VPN
- ERAS標(biāo)準(zhǔn)病房評(píng)審標(biāo)準(zhǔn)表
- 工程開工令(兩令)
- 第五單元整體教學(xué)設(shè)計(jì)-統(tǒng)編版高中語文必修下冊(cè)
評(píng)論
0/150
提交評(píng)論