圖像處理算法及其Python實踐 課件全套 張曉燕第1-9章 Python 程序設計基礎 -圖像描述_第1頁
圖像處理算法及其Python實踐 課件全套 張曉燕第1-9章 Python 程序設計基礎 -圖像描述_第2頁
圖像處理算法及其Python實踐 課件全套 張曉燕第1-9章 Python 程序設計基礎 -圖像描述_第3頁
圖像處理算法及其Python實踐 課件全套 張曉燕第1-9章 Python 程序設計基礎 -圖像描述_第4頁
圖像處理算法及其Python實踐 課件全套 張曉燕第1-9章 Python 程序設計基礎 -圖像描述_第5頁
已閱讀5頁,還剩403頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

圖像處理算法及其Python實踐第1章Python程序設計基礎第2章Python圖像處理基礎第3章深度學習基礎第4章圖像分類第5章圖像分割第6章目標檢測第7章人臉識別第8章圖像風格遷移第9章圖像描述第1章Python程序設計基礎1.1Python語言快速入門1.2Python語法速覽1.3類與模塊1.4圖像界面設計1.1Python語言快速入門Python語言是一門動態類型的解釋型語言。作為解釋型語言,Python不像C++、C語言那樣在運行之前要通過編譯器進行漫長的編譯過程生成二進制文件后才能運行,Python程序只需要在運行的操作系統上安裝Python解釋器就可以運行,Python解釋器會將代碼逐行解釋為機器碼后再運行。雖然Python語言被歸為腳本語言,但是它相比于ShellScript、VBScript等腳本語言只能處理簡單的任務,Python幾乎可以處理所有計算機處理的任務。Python的設計強調代碼的可讀性和簡潔的語法。相對于C++、Java語言,Python的代碼更加簡潔清晰。其缺點也很明顯,運行效率沒有前面兩者那么高效,但在大部分情況下,Python的運行效率完全能滿足需求。在大型的工程項目中,對于性能要求極高的部分,會使用C或C++等語言開發,然后使用Python調用相應的模塊。因此,很多人都把Python當作一種“膠水語言”使用。1.1.1Python的版本與安裝1.Python的實現版本1)CPython。這是由Python軟件基金會創建的官方標準的Python解釋器,也是最流行的Python解釋器。2)ActivePython。這是由ActiveState公司發行的一套企業級二進制Python編程調試工具,帶有集成開發環境IDE(IntegratedDevelopmentEnvironment)。ActivePython有三個發行版本:社區版、商業版和企業版,適用于windows和Linux操作系統,并和其他Python實現兼容。3)Anaconda。Python語言的主要用途就是數據分析和機器學習。當使用Anaconda進行數據科學和科學計算時,可以輕松創建和管理Python和R環境,以確保庫和依賴項的有效管理,同時保持版本兼容性。1.1.1Python的版本與安裝2.Python的開發工具1)VSCode。VSCode是由微軟開發的,同時支持Windows、Linux和MacOS操作系統且開放源代碼的文本編輯器。它支持程序調試,并內置了Git版本控制功能,同時也具有開發環境功能,如代碼補全、代碼片段、代碼重構等。該編輯器支持用戶自定義配置,還支持擴展程序并在編輯器內置了擴展程序管理功能。2)PyCharm。PyCharm是由JetBrains公司開發的一款IDE工具,它集成了一些系列開發功能,如Python包管理、虛擬環境管理、框架整合和Git等。PyCharm大大節省了程序開發時間,程序運行更快捷,且代碼可以自動更新格式,并支持多種操作系統。1.1.1Python的版本與安裝3.Python解釋器和文本編輯器VSCode的下載安裝登錄Python官方網站(/),如圖1-1所示。點擊Downloads->windows,下拉選擇需要的版本,如圖1-2所示。圖1-2版本選擇界面圖1-1Python官網界面1.1.1Python的版本與安裝Python解釋器和文本編輯器VSCode的下載安裝下載后雙擊打開,勾選添加到環境變量,開始安裝,如圖所示。圖1-3添加到環境變量1.1.1Python的版本與安裝Python解釋器和文本編輯器VSCode的下載安裝安裝完成Python解釋器后,進VSCode官網(/)安裝文本編輯器。圖1-4選擇相應版本安裝VSCode1.1.1Python的版本與安裝Python解釋器和文本編輯器VSCode的下載安裝安裝完成之后,雙擊打開,在左側的搜索欄中輸入Python,安裝Python擴展,如圖所示。至此,Python解釋器與文本編輯器安裝完畢。圖1-5在VSCode中進行Python擴展1.1.1Python的版本與安裝Python解釋器和文本編輯器VSCode的下載安裝按下鍵盤上的Win+R鍵,輸入cmd命令進入MS-DOS界面,輸入python,顯示版本為3.8.1,表明python已經正確安裝。圖1-6MSDOS界面1.1.1Python的版本與安裝4.集成開發環境Pycharm下載安裝PyCharm是JetBrains開發的一個流行的Python集成開發環境(IDE),提供了強大的編輯、調試和開發功能。以下是下載和安裝PyCharm的步驟:(1)打開瀏覽器,訪問PyCharm官方下載網站,網址如下所示:/en-us/pycharm/(2)點擊“下載”按鈕,選擇與你的操作系統(Windows、macOS或Linux)相對應的安裝包。(3)下載完成后,雙擊.exe安裝文件,啟動安裝程序。按照安裝向導的步驟進行安裝。你可以選擇安裝路徑,創建桌面快捷方式,并選擇添加到系統PATH環境變量中。1.1.2編寫簡單的Python程序首先,按下鍵盤上的Win+R,輸入cmd命令進入MSDOS界面,輸入python,顯示版本為3.8.1,表明python已經正確安裝。從終端運行程序。在>>>后面即可輸入簡單的Python代碼片段。輸入“print(”HelloWorld!“)”,并按下回車鍵,輸出結果如圖1-7所示。圖1-7從終端運行程序1.1.3編輯和運行復雜的Python程序使用VSCode軟件編寫Python代碼,在VSCode中點擊“新建文件”按鈕,輸入文件名,例如demo.py,在新創建的demo.py文件中,輸入程序“print("HelloVSCode!")”,輸出結果如下圖1-8所示。圖1-8在VSCode中運行程序1.1.3編輯和運行復雜的Python程序使用Pycharm編寫Python程序,打開PyCharm點擊“CreateNewProject”,選擇項目位置和Python解釋器,點擊“Create”。在項目視圖中右鍵項目目錄,選擇“New”->“PythonFile”,輸入文件名(如hello.py)。在hello.py文件中輸入:保存為first.py,并運行,輸出如下:message1="pythonworld"message=f"Hello,welcometo{message1.title()}!"print(message)print("Herewego!")Hello,welcometoPythonWorld!Herewego!1.2Python語法速覽本節將介紹Python語言中的一些基本語法,如一些基本的數據類型、數據結構與簡單的函數使用等。1.2.1數據類型本節將介紹Python語言中的一些基本語法,如一些基本的數據類型、數據結構與簡單的函數使用等。在Python中,常見的數據類型有整型、浮點型、字符串和布爾型,如下表1-1。表1-2列出了Python常用的運算符。數據類型示例整型-2,-1,0,1,2,3浮點型-1.1,-1.4,3.14,1.414字符串‘a’,’Hello’,’aa’,’hello’布爾型其值只有兩個,即False和True操作符描述示例+加法a+b-減法a-b*乘法a*b/除法a/b%取模a%b**指數運算a**b//取商的整數部分a//b==相等a==b!=不相等a!=b>=,<=大于等于,小于等于a>=b,a<=b&按位與a&b|按位或a|b^按位異或a^b~按位取反a~b<<左移運算符,左操作按位左移右操作數指定位數a<<b>>右移運算符,左操作按位右移右操作數指定位數a>>bAnd邏輯與aandbOr邏輯或aorbNot邏輯非nota表1-1表1-21.2.1數據類型Python中,在數學表達式中含有浮點數時,輸出結果一定也是浮點數,有時候包含的小數位數是不確定的。在除法運算時,輸出結果也一定是浮點數,即便能夠被整除。除了整數和浮點型數據,Python還可以處理字符串。在Python中可以用“‘’”或“”“”括起來代表字符串,也可以使用“\”操作符來對特殊字符轉義。例如“\’‘”表示為單引號,“\n”表示為換行符,“\t”為制表符。下面是命令行中演示一些字符處理的例子1.2.1數據類型Python中,可以使用“+”拼接兩個字符串,使用“*”來重復字符串。當多個字符串相鄰時,解釋器會自動合并。如下:>>>a="Hello">>>b="World">>>a+b‘HelloWorld’>>>'Hello''World'‘HelloWorld’>>>2*'A'+'pple'‘Aapple1.2.1數據類型Python可以通過“索引”方式來獲取字符串中某個位置的字符。>>>a='fragrant'>>>a[0]‘f’>>>a[0]+a[5]‘fa’>>>a[-1]‘t’>>>a[-6]‘a’>>>a[-8]‘f’

