二值化图像去除小黑点_python与图像工程(2020.10.11)
一、think python——字符串str、列表list、字典dict、元組tuple的比較
在think python的學習中,第八、十、十一、十二章介紹了四種相似的數(shù)據(jù)類型:字符串、列表、字典、元組,四者常常結(jié)合使用,因此基于書中內(nèi)容對四者的區(qū)別進行簡單總結(jié):
1.基本
下面是字符串、列表、字典、元組的例子
zifuchuan='abc123' liebiao=[a,b,c,1,2,3] zidian={'a':1,'b':2,'c':3} yuanzu=('a','b','c',1,2,3,[1,2],(1,2))因此這四種類型在形式上有著明顯區(qū)別:
- 字符串是字符的序列,索引為整數(shù)
- 列表是多個值的序列,值可以為字符串、浮點數(shù)、整數(shù)、另一個列表,索引為整數(shù)
- 字典是索引與值的關(guān)聯(lián)(鍵值對)的集合,與列表和字符串不同,該索引不必為整數(shù)
- 元組是也是值的序列,值可以為字符串、列表、元組等等,索引為整數(shù),與列表非常相似,但存在著其他不同
2.有序性
think python書中的描述為,字符串、列表、元組都是有序的,而字典是無序的,也就是說遍歷字典所有的鍵,結(jié)果的順序是不可知的
def print_hist(h):for c in h:print(c, h[c]) zidian={'a':1,'b':2,'c':3} print_hist(zidian)但是結(jié)果:
a 1b 2
c 3
這個結(jié)果保持不變,經(jīng)過查閱資料發(fā)現(xiàn),Python3.6之后字典函數(shù)dict的內(nèi)部算法被改變了,也為有序的。
因此,只有3.6之前的版本的字典是無序的,其他皆為有序。
3.可變性
字符串和元組均不可變,列表和字典均可變。
也就是說字符串和元組不能通過索引,改變該二者的某一個字符,而字典和列表可以通過賦值改變。
字符串和元組,只能通過切片方法,創(chuàng)造一個新的字符串和元組,近似改變,例如:
zifuchuan='abc123' zifuchuan1='z'+zifuchuan[1:] print(zifuchuan1)zbc123而這種近似改變的嫁接,并不會影響原字符串或者元組。
由于可變性,這四種增加元素的方法也不同
4.增加元素
字符串和元組只能通過+運算符,創(chuàng)造一個新的字符串和元組,例如:
而列表可以通過列表方法中的append添加,字典則可以利用d['key']='value',為字典添加一個新的鍵值對。
附:
由于字符串、列表、字典、元組均有所不同,因此在實際編程中,常常需要進行序列的嵌套:列表嵌套列表、元組嵌套元組,元組嵌套列表等等,而哪種更合適則需要通過更深入的學習和熟練的運用進行判斷,書中第十二章元組的序列嵌套小節(jié)對其進行了簡要的敘述:
顯而易見的是,字符串比其他序列的限制更多,因為它的所有元素都必須是字符,且字符串不可變。如果你希望能夠改變字符串中的字符,使用列表嵌套字符或許更合適。列表比元組更常用,主要是因為它們是可變的。 但是有些情況下,你可能更傾向于使用元組:
在一些情況下(例如 return 語句),從句式上生成一個元組比列表要簡單。
如果你想使用一個序列作為字典的鍵,那么你必須使用元組或字符串這樣的不可變類型。
如果你向函數(shù)傳入一個序列作為參數(shù),那么使用元組可以降低由于別名而產(chǎn)生的意外行為的可能性。
二、圖像工程導論——形態(tài)學處理
1.形態(tài)學基本操作:膨脹與腐蝕
膨脹與腐蝕往往在二值圖像進行,二者均利用任意形狀的h內(nèi)核與二值圖像做卷積,其中進行膨脹操作時,將內(nèi)核劃過圖像,將內(nèi)核的覆蓋區(qū)域的最大像素值提取,并代替錨點位置的像素,而腐蝕相反,提取的時區(qū)域內(nèi)的最小像素值。
通俗的解釋就是:膨脹讓白色更大,腐蝕讓黑色更大
下面是例子,將圖像轉(zhuǎn)化為灰度圖像后進行二值化,進而執(zhí)行膨脹的腐蝕操作
import cv2 as cv img =cv.imread('HIT.jpg') imgg=cv.cvtColor(img,cv.COLOR_BGR2GRAY) ret,img_thr = cv.threshold(imgg,200,255,cv.THRESH_BINARY_INV) kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,5)) dst = cv.erode(img_thr,kernel,iterations=1) dst1= cv.dilate(img_thr,kernel,iterations=1) cv.imshow('erzhihua',img_thr) cv.imshow('fushi',dst) cv.imshow('pengzhang',dst1)二值化圖像膨脹操作膨脹ca
腐蝕操作2.形態(tài)學組合操作
開運算:先腐蝕后膨脹,腐蝕可以消除噪聲并且收縮白色的目標,之后的膨脹可以將物體擴大會原來大小,因此可用于降噪,使用方法:
open= cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)閉運算:先膨脹后腐蝕,與開運算相似,能關(guān)閉物體的小孔、暗區(qū)、小黑點等,使用方法:
close=cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)形態(tài)學梯度:膨脹結(jié)果與腐蝕結(jié)果的差,由于擴張的圖像減去了收縮的圖像,因此可以保留物體的邊緣輪廓。
頂帽:原圖像與開運算結(jié)果的差,能夠突出比原圖輪廓周圍的區(qū)域更明亮的區(qū)域
黑帽:閉運算與原圖像結(jié)果的差,能夠突出突出比原圖輪廓周圍的區(qū)域更暗的區(qū)域
上述組合操作均可以利用cv2.morphologyEx函數(shù),通過改變內(nèi)部參數(shù)實現(xiàn),也可以利用膨脹和腐蝕這兩種基礎(chǔ)操作,根據(jù)組合操作的定義進行操作。
三、python調(diào)用其他文件的函數(shù)
我們在使用python進行函數(shù)編寫時,經(jīng)常需要調(diào)用其他文件中已經(jīng)編寫好的函數(shù),假設(shè)我們的主程序為A.py,需要導入的文件和函數(shù)分別為B.py和C(),具體的調(diào)用方法分成以下幾種情況:
或者若只需調(diào)用一個函數(shù),也可以
from B import C C()2.A和B不在同一目錄
我將B.py放在了我的主文件夾中,此時調(diào)用的方法為
import sys sys.path.append('/home/yzsz') import B B.C()這里調(diào)用的sys模塊,能夠提供對解釋器的使用或者維護的變量的訪問,其中sys.path是一個包含指定模塊搜索路徑的列表,因此,將你想要導入的模塊路徑加入其中即可調(diào)用。
注意:
在試用同目錄調(diào)用的時,我自定義了一個模塊abc.py,這里只有一個函數(shù)aa,他會打印字符串'hello world',但是卻出現(xiàn)了如下的錯誤:
AttributeError: module 'abc' has no attribute 'aa'也就是說,尋找到了abc模塊,但是未找到aa函數(shù),最終發(fā)現(xiàn)問題在于python自帶abc模塊,能通過定義一個抽象基類,可以為一組子類定義一個通用的API,在我import時,自動導入了這一自帶模塊,自然找不到我的自定義函數(shù)。
因此在為文件和模塊取名時,需注意不能python自帶的模塊重名!!
總結(jié)
以上是生活随笔為你收集整理的二值化图像去除小黑点_python与图像工程(2020.10.11)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数手册_python学习手
- 下一篇: python2的默认数字类型_1.2py