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