1.2.1數據類型索引為正數時,從字符串左邊向右查找(0和-0都表示第一個字符)。當索引為負數時,從字符串右邊向左查找。(最右邊的索引為-1,并依次向左為-2,-3...)。想要獲取字符串中的一段字符串,可以通過如下“切片”操作來實現。>>>a='water'>>>a[0:3]‘wat’>>>a[:3]‘wat’>>>a[1:]‘ater’1.2.2列表與元組列表是由一系列按特定順序排列的元素組成,列表通常包含多個元素,非常適合用于存儲在程序運行期間可能變化的數據集。在Python中,用方括號[]表示列表,并用逗號分割其中的元素。下面是一個簡單的列表示例。打印出來的結果包括方括號,輸出如下:app=['a','b','c','d’]print(app)['a','b','c','d']1.2.2列表與元組訪問列表元素,可以通過索引的方式訪問任意元素。輸出結果如下:app=['a','b','c','d']print(app[0])print(app[1])print(app[-1])abd1.2.2列表與元組在Python語言中第一個元素索引為0而不是1,大多數編程語言都是這么規定的。此外,Python語言還通過設定最后一個元素的索引為-1來訪問列表的最后一個元素。修改列表元素的值,通過指定列表名和對應元素的索引,對其重新賦值。示例代碼如下:app=['a','b','c','d']print(app)app[0]='apple’print(app)['a','b','c','d’]['apple','b','c','d']輸出結果如下:1.2.2列表與元組在列表末尾添加元素,可使用方法append()。演示示例代碼如下:app=['red','yellow','blue','green']print(app)app.append('black’)print(app)['red','yellow','blue','green']['red','yellow','blue','green','black']輸出結果如下:1.2.2列表與元組如果想要在列表任意位置插入元素,可使用方法insert()將相應的元素插入到相應的位置。app=['red','yellow','blue','green']print(app)app.insert(1,'black')app.insert(5,'white')print(app)['red','yellow','blue','green']['red','black','yellow','blue','green','white']輸出結果如下:1.2.2列表與元組在Python中,知道列表元素的索引,可使用del語句刪除元素。app=['red','yellow','blue','green']print(app)delapp[1]print(app)['red','yellow','blue','green']['red','blue','green']輸出結果如下:1.2.2列表與元組還可以使用pop()方法刪除列表末尾元素。app=['red','yellow','blue','green']print(app)app.pop()print(app)['red','yellow','blue','green']['red','yellow','blue']輸出結果如下:pop()方法還可以用來刪除指定位置的元素。只需要在()中添加對應元素的索引即可。1.2.2列表與元組元組與列表十分相似,大部分方法都通用,但是元組和列表的最大區別是列表可以修改,可以刪除,而元組不能修改,不能刪除單個元素,但是可以刪除整個元組。元組定義和列表類似,元組定義時只需用“()”把元素括起來,并用“,”把元素隔開。下面定義一個元組,訪問其中一個元素,并將元組打印出來。app=('apple','peach','mango','grape')print("Myfavoritefruitis",app[3])print(app)Myfavoritefruitisgrape('apple','peach','mango','grape')輸出結果如下:1.2.2列表與元組如果定義只包含一個元素的元組,必須在這個元素后面加上一個“,”,否則元素還是原來的類型。app1=('apple')print(type(app1))app2=('apple',)print(type(app2))<class'str'><class'tuple'>輸出結果如下:由輸出結果知,app1為str字符串類型,而app2為tuple元組類型。1.2.2列表與元組由于元組不能修改,所以元組不能單獨刪除部分元素,只能刪除整個元組。示例代碼如下:app=('apple','peach','mango','grape')print(app)app[1]='orange'print(app)('apple','peach','mango','grape')TypeError:'tuple'objectdoesnotsupportitemassignment輸出結果如下:在執行第三行代碼修改元組元素時,輸出會報錯,顯示元組類型不支持修改元素。元組不能刪除單個元素,但可以執行del語句整體刪除。1.2.3字典與集合在Python語言中,字典(dict)是一系列鍵值對。每個鍵都有一個值關聯,可以使用鍵來訪問關聯的值。與鍵關聯的值可以是數值、字符串、列表乃至是字典。任何Python對象都可用作于字典中的值。在Python語言中,字典用放在花括號{}中的一系列鍵值對表示,鍵和值之間用冒號分隔,而鍵值對之間用逗號分隔。下面定義一列表,并將其打印出來。fruit={'Joe':'apple','Michael':'peach','Tony':'mango','Maria':'grape'}print(fruit)輸出結果如下:{'Joe':'apple','Michael':'peach','Tony':'mango','Maria':'grape'}1.2.3字典與集合訪問字典中的值,可通過字典名和對應的鍵來獲取,如獲取鍵“Joe”對應的值,可以用如下代碼實現print(fruit['Joe'])輸出結果:applefruit={'Joe':'apple','Michael':'peach'}fruit['Tony']='mango'#添加Tony鍵delfruit['Joe']#刪除Joe鍵還可以將字典中的值賦值給其他變量使用,也可以通過上面的方式去修改鍵對應的值。字典是一種動態結構,可隨時在其中添加和刪除鍵值對。只要依次指定字典名、用方括號括起來的鍵和相關聯的值就可以在字典末尾添加上一個鍵值對。使用del語句,指定字典名和要刪除的鍵,就可以刪除鍵值對。示例代碼如下:1.2.3字典與集合一個Python字典可能只包含幾個鍵值對,也可能包含含有幾百萬個鍵值對。因此Python支持對字典的遍歷,遍歷的方式有多種。可遍歷字典的所有鍵值對,也可僅遍歷鍵或值。在遍歷所有鍵值對可使用方法items(),它返回一個鍵值隊列表。使用for循環依次將每個鍵值對賦給指定的兩個變量。示例代碼如下:fruit={'Joe':'apple','Michael':'peach','Tony':'mango','Maria':'grape'}forkeys,valuesinfruit.items():#將鍵值對賦值給兩個變量print(keys,values)1.2.3字典與集合輸出結果如下:JoeappleMichaelpeachTonymangoMariagrape在遍歷鍵時只要使用方法keys(),就可訪問字典中的所有鍵。使用values()方法,就可訪問字典中所有鍵所對應的值。示例代碼如下:forkeyinfruit.keys():#在for循環中依次將鍵賦值給變量keyforvalueinfruit.values():#在for循環依次將值賦給變量value1.2.3字典與集合有時候需要將一系列字典存儲到列表中,或者將列表作為值存儲在字典中,或者在字典中嵌套字典,這稱為嵌套。下面演示在字典中嵌套字典。假設有一個字典users,里面設定兩個鍵,每個用戶對應一個鍵,每個鍵對應的值為一個字典,在字典中存儲年齡,性別和愛好。users={'Joe':{'age':'18','sex':'male','hobby':'tabletennis',},'Maria':{'age':'19','sex':'female','hobby':'piano',},}forname,user_moreinusers.items():print("\n"+"name:"+name)print("age:"+user_more['age'],"\t","hobby:"+user_more['hobby'])1.2.3字典與集合輸出結果如下:name:Joeage:18hobby:tabletennis

name:Mariaage:19hobby:piano1.2.3字典與集合集合(set)是Python的一個內置類型,它是一個非常有用的數據結構。它與列表的行為類似,唯一區別在于集合不會包含重復的值。下面演示集合的定義,以及添加和刪除元素。app1=set()#空集合必須使用set()方法定義app1.add('apple')#使用add()方法添加元素app1.add(2)print(app1)app2=set([1,2,3,4])app2.remove(2)#使用remove方法刪除元素print(app2)輸出結果如下:{2,'apple'}{1,3,4}1.2.3字典與集合Python中的集合可以看成數學意義上的無序和無重復元素的集合。并且Python自帶的集合類型支持很多數學意義上的集合操作。app1=set([1,3,4,6,7])app2=set([3,7,4,8,9])print("交集:",app1&app2,"\t","并集:",app1|app2)print("差集:",app2-app1)輸出結果如下:交集:{3,4,7}并集:{1,3,4,6,7,8,9}差集:{8,9}1.2.4程序流程控制所有的編程語言在編寫時都要遵照語言結構和流程控制結構,它們控制整個程序的運行步驟。流程控制包括順序控制,條件控制和循環控制。常用的流程控制語句有if-else語句、for循環語句、while循環語句、continue語句、break語句、pass語句等。if-else語句按照條件選擇執行不同的代碼。if語句格式如下:if表達式:

語句1

語句2.....else:if表達式:....elif表達式:....elif表達式:....else:....或者1.2.4程序流程控制下面演示一個實例。x1=95ifx1<60:print("差")elifx1<80:print("良")elifx1<90:print("優")else:print("極優")極優輸出結果如下:1.2.4程序流程控制循環結構有while語句和for語句。它們格式如下:while表達式:#表達式結果為True時,一直循環下去

語句1

語句2....

for變量in序列:#序列可以是列表,元組等可迭代對象

語句1#變量逐一遍歷序列里的所有元素,遍歷完退出循環體

語句2....1.2.4程序流程控制下面演示兩個實例。x=1whilex<5:print(x)x=x+2輸出結果如下:13x=[1,2,3]foryinx:y=y+1輸出結果如下:2341.2.4程序流程控制在Python中的pass語句是空語句,其作用是保持程序結構的完整性。pass語句不做任何語句,一般用作占位語句。下面演示個實例。foriinrange(3):if1==2:passelse:print(i)輸出結果如下:012從輸出結果可以看出,pass語句并沒有執行任何操作,只是保持了程序繼續執行。1.2.4程序流程控制在Python中,縮進至關重要,行首的空格決定邏輯行的縮進層次,從而決定語句的分組,縮進不正確,就會引起程序出錯。根據前面幾種流程控制語句的學習,我們知道在流程控制語句之后必有縮進的語法塊,有時候可能并不需要執行什么東西,然而空的語句并沒有提供縮進,這時就需要pass語句來占位,保持程序的完整運行。前面的流程控制中,只要表達式的邏輯為真,循環就會一直運行下去。有時候我們需要立即跳出循環體,這時候就需要用到break語句和continue語句。1.2.4程序流程控制在執行break語句時,會立即退出循環體,直接結束整個循環體。而continue語句并不會退出整個循環體,而是跳過當前循環體去執行之后的循環。下面演示實例。foriinrange(4):ifi>1:breakprint(i)輸出結果如下:011.2.5函數定義與調用在編程中會經常執行類似的操作,這些操作由同一段代碼完成。函數的出現把相對獨立的某些功能抽象出來,成為一個獨立的個體,調用函數可以幫助我們避免重復編寫這些代碼。函數定義時,通常會包含一個或多個形參(函數的參數),調用函數時會傳入一個或多個實參(實際傳遞給函數的值)。下面是函數定義的基本語法格式:deffunction_name(arg1,arg2):functionbodyreturnvalue以上就是函數的基本定義,以“def”開頭,加上函數名。在后面的括號內加入形參,可能一個或多個,也可能沒有。之后根據需求書寫函數內容,并在函數定義最后返回想要的值,也可以沒有返回值,根據需要定義。1.2.5函數定義與調用下面演示一個示例:defgreet(name,language):print("Hello,"+name)print("Welcometo"+language+"world!")greet("Joe","Python")此處定義函數greet(),函數實現打印兩條語句的功能。調用函數時,提供兩個實參“Joe”和“Python”分別傳遞給兩個形參name和language。調用函數greet輸出為:Hello,JoeWelcometoPythonworld!1.3類與模塊Python是一種面向對象的編程語言,本小節將要介紹Python中的類和對象的相關概念與基本使用,同時引入模塊的概念,學習該如何導入、調用與創建模塊。1.3.1類與對象面向對象編程是一種程序設計范式,其中程序由多個對象組成。對象不僅可以定義復雜的數據結構,還可以包含復雜的算法和方法。對象將數據和方法封裝在一起,開發者只需處理對象內部的數據和算法,并提供接口來調用這些功能。類必須在定義后才能使用,定義一個類也就是定義這一類對象的模板,定義它的屬性和方法。在Python中提供了class關鍵字來聲明一個類,類名首字母大寫。class中有成員屬性和方法。類的定義如下:class[類名]:def__init__(self,args1,args2):#定義成員屬性...def[方法名](self):#定義成員方法...1.3.1類與對象下面演示一個實例,創建一個描述人的類Person。Person類中定義兩個屬性name1和age1,構造了兩個方法sleep()和study()。classPerson:def__init__(self,name,hobby):#定義屬性1=nameself.hobby1=hobbydefsleep(self):#定義方法print(1,"issleepingnow")defstudy(self):#定義方法print(1,"isfondof",self.hobby1)person1=Person('Michael','sports')#創建實例對象person1person1.sleep()#調用sleep()方法person1.study()#調用study()方法1.3.1類與對象在創建實例時,有些屬性無須提供實參,并通過形參來定義,可在方法__init__中為其指定默認值。例如上面的Person類,可默認屬性eyes為‘two’,如下:classPerson:def__init__(self,name,hobby):1=nameself.hobby1=hobbyself.eyes='two'defsleep(self):print(1,"issleepingnow")defstudy(self):print(1,"isfondof",self.hobby1)defstruct(self):print("Thispersonhas",self.eyes,"eyes")person1=Person('Michael','sports')person1.struct()Thispersonhastwoeyes1.3.1類與對象在使用類來模擬現實世界的許多場景時,通常需要修改實例的屬性,修改方法有兩種:一是通過實例進行修改,二是在類的內部定義函數進行屬性修改。classPerson:def__init__(self,name,hobby):1=nameself.hobby1=hobby

defsleep(self):print(1,"issleepingnow")

defstudy(self):print(1,"isfondof",self.hobby1)

defmodify(self,hobby_):#定義修改hobby1屬性值的方法self.hobby1=hobby_print(1,"isfondof",self.hobby1)

#創建實例對象person1=Person('Michael','sports')

#通過方法輸出屬性值person1.study()#直接使用句點表示法修改屬性值person1.name1='John'#直接修改name1屬性值print(1,"isnowfondof",person1.hobby1)

#通過方法修改屬性值person1.modify('arts’)Print(person。name

MichaelisfondofsportsJohnisfondofarts輸出結果如下:1.3.2類的繼承與多態面向對象的編程具有三大特性,即封裝性、繼承性和多態性。這些特性使得程序設計具有良好的擴展性和健壯性。類與對象、函數等的創建,在一定程度上體現了Python語言的封裝特性,它將代碼封裝成一個個子模塊,不僅使得代碼邏輯清晰,而且提高了代碼的復用性。下面將介紹另外兩大特性,繼承與多態。1.3.2類的繼承與多態繼承是一種對類進行分層級劃分的概念。繼承的基本思想是在一個類的基礎上制定出一個新的類,這個新的類不僅可以繼承原來類的屬性和方法,還可以增加新的屬性和方法。原來的類被成為父類,新的類被成為子類。在Python中,定義子類和定義普通類的方法相同,只是需要在子類的括號里增加需要繼承的父類的名字。定義形式如下:classBaseClass1:#定義父類def__init__(self,args1,args2):[語法塊]deffunction__1(self):[語法塊]...classSubClass(BaseClass1):#定義子類,在括號內表明繼承的父類名稱def__init__(self,srgs1,args2):super().__init__(args1,args2)#使用super()調用父類__init__()[語法塊]#可以定義子類特有屬性deffunction_2(self):#可以可定義子類特有方法[語法塊]...1.3.2類的繼承與多態下面演示一個實例。classPerson:def__init__(self,name,food):1=nameself.food1=fooddeflife(self):print(1,"isfondof",self.food1)classMyperson(Person):def__init__(self,name,food,fruit__):super().__init__(name,food)#使用super()調用父類__init__()方法self.fruits=fruit__#定義子類特有的屬性self.diets={}defdiet(self,diet__):#定義子類特有的方法。self.diets=diet__print("Hisaffectionsfor",self.food1+":")print("\t"+"fruits:",end="")forfruits1inself.fruits:print(fruits1,end="")print('\n\t'+"others:",self.diets)user1=Myperson('Michael','Chinesefoods',['orange','apple','mango'])#子類實例user1.life()#子類實例調用父類方法diets__table={'vegetables':'tomato','beanprducts':'tofu','meat':'pork'}user1.diet(diets__table)#子類實例調用子類方法輸出如下:MichaelisfondofCinesefoodsHisaffectionsforCinesefoods:fruits:orangeapplemangoothers:{'vegetables':'tomato','beanprducts':'tofu','meat':'pork'}1.3.2類的繼承與多態類的多態繼承的思想可以幫助我們重復使用代碼,但有時候子類的行為會和父類有所不同。當子類和父類有相同的方法時,子類的方法會覆蓋父類的方法,這樣的代碼在運行時總會調用子類的方法,這就是多態。多態會根據類的不同表現出不同的行為。下面演示一個示例。1.3.2類的繼承與多態輸出結果如下#定義基類FruitclassFruit:defkind(self):print("fruit")#定義繼承自Fruit的子類OrangeclassOrange(Fruit):defkind(self):print("orange")

#定義繼承自Orange的子類AppleclassApple(Orange):defkind(self):print("apple")#創建Fruit類的實例type_1=Fruit()type_1.kind()#輸出:fruit,多態表現為調用Fruit類的kind方法

#創建Orange類的實例type_2=Orange()type_2.kind()#輸出:orange,多態表現為調用Orange類的kind方法

#創建Apple類的實例type_3=Apple()type_3.kind()#輸出:apple,多態表現為調用Apple類的kind方法Fruitorangeapple由輸出結果可知,當子類和父類方法一樣時,子類會覆蓋父類的方法,表現出與父類不同的行為。1.3.3模塊模塊就是一個包含Python定義和聲明的“.py”文件,里面包含一些定義的變量和函數。Python解釋器通過模塊來組織代碼,通過“包”來加以組織模塊,而“包”包含模塊且至少包含一個__init__.py的文件。簡單來說,包就是文件夾,且該文件夾下必須有__init__.py文件,該文件的內容可以為空。__init__.py用于標識當前文件夾是一個包。下面給出如何從一個包文件里面加載模塊,以及模塊中的類和函數。1.3.3模塊#從包里加載模塊frompackageNameimportmoduleName

#給加載的模塊取別名為aliasNamefrompackageNameimportmoduleNameasaliasName

#從模塊里加載類frommoduleNameimportclassName

#給加載的類取別名為aliasClassNamefrommoduleNameimportclassNameasaliasClassName

#從模塊里加載函數frommoduleNameimportfunctionName

#給加載的函數取別名為aliasFunctionNamefrommoduleNameimportfunctionNameasaliasFunctionName

#從包里直接加載類frompackageName.moduleNameimportclassName

#從包里直接加載函數frompackageName.moduleNameimportfunctionName

#直接加載包importpackageName1.3.3模塊調用其中的類或函數使用句點法。加載方式不同,那么調用其中的類和函數的方式也會不同。如果直接加載到類或函數,則直接調用。無須帶有包名或者模塊名。如果加載到模塊,調用其中的類或函數,則要帶有模塊名。示例代碼如下:frompackageNameimportmoduleNamemoduleName.funtionName()#調用模塊中的函數classfact=moduleName.className(args1,args2)#調用模塊中的類如果直接加載包,則要寫成:importpackNamepackageName.moduleName.funtionName()#調用模塊中的函數classfact=packageName.moduleName.className(args1,args2)#調用模塊中的類1.3.3模塊下面自建一個簡單的包文件,里面含有一個__init__.py文件和一個food.py文件。其中__init__.py可以什么內容都不填寫,只是單純證明這是一個可被加載調用的包。在food.py文件中編寫一個模塊,模塊中含有一個類Fruit和一個函數inp()。文件夾內容如下:工作文件夾never_give_up:|-------包文件夾my__Package|---------__init__.py|---------food.py|-------main_.py文件下面開始在main_.py文件中加載food模塊,調用其中的類和函數。Food模塊如下:classFruit():#定義類def__init__(self,name):=namedefdecison(self,fruit11):self.fruitw=fruit11forfruitsinself.fruitw:iffruits=='orange':print("Youlivelifetothefullest!")else:pass

definp():#定義函數fruit2=[]foriinrange(0,4):xy=input()fruit2.append(xy)returnfruit21.3.3模塊main_.py文件如下:frommy_Packageimportfoodastt#加載包中的food模塊fruit11=tt.inp()#調用模塊food中的函數inp()fruit_=tt.Fruit('Michael')#調用模塊food中的類Fruitfruit_.decison(fruit11)#調用類中的函數decison()依次輸入如下內容:Applemangoorangestrawberry輸出結果如下:Youlivelifetothefullest!1.3.3模塊除了自己定義的模塊和包之外,Python官方還提供了許多內置的包和模塊,這些被稱為標準庫。標準庫是隨Python解釋器一同安裝的,包含了許多功能強大的模塊,幫助開發者完成各種常見的編程任務。例如,常用的標準庫模塊包括sys模塊(用于訪問Python解釋器的參數和功能)、os模塊(用于與操作系統進行交互)和math模塊(提供數學計算功能)等。sys模塊用來查看操作系統的信息,語法格式如下:importsysprint(sys.platform)1.3.3模塊os模塊獲取當前文件所在目錄,語法格式如下:importosprint(os.path.dirname(__file__))os獲取當前當前路徑以及切換當前路徑,語法格式如下:importosprint(os.getcwd())os.chdir("c:\\")#切到C盤根目錄print(os.getcwd())math模塊提供了兩個常量以及一些復雜的數學計算函數示例代碼如下:importmathprint(math.pi)#圓周率piprint(math.e)#自然常數e輸出如下:3.1415926535897932.7182818284590451.4圖像界面設計圖形用戶界面概述圖形用戶界面(GraphicalUserInterface)是采用圖形方式顯示的計算機操作用戶界面。它是一種一種人與計算機通信的界面顯示格式,允許用戶使用鼠標等輸入設備操縱屏幕上的圖形或菜單選項,以選擇命令,調用文件,啟動程序或執行一些其它的日常任務。與通過輸入字符命令的字符界面相比,圖像用戶界面擁有許多優點和方便之處。圖形用戶界面由窗口,下拉菜單,對話框以及相應的控制部件等組成,在圖形用戶界面中,用戶看到的和操作的都是圖形對象。在Python開發GUI程序時,有許多GUI庫可用,比如Tkinter、wxPython、PyQT、PySide等。像wxPython、PyQT等適合大型的GUI程序編寫,Tkinter比較適合輕量級的GUI程序。Tkinter庫是Python語言的內置GUI庫,使用時直接導入即可,對于初學者比較方便。Tkinter是Python語言標準GUI工具包的接口,用于開發跨平臺的GUI應用程序。它通過內部嵌入的Tcl解釋器,將Python調用轉化為Tcl命令,從而實現了快速創建GUI界面應用程序的功能。Tkinter本質上是Python封裝的Tcl代碼,通過Tcl解釋器來執行,以支持GUI界面的創建和操作。1.4.2窗體容器和組件基于Tkinter模塊創建GUI程序包含以下四個核心步驟。(1)創建應用程序主窗口對象fromtkinterimport*Root=Tk()(2)在主窗口中,添加可視化組件,如按鈕(Button)、文本框(Label)等。bt01=Button(root)bt01["text"]=

"Helloworld"(3)通過幾何布局管理器,管理組件大小和位置bt01.pack()(4) 事件處理。通過綁定事件處理程序,相應用戶操作所觸發的事件。defsay_hello(e):Messagebox.showinfo("Message","HelloUsers!")print("Helloworld")bt01.bind("<Button-1>",say_hello)1.4.2窗體容器和組件圖形用戶界面是一個個組件組成的,就像小孩搭建積木一樣最終組成了整個界面,有的組件還能在里面放置其他組件,這樣稱之為容器。Tkinter的GUI組件繼承關系圖如圖所示。從關系圖可以看出,Object是所有類的根基類。在Object下包含有五種基類:Misc、Pack、Place、Grid、Wm。Misc它提供了可視化組件的基礎功能,例如配置選項和方法,Wm主要提供了一些與窗口管理器通信有關的功能函數,Place、Pack、Grid則為布局管理器,管理組件大小、位置等。1.4.2窗體容器和組件在Misc中有一個重要的類是Widget,它包含了Tkinter模塊所有的可視化組件。如圖1-10是常見的Widget的可視化組件。通過Widget組件可以實現多種用戶交互和界面設計需求,包括創建窗口、顯示文本、處理用戶輸入、繪制圖形、組織布局等。了解這些組件及其用途,有助于你選擇合適的工具來構建應用程序的界面,并實現用戶所需的功能。1.4.2窗體容器和組件在Tkinter中,可以使用geometry("wxh±x±y")方法來設置主窗口的位置和大小。這里的w代表窗口的寬度,h代表窗口的高度。+x表示窗口距離屏幕左邊的距離,-x表示距離屏幕右邊的距離,+y表示距離屏幕上邊的距離,-y表示距離屏幕下邊的距離。下面的代碼為創建一個根窗口并設置其標題和尺寸的示例代碼。fromtkinterimport*root=Tk()#調用Tk類,創建根窗口root.title("第一個GUI程序")#添加標題root.geometry("500x300+400+150")#定義窗口大小root.mainloop()#顯示1.4.2窗體容器和組件下面的實例演示了為窗口添加組件,并為組件綁定事件的方法。fromtkinterimport*fromtkinterimportmessageboxdefsay_hello(e):messagebox.showinfo("Message","HelloUsers!")root=Tk()#調用Tk類,創建根窗口root.title("第一個GUI程序")#添加標題root.geometry("500x300+400+150")#定義窗口大小btn01=Button(root)#創建組件按鈕btn01["text"]="click"btn01.pack()#調用布局管理器btn01.bind("<Button-1>",say_hello)#綁定事件root.mainloop()單擊click按鈕,結果如下:1.4.2窗體容器和組件下面使用面向對象的方式寫一個簡單的GUI程序。fromtkinterimport*fromtkinterimportmessageboxclassApplication(Frame):def__init__(self,master):super().__init__(master)self.master=masterself.creatwidgets1()self.pack()defcreatwidgets1(self):globalphotophoto=PhotoImage(file='sea_1.gif')self.label01=Label(self,image=photo)self.label01.pack()self.label02=Label(self,text="beautifulsea\n美麗的海景",fg="blue",bg="yellow",width=20,height=2,font=("微軟雅黑",18),justify=CENTER)self.label02.pack()self.btn=Button(self,text="click",fg="

white",bg="green",font=("微軟雅黑",14),width=8,height=2,command=self.write__)self.btn.pack()defwrite__(self):messagebox.showinfo("write","HelloSea!")root=Tk()root.geometry("500x350+400+150")root.title("HelloSea")root.resizable(width=False,height=False)app=Application(root)root.mainloop()輸出結果如圖1-13所示1.4.3界面布局管理一個GUI應用程序必然有大量的組件,這時候就需要使用布局管理器來組織管理父組件中的子組件的布局方式。Tkinter提供了三種布局管理器:pack、grid、place。grid是表格布局管理器,采用表格結構組織組件,子組件的位置由行和列的單元格來確定,并且可以跨行和跨列,從而實現復雜的布局。下面演示一個實例。fromtkinterimport*classApplicaition(Frame):def__init__(self,master):super().__init__(master)self.master=master;self.pack()self.creatwidget()defcreatwidget(self):self.label1=Label(self,text="用戶名")self.label1.grid(row=1,column=0)self.entry1=Entry(self)self.entry1.grid(row=1,column=1)Label(self,text="Wechat登錄orQQ登錄").grid(row=1,column=2)Label(self,text="密碼").grid(row=2,column=0)Entry(self,show="*").grid(row=2,column=1)btn01=Button(self,text="登錄")btn01.grid(row=3,column=1,sticky=EW)Button(self,text="取消").grid(row=3,column=2)globalphoto;photo=PhotoImage(file='sea_1.gif')self.label2=Label(self,image=photo)self.label2.grid(row=0,column=0,columnspan=3,sticky=EW)

root=Tk()root.geometry("600x400+320+160")root.title("登錄界面")app=Applicaition(root)root.mainloop()1.4.3界面布局管理pack布局是在之前的實例中使用過,它是按照組件的創建順序將子組件添加到父組件中,按照垂直或者水平的方向自然排布。如果不指定任何選項,默認在父組件中自頂向下垂直添加組件。pack是代碼最少,最簡單的一種布局方式,可以用于快速生成界面。下面演示一個簡單的實例。fromtkinterimport*root=Tk()root.geometry("500x300")Button(root,text="A",bg="green",fg="white").pack(expand="no",side="top",fill="x",padx=20,pady=30)Button(root,text="B",bg="red",fg="white").pack(side="bottom",fill="x",padx=20,pady=30)Button(root,text="C",bg="purple",fg="white").pack(side="left",fill="y",padx=10,pady=10)Button(root,text="D",bg="cyan",fg="black").pack(side="right",fill="y",padx=10,pady=10)Button(root,text="E",bg="blue",fg="white").pack(expand="yes",fill="both")root.mainloop()1.4.4文本框及其他組件Entry組件是Tkinter庫中的一個用于接收單行文本輸入的控件。它是創建簡單文本輸入框的基礎組件。用戶可以在Entry組件中輸入、編輯和刪除文本。如果用戶輸入的文字長度大于Entry控件的寬度時,文字會自動向后滾動。組件名稱功能描述width設置文本框的寬度,寬度值每加1則加一個字節insert文本框插入數據,可以指定插入數據的位置delete刪除文本框中的數據,可以通過數據位置,指定刪除的數據get獲取文本框中的數據,可以通過數據位置,指定獲取的數據relief文本框樣式,設置控件顯示效果,可選的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。bd設置文本框的邊框大小,值越大邊框越寬bg設置文本框默認背景色fg設置文本框默認前景色,即字體顏色font文本字體,文字字號,文字字形。字形有overstrike/italic/bold/underlinestate文本框狀態選項,狀態有DISABLED/NORMAL,DISABLED狀態文本框無法輸入,NORMAL狀態可以正常輸入highlightcolor設置文本框點擊后的邊框顏色highlightthickness設置文本框點擊后的邊框大小selectbackground選中文字的背景顏色selectboderwidth選中文字的背景邊框寬selectforeground選中文字的顏色show指定文本框內容顯示的字符第2章Python圖像處理基礎2.1圖像處理類PIL2.2繪圖類Matplotlib2.3科學計算類庫NumPy2.4數值運算類庫SciPy2.1圖像處理類PIL在Python2中,PIL(PythonImagingLibrary)是一個非常好用的圖像處理庫,但PIL不支持Python3。因此開發者在Python3中提供了Pillow庫,它是PIL庫的1.1.7版本的一個分岔,在使用時需要導入PIL,而不是導入Pillow。在Pillow庫中,除了有很多模塊,還有許多插件。其中最常用也最為基礎的是Image模塊中同名的Image類,其他很多模塊都是在Image模塊的基礎之上對圖像進行進一步的處理。表2-1列出了Image類的一些常用屬性。2.1.1圖像打開與模式轉換常用屬性描述mode圖像模式,如RGB表示真彩圖像,L表示灰度圖像等width圖像的像素寬度height圖像的像素高度format圖像的格式,如JPG,PNG,BMP,GIF等size圖像的大小,由寬度和高度組成的一個元組readonly表示圖像是否為只讀info表示圖像信息,是一個包含圖像信息的字典category表示圖像的類別表2-1Image類常用屬性2.1.1圖像打開與模式轉換首先使用open()方法打開圖像,并且獲取圖像的一些屬性。表2-1列出使用Image類的一些常用屬性。下面演示一個實例。fromPILimportImageimg=Image.open("pictures\\cvb.png");img.show()print(img.width,img.height,img.size)print(img.mode,img.format,img.readonly,img._category);print()輸出如下:19201080(1920,1080)RGBPNG00{'dpi':(96.012,96.012)}2.1.1圖像打開與模式轉換上述代碼引入了Image模塊,并以open()方法打開了“cvb.png”這個圖像,構建了名為img的實例。如果打開失敗,則會拋出IOError異常。圖2-1使用open()方法打開的圖像2.1.1圖像打開與模式轉換圖像模式是在數字圖像處理和計算機圖形領域中廣泛使用的一種重要概念。這些模式定義了圖像如何編碼和表示,決定了圖像中可用的顏色和信息量。每種模式都有其特定的應用領域和優勢,根據需要選擇合適的模式可以有效地處理和呈現圖像。表2-2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論