智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第二章 數(shù)字圖像的獲取和基本運(yùn)算_第1頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第二章 數(shù)字圖像的獲取和基本運(yùn)算_第2頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第二章 數(shù)字圖像的獲取和基本運(yùn)算_第3頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第二章 數(shù)字圖像的獲取和基本運(yùn)算_第4頁
智能圖像處理:Python和OpenCV實(shí)現(xiàn)-課件 第二章 數(shù)字圖像的獲取和基本運(yùn)算_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

數(shù)字圖像的獲取和基本運(yùn)算第二章目錄圖像的基本類型Contents1單幅圖像的獲取2視頻圖像的獲取3圖像的算數(shù)運(yùn)算45圖像的邏輯運(yùn)算圖像的基本類型2.1數(shù)字圖像處理的集中常見的基本圖像類型:二值圖像(黑白圖像)、灰度圖像、索引圖像和彩色圖像。什么是二值圖像?二值圖像就是只含有黑色和白色,沒有中間過渡的圖像,如下圖所示:2.1.1二值圖像(黑白圖像)2-1a2-1b

在計(jì)算機(jī)中是通過矩陣來表示圖像信息的,下面的矩陣是圖2-1(b)二值圖像在計(jì)算機(jī)中的表示形式。0000000000000000000000111111000011111100001111110000111111000011111100001111110000000000000000000000

在計(jì)算機(jī)中處理該圖像時(shí),先將其劃分為若干個小方塊,每一個小方塊就是單獨(dú)的一個處理單位,每一個小方塊可以稱之為像素點(diǎn)。計(jì)算機(jī)會將白色的像素點(diǎn)處理為“1”,將黑色的像素點(diǎn)處理為“0”。由于圖像只使用兩個數(shù)字就可以表示,因此計(jì)算機(jī)使用一個比特位(1bit)表示二值圖像。二值圖像的表示比較簡單,只有黑白兩種顏色,所以導(dǎo)致圖像不夠細(xì)膩,不能表現(xiàn)出更多的細(xì)節(jié)?;叶葓D像是指各像素信息由一個量化的灰度等級來描述的圖像,無彩色信息,如圖2-2所示的lena圖像就是一幅灰度圖像,因?yàn)閳D像的信息更加豐富,所以計(jì)算機(jī)無法只使用一個比特來表示灰度圖像。2.1.2灰度圖像灰度圖像的取值范圍為0~255,“0”表示純黑色,“255”表示純白色。其他數(shù)值表示從純黑到純白之間不同級別的灰度,256個灰度等級用一個字節(jié)8bit來表示。二值圖像也可以使用8位二進(jìn)制來表示,其中“0”表示黑色,“255”表示白色,沒有其他灰度級。2-2lena圖像若矩陣元素值域?yàn)?~255,則MAP矩陣的大小為256×3,矩陣的三列分別為R、G、B三種顏色的值。圖像矩陣的每一個灰度值對應(yīng)于MAP矩陣中的一行,如某一像素的灰度值為64,則表示該像素與MAP矩陣的第64行建立了映射關(guān)系,該像素在屏幕上的顯示顏色由MAP矩陣第64行的[RGB]疊加而成。2.1.3索引圖像索引圖像既包括存放圖像數(shù)據(jù)的二維矩陣,還包括一個顏色索引矩陣(稱為MAP矩陣),因此稱為索引圖像,又稱為映射圖像。MAP矩陣可以由二維數(shù)組表示,矩陣大小由存放圖像的矩陣元素的值域(灰度值范圍)決定。2.1.4彩色圖像

在RGB色彩空間中,有三個通道,即R(red,紅色)通道、G(green,綠色)通道和B(blue,藍(lán)色)通道,每個色彩通道的范圍都是[0,255],使用這三個色彩通道的組合表示彩色。也就是混合不同數(shù)量的顏色來顯示出色彩斑斕的彩色,理論上最大可顯示256×256×256=16777216種彩色。

比起二值圖像和灰度圖像,彩色圖像明顯可以表示出更多的圖像信息。色彩就是由紅、綠、藍(lán)三色構(gòu)成,即三基色。由主波長、純度、明度、色調(diào)、飽和度、亮度等使用不同方式表示顏色的模式稱為色彩空間、顏色空間或顏色模式。雖然不同的色彩空間有不同的表示方式,但是各種色彩空間之間可以根據(jù)需要按公式進(jìn)行轉(zhuǎn)換,這種轉(zhuǎn)換在OpenCV中特別方便。本文只介紹較為常用的RGB色彩空間。彩色光L的配色方程式為:L=r[R]+g[G]+b[B]其中,r[R]、g[G]、b[B]為彩色光L中三基色的分量或百分比。對于計(jì)算機(jī)來說,每個通道的信息就是一個一維數(shù)組,所以,通常使用一個三維數(shù)組來表示一幅RGB色彩空間的彩色圖像。一般情況下,在RGB色彩空間中,圖像通道的順序是RGB

,但是在OpenCV中,圖像通道的順序是BGR。即:(1)第一個通道保存B通道的信息;(2)第二個通道保存G通道的信息;(3)第三個通道保存R通道的信息。在圖像處理中,可以根據(jù)需要對通道的順序進(jìn)行轉(zhuǎn)換,OpenCV提供了很多庫函數(shù)來進(jìn)行色彩空間的轉(zhuǎn)換。單幅圖像的獲取2.2圖像是由若干個像素組成的,圖像處理就是計(jì)算機(jī)對像素的處理。在OpenCV中,可以通過位置索引的方式對圖像內(nèi)的像素進(jìn)行訪問和處理。OpenCV提供了cv2.imread()函數(shù)用于進(jìn)行圖像的讀取操作。該函數(shù)的語法格式為:image=cv2.imread(filename,flags)其中輸入輸出參數(shù)為:image:是返回值,其值是讀取到的圖像;filename:要讀入圖片的完整文件名,可以是絕對路徑或相對路徑;flags:讀入圖片的標(biāo)志,用來控制讀取文件的類型。其中,flags標(biāo)記的含義如表2-1所示。其中第一列的值和第三列的值表示含義一致。2.2.1圖像的讀取【例2.1】使用cv2.imread()函數(shù)讀取一幅圖像。程序代碼如下:importcv2

#導(dǎo)入cv2模塊img=cv2.imread("d:/pics/lena.jpg")#讀取lena圖像print(img)

#輸出lena圖像的像素值程序運(yùn)行后得到lena圖像的像素值,如圖2-3所示,顯示了lena圖像第一行的部分像素BGR的值。[[[112152224][114154226][115157228] ... [120152218][143170234][137163223]]圖2-3lena圖像部分像素值2.2.2圖像的顯示

使用函數(shù)cv2.imshow()顯示圖像,該函數(shù)的語法格式為:cv2.imshow(winname,img)

其中第一個參數(shù)winname是顯示圖像的窗口名字,第二個參數(shù)img是要顯示的具體圖像,可以是imread()函數(shù)讀入的圖像,也可以是處理后的圖像,窗口大小自動調(diào)整為圖片大小。 OpenCV還提供了很多與圖像顯示有關(guān)的函數(shù),下面介紹幾種常用的函數(shù)。

⑴namedWindow()函數(shù)用來創(chuàng)建指定的窗口,格式如下:named=dWindow(winname,flags)

其中,winname是窗口的名字,flags是默認(rèn)值。如果沒有添加dWindow語句,在顯示圖像時(shí)就自動先執(zhí)行一個dWindow()。

⑵cv2.waitKey()函數(shù)用來等待按鍵,然后繼續(xù)執(zhí)行,格式如下:cv2.waitKey(delay)其中,參數(shù)delay表示等待鍵盤觸發(fā)的時(shí)間,單位為ms,即等待指定的毫秒數(shù)看是否有鍵盤輸入,若在等待時(shí)間內(nèi)按下任意鍵則返回按鍵的ASCII碼,程序繼續(xù)運(yùn)行。若沒有按下任何鍵,超時(shí)后返回-1。如果不調(diào)用waitKey的話,窗口會一閃而過,看不到顯示的具體圖像。參數(shù)為0表示無限等待,默認(rèn)值為0。

⑶使用cv2.destroyAllWindows()函數(shù)釋放所有窗口,格式如下:cv2.destroyAllWindows()【例2.2】使用cv2.imshow()顯示讀取的圖像,代碼如下:importcv2

#導(dǎo)入cv2模塊img=cv2.imread("d:/pics/lena.jpg")#讀取lena圖像dWindow("Image")

#創(chuàng)建一個名為img的窗口cv2.imshow("Image",img)

#顯示讀入的圖像cv2.waitKey()

#默認(rèn)為0,無限等待cv2.destroyAllWindows()

#釋放所有窗口程序運(yùn)行結(jié)果如圖2-4所示。圖2-4顯示讀取的圖像2.2.3圖像的保存使用函數(shù)cv2.imwrite()保存一個圖像。其語法格式為:cv2.imwrite(filename,img,params)其中第一個參數(shù)filename是要保存的文件名,第二個參數(shù)img是要保存的具體圖像,第三個參數(shù)params是保存的圖像類型參數(shù),可選。參數(shù)params針對特定的圖像格式表示為:對于jpg格式圖像,表示的是圖像的質(zhì)量,用0~100的整數(shù)表示,默認(rèn)95;對于png格式圖像,第三個參數(shù)表示的是壓縮級別,默認(rèn)為3。【例2.3】使用cv2.imwrite()函數(shù)將圖像保存到硬盤中。代碼如下:importcv2

#導(dǎo)入cv2模塊img=cv2.imread("d:/pics/lena.jpg")#讀取lena圖像cv2.imshow('Image',img)#顯示圖像#將圖像保存到d:/pics下,名字命名為lena2cv2.imwrite("d:/pics/lena2.jpg",img)cv2.waitKey(0)cv2.destroyAllWindows()【例2.4】讀取指定文件夾中的所有圖片,顯示并保存到ppics子目錄內(nèi)。程序代碼如下:importcv2importospath_dir="d:/pics"#設(shè)置路徑,讀取文件夾中的所有圖像forfilenameinos.listdir(path_dir):print(filename)

#顯示圖像文件名img=cv2.imread(path_dir+"/"+filename)cv2.imshow(filename,img)

#顯示圖片cv2.waitKey(0)cv2.imwrite("d:/ppics"+"/"+filename,img)#保存圖片cv2.destroyAllWindows()2.2.4圖像的屬性圖像的屬性主要有三種:形狀(行、列和通道數(shù)量)、像素?cái)?shù)量、圖像的數(shù)據(jù)類型。(1)圖像形狀:通過shape關(guān)鍵字獲取圖像的形狀,返回包含行數(shù)、列數(shù)、通道數(shù)的元組。其中灰度圖像返回行數(shù)和列數(shù),而彩色圖像返回行數(shù)、列數(shù)和通道數(shù)。(2)圖像像素?cái)?shù)目:通過size關(guān)鍵字獲取圖像的像素?cái)?shù)目,其中灰度圖像返回行數(shù)×列數(shù);而彩色圖像返回行數(shù)×列數(shù)×通道數(shù)。(3)圖像類型:通過dtype關(guān)鍵字獲取圖像的數(shù)據(jù)類型,通常返回uint8?!纠?.5】編寫程序,獲取一幅圖像的屬性。程序代碼如下:importcv2image=cv2.imread("d:/pics/lena.jpg")#讀取lena圖像print("圖像的形狀是:",image.shape)

#獲取圖像的形狀print("圖像的像素?cái)?shù)目為:",image.size)

#獲取圖像的像素?cái)?shù)目print("圖像的數(shù)據(jù)類型為:",image.dtype)#獲得圖像的數(shù)據(jù)類型程序運(yùn)行結(jié)果如下:圖像的形狀是:(360,360,3)圖像的像素?cái)?shù)目為:388800圖像的數(shù)據(jù)類型為:uint8視頻圖像的獲取2.3視頻圖像的獲取主要有以下幾種方式:①調(diào)取已存在的視頻文件,來實(shí)時(shí)播放視頻文件;②利用筆記本計(jì)算機(jī)上自帶的攝像頭或臺式機(jī)外接的USB攝像頭來獲取實(shí)時(shí)視頻圖像;③通過網(wǎng)絡(luò)IP地址獲取網(wǎng)絡(luò)上的攝像機(jī)實(shí)時(shí)視頻圖像。OpenCV提供了VideoCapture類和VideoWriter類來支持各種格式的視頻文件讀寫,如avi、mp4等視頻文件格式。在視頻沒有結(jié)束之前,可以通過VideoCapture類里面的read()方法來讀取每一幀圖像,每幀都是一個BGR格式的圖像。通過VideoWriter類里面的write()方法來把圖像信息保存到VideoWriter類指定的文件中。視頻寫入類VideoWriter必須初始化4個參數(shù)(文件路徑+文件名,視頻編解碼器,幀速率,幀大小),其中幀速率和幀大小可以通過VideoCapture類的get()函數(shù)獲得。2.3.1視頻文件的讀寫常見的視頻編解碼器有:(1)cv2.VideoWriter_fourcc(‘I’,‘4’,‘2’,‘0’),該選項(xiàng)是一個未壓縮的YUV顏色編碼,是4:2:0的色度子采樣,這種編碼方式有很好的兼容性,但會產(chǎn)生比較大的文件,文件擴(kuò)展名為.avi。(2)cv2.VideoWriter_fourcc(‘P’,‘I’,‘M’,‘1’),該選項(xiàng)是MPEG-1的編碼類型,文件擴(kuò)展名為.avi。(3)cv2.VideoWriter_fourcc(‘X’,‘V’,‘I’,‘D’),該選項(xiàng)是MPEG-4的編碼類型,如果希望得到的視頻大小為平均值,推薦使用此選項(xiàng),文件擴(kuò)展名為.avi。(4)cv2.VideoWriter_fourcc(‘T’,‘H’,‘E’,‘O’),該選項(xiàng)是OggVorbis,文件擴(kuò)展名應(yīng)為.ogv。(5)cv2.VideoWriter_fourcc(‘F’,‘L’,‘V’,‘1’),該選項(xiàng)是一個Flash視頻,文件擴(kuò)展名應(yīng)為.flv?!纠?.6】利用OpenCV函數(shù)對視頻文件讀取和寫入。程序代碼如下:importcv2path='d:/pics/CLOCKTXT.avi'#獲取視頻文件videoCapture=cv2.VideoCapture(path)#獲取視頻碼率和尺寸fps=videoCapture.get(cv2.CAP_PROP_FPS)size=(int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))fnums=videoCapture.get(cv2.CAP_PROP_FRAME_COUNT)#寫入視頻幀video_writer=cv2.VideoWriter(‘d:/pics/Myoutput1.avi',cv2.VideoWriter_fourcc('X','V','I','D'),fps,size)程序運(yùn)行時(shí)的某一時(shí)刻圖像如圖2-5所示。圖2-5視頻某一時(shí)刻圖像#讀取視頻幀success,frame=videoCapture.read()whilesuccess:cv2.imshow('Windows',frame)#顯示

cv2.waitKey(int(100/fps))#延遲

video_writer.write(frame)#寫入下一幀

success,frame=videoCapture.read()#獲取下一幀videoCapture.release()cv2.destroyAllWindows()2.3.2實(shí)時(shí)視頻圖像的獲取通過Python程序使用內(nèi)建攝像頭捕獲視頻,并顯示視頻的每一幀以實(shí)現(xiàn)視頻的播放。在OpenCV中打開攝像頭并獲取視頻數(shù)據(jù)用到的函數(shù):cv2.videoCapture()函數(shù),用來打開攝像頭,攝像頭變量cv2.VideoCapture(n),其中n為整數(shù),內(nèi)置攝像頭為0,若有其他攝像頭則依次為1、2、3…。而cap.open(0)則是真正打開筆記本內(nèi)置的攝像頭,運(yùn)行此代碼后你會發(fā)現(xiàn)攝像頭的指示燈點(diǎn)亮。read()函數(shù)讀取攝像頭采集到的視頻幀數(shù)據(jù),調(diào)用cap.read()會返回兩個參數(shù),第一個參數(shù)是bool型的ret,值為Ture讀取成功,F(xiàn)alse表示讀取失敗。第二個參數(shù)是frame,則是返回的一幀圖像。如果不確定是否讀取成功,可以把這兩個參數(shù)打印輸出,若讀取失敗,[retframe]則為[FalseNone],反之則為[True[圖像數(shù)據(jù)]]。攝像頭捕獲視頻圖像步驟:(1)創(chuàng)建攝像頭對象cap=cv2.VideoCapture(n)(2)逐幀顯示實(shí)現(xiàn)視頻播放在while循環(huán)中,利用攝像頭對象的read()函數(shù)讀取視頻的某一幀圖像并顯示,然后等待1個單位時(shí)間,如果期間檢測到了鍵盤輸入q,則退出,即關(guān)閉窗口。(3)釋放攝像頭對象和窗口

調(diào)用release()釋放攝像頭,調(diào)用destroyAllWindows()關(guān)閉所有圖像窗口?!纠?.7】打開內(nèi)置攝像頭,實(shí)時(shí)顯示視頻圖像,并將視頻寫入Myvideo1.avi中。程序代碼如下:importcv2cap=cv2.VideoCapture(0)#獲取視頻碼率和尺寸fps=cap.get(cv2.CAP_PROP_FPS)size=(int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),\int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))#寫入視頻幀video_writer=cv2.VideoWriter('d:/pics/Myvideo1.avi',cv2.VideoWriter_fourcc('X','V','I','D'),fps,size)while(1):ret,frame=cap.read()#讀取視頻圖像

frame=cv2.flip(frame,1)#圖像水平翻轉(zhuǎn)

cv2.imshow("capture",frame)#顯示視頻

video_writer.write(frame)#寫入視頻

#按Q鍵退出

ifcv2.waitKey(1)&0xFF==ord('q'):break

cap.release()cv2.destroyAllWindows()

運(yùn)行程序,獲取到如圖2-6所示實(shí)時(shí)視頻圖像。要注意是的語句cv2.waitKey(1)內(nèi)的延遲時(shí)間不能填寫0,否則視頻圖像不連續(xù),一直等待點(diǎn)擊按鍵。圖2-6攝像頭讀取的一幅圖片圖像的算數(shù)運(yùn)算2.4加法運(yùn)算減法運(yùn)算乘法運(yùn)算除法運(yùn)算圖像的算數(shù)運(yùn)算包括加法運(yùn)算、減法運(yùn)算、乘法運(yùn)算和除法運(yùn)算。但是必須要注意,進(jìn)行算術(shù)運(yùn)算操作時(shí),必須要保證兩幅圖像的大小、數(shù)據(jù)類型和通道數(shù)目相同。2.4.1加法運(yùn)算可以使用函數(shù)cv2.add()將兩幅圖像進(jìn)行加法運(yùn)算,其語法格式為:cv2.add(src1,src2)其中輸入輸出參數(shù)為:

src1:圖像矩陣1 src2:圖像矩陣2也可以使用Numpy數(shù)組進(jìn)行加法運(yùn)算,res=img1+img2OpenCV中的加法與Numpy的加法有所不同。OpenCV的加法是一種飽和操作,而Numpy的加法是一種模操作。因?yàn)橛?jì)算機(jī)一般使用8個比特來表示灰度圖像,所以像素值的范圍是0~255。當(dāng)像素值的和超過255時(shí),這兩種加法的處理方式是不一樣的。例如,對于100+200,使用cv2.add()函數(shù)得到的是255,而使用Numpy的加法得到的是300%256=44,表示取余。產(chǎn)生離散均勻分布的整數(shù)函數(shù)如下所示:np.random.randint(low,high=None,size=None,dtype='l')其中輸入輸出參數(shù)為:

low:生成元素的最小值

high:生成元素的值一定小于high值

size:輸出的大小,可以是整數(shù)也可以是元組dtype:生成元素的數(shù)據(jù)類型注意:high不為None,生成元素的值在[low,high)區(qū)間中;如果high=None,生成的區(qū)間為[0,low)區(qū)間【例2.8】使用numpy數(shù)組生成兩個矩陣,觀察“+”的加法效果。程序代碼如下:importnumpyasnp#定義兩個隨機(jī)的4×4矩陣,范圍在[0,255]之間img1=np.random.randint(0,256,size=[4,4],dtype=np.uint8)img2=np.random.randint(0,256,size=[4,4],dtype=np.uint8)print("img1=\n",img1)print("img2=\n",img2)print("result=img1+img2\n",img1+img2)程序運(yùn)行結(jié)果如圖2-7所示:img1=[[23117217511][3720514565][1753119209][11418669220]]img2=[[03373189][11124914778][1682337635][1016524171]]result=img1+img2[[231205248200][87236195244][2152515435]]圖2-7numpy“+”號的運(yùn)行結(jié)果從運(yùn)行結(jié)果可以看出,使用“+”符號時(shí),當(dāng)兩個像素值大于255時(shí),是兩個像素值的和除以256取余。【例2.9】使用cv2.add()函數(shù)實(shí)現(xiàn)圖像加法運(yùn)算,觀察cv2.add()函數(shù)的加法效果。程序代碼如下:importcv2importnumpyasnp#定義兩個隨機(jī)的4×4矩陣,范圍在[0,255]之間img1=np.random.randint(0,256,size=[4,4],dtype=np.uint8)img2=np.random.randint(0,256,size=[4,4],dtype=np.uint8)#使用cv2.add()函數(shù)實(shí)現(xiàn)圖像的加法運(yùn)算img3=cv2.add(img1,img2)print("img1=\n",img1)print("img2=\n",img2)print("result=img1+img2\n",img3)程序運(yùn)行結(jié)果如圖2-8所示:img1=[[20657183138][1957116557][243317054]]img2=[[2115753122][1281920358][6513174125][193155166131]]result=img1+img2[[255114236255][25590255115][8946255179][255185255255]]圖2-8使用cv2.add()函數(shù)相加的結(jié)果從運(yùn)行結(jié)果可以看出,使用cv2.add()函數(shù)時(shí),當(dāng)兩個像素值的和超過255時(shí),會將其截?cái)?,取范圍?nèi)的最大值255?!纠?.10】比較兩幅圖像使用不同相加方式所得結(jié)果。程序代碼如下:importcv2#讀取兩幅圖像img1=cv2.imread('d:/pics/grassland.png')img2=cv2.imread('d:/pics/sun1.png’)#使用cv2.add()函數(shù)實(shí)現(xiàn)圖像的加法運(yùn)算img3=cv2.add(img1,img2)#使用數(shù)學(xué)計(jì)算方法對圖像相加img4=img1+img2cv2.imshow('Image1',img1)cv2.imshow('Image2',img2)cv2.imshow('result1=cv2.add(img1,img2)',img3)cv2.imshow('result1=img1+img2',img4)cv2.waitKey(0)cv2.destroyAllWindows()程序運(yùn)行結(jié)果如圖2-9所示。兩幅圖像cv2.add(img1,img2)相加結(jié)果兩幅圖像img1+img2相加結(jié)果圖像融合也是圖像加法,但是對圖像賦予不同的權(quán)重,以使其具有融合或透明的感覺。函數(shù)addWeighted()是將兩張大小、類型相同的圖像按權(quán)重進(jìn)行融合的函數(shù)。圖像融合公式為dst=src1*alpha+src2*beta+gamma函數(shù)addWeighted()的語法格式為:dst=cv2.addWeighted(src1,alpha,src2,beta,gamma[,dtype]])其中輸入?yún)?shù)說明如下:

dst——輸出圖像;

src1–——輸入的第一幅圖像;

alpha——第一幅圖像的權(quán)重;

src2——與第一幅大小和通道數(shù)相同的圖像(相同shape);

beta——第二幅圖像的權(quán)重;

gamma——加到每個總和上的標(biāo)量,相當(dāng)于調(diào)亮度;

dtype——輸出陣列的可選深度,默認(rèn)值為-1【例2.11】將兩幅圖像融合在一起。第一幅圖像的權(quán)重為0.7,第二幅圖像的權(quán)重為0.3,gamma=0。代碼如下:importcv2img1=cv2.imread('d:/pics/lena.png')img2=cv2.imread('d:/pics/opencv-logo.png')dst=cv2.addWeighted(img1,0.7,img2,0.5,0)cv2.imshow('lena',img1)cv2.imshow('opencv-logo',img2)cv2.imshow('result',dst)cv2.waitKey(0)cv2.destroyAllWindows()程序運(yùn)行結(jié)果如圖2-10所示。兩幅圖像融合結(jié)果2.4.2減法運(yùn)算函數(shù)cv2.subtract()將兩幅圖像做減法運(yùn)算,其語法格式為:dst=cv2.subtract(src1,src2)其中輸入輸出參數(shù)為:

dst:輸出圖像;

src1:圖像矩陣1;

src2:圖像矩陣2。也可以使用Numpy數(shù)組進(jìn)行減法運(yùn)算,即dst=img1-img2。與加法運(yùn)算類似,使用“-”和cv2.subtract()函數(shù)進(jìn)行減法運(yùn)算時(shí),對于超出范圍的處理是不一樣的,具體情況如下:運(yùn)算符為“-”號時(shí),兩個圖像的像素相減,當(dāng)結(jié)果大于等于0時(shí),就取相減的值;當(dāng)結(jié)果小于0時(shí),將兩幅圖像的像素相減的差除以255取余后加1。cv2.subtract()函數(shù):兩個圖像的像素相減,當(dāng)結(jié)果大于等于0時(shí),就取相減的值;當(dāng)結(jié)果小于0時(shí),會將其截?cái)?,結(jié)果取0。【例2.12】使用numpy數(shù)組生成兩個矩陣,觀察“-”號減法效果。程序代碼如下:importnumpyasnp#定義兩個隨機(jī)的4×4矩陣,范圍在[0,255]之間img1=np.random.randint(0,256,size=[4,4],dtype=np.uint8)img2=np.random.randint(0,256,size=[4,4],dtype=np.uint8)print("img1=\n",img1)print("img2=\n",img2)print("result=img1-img2\n",img1-img2)程序運(yùn)行結(jié)果如圖2-11所示:img1=[[1611879635][1273644168][190176251140]]img2=[[8257231236][207194219102][160131245248][31359155]]result=img1-img2[[957370173][210249133189][22316155176]]圖2-11減法“-”號的運(yùn)行結(jié)果【例2.13】使用numpy中的數(shù)組生成兩個矩陣,觀察cv2.subtract()函數(shù)的減法效果。代碼如下:importcv2importnumpyasnp#定義兩個隨機(jī)的4×4矩陣,范圍在[0,255]之間img1=np.random.randint(0,256,size=[4,4],dtype=np.uint8)img2=np.random.randint(0,256,size=[4,4],dtype=np.uint8)img3=cv2.subtract(img1,img2)print("img1=\n",img1)print("img2=\n",img2)print("img3=\n",img3)程序運(yùn)行結(jié)果如圖2-12所示:img1=[[1536310937][721591075][195142153226][24115516690]]img2=[[7010417989][734163244][79140235194]]result=cv2.subtract()[[0000][25500][122101900][1621500]]圖2-12函數(shù)cv2.subtract()相減效果【例2.14】兩幅圖像使用兩種減法方式相減,對比它們的效果。程序代碼如下:importcv2#讀取兩幅圖像img1=cv2.imread('d:/pics/girl1.png')img2=cv2.imread('d:/pics/moon.png')#使用cv2.subtract()函數(shù)實(shí)現(xiàn)圖像的減法運(yùn)算img3=cv2.subtract(img1,img2)#使用數(shù)學(xué)計(jì)算方法對圖像相減img4=img1-img2cv2.imshow('Image1',img1)cv2.imshow('Image2',img2)cv2.imshow('result=cv2.subtract(img1,img2)',img3)cv2.imshow('result=img1-img2',img4)cv2.waitKey(0)cv2.destroyAllWindows()程序運(yùn)行結(jié)果如圖2-13所示。2.4.3乘法運(yùn)算圖像乘法運(yùn)算主要有矩陣乘法和矩陣點(diǎn)乘兩種運(yùn)算。Numpy為矩陣的乘法提供了dot()函數(shù)進(jìn)行矩陣乘法運(yùn)算,OpenCV提供了cv2.mutiply()函數(shù)進(jìn)行矩陣的點(diǎn)乘運(yùn)算。(1)矩陣乘法的語法格式為:result=np.dot(a,b)其中:result表示計(jì)算的結(jié)果。a和b表示需要進(jìn)行矩陣乘法計(jì)算的兩個像素值矩陣。(2)矩陣點(diǎn)乘運(yùn)算的語法格式為:result=cv2.multiply(a,b)其中:result表示計(jì)算的結(jié)果。a和b表示需要進(jìn)行矩陣點(diǎn)乘的兩個像素值矩陣?!纠?.15】使用dot()函數(shù)進(jìn)行矩陣乘法運(yùn)算,觀察結(jié)果。程序代碼如下:importnumpyasnp#定義一個隨機(jī)的3×4矩陣,范圍在[0,255]之間img1=np.random.randint(0,256,size=[3,4],dtype=np.uint8)img2=np.random.randint(0,256,size=[4,3],dtype=np.uint8)result1=np.dot(img1,img2)#矩陣乘法運(yùn)算print("img1=\n",img1)print("img2=\n",img2)print("result=\n",result1)程序運(yùn)行結(jié)果如圖2-14所示。img1=[[2020044139][231100237220][20419154158]]img2=[[254104251][12824471][1142027][207158187]]result=[[21366209][160242104][18212225]]圖2-14矩陣乘法運(yùn)算結(jié)果【例2.16】使用multiply()函數(shù)進(jìn)行矩陣點(diǎn)乘運(yùn)算,觀察結(jié)果。程序代碼如下:importcv2importnumpyasnp#定義一個隨機(jī)的4×4矩陣,范圍在[0,255]之間img1=np.random.randint(0,256,size=[4,4],dtype=np.uint8)img2=np.random.randint(0,256,size=[4,4],dtype=np.uint8)result=cv2.multiply(img1,img2)#使用multiply函數(shù)進(jìn)行點(diǎn)乘print("img1=\n",img1) print("img2=\n",img2)print("result=\n",result)img1=[[45114127205][2191269102][2339723333][1315610221]]img2=[[65145136248][19091143104][7566176225]]result=[[255255255255][255255255255][255255255255][255255255255]]程序運(yùn)行結(jié)果如圖2-15所示。圖2-15點(diǎn)乘運(yùn)算結(jié)果從運(yùn)算結(jié)果可以看出矩陣點(diǎn)乘運(yùn)算的最終結(jié)果全是255,這是由于在結(jié)果大于255時(shí),類似于加法運(yùn)算,計(jì)算機(jī)會截?cái)嗥鋽?shù)據(jù),取最大值255。2.4.4除法運(yùn)算除法運(yùn)算應(yīng)用在圖像中即為矩陣的點(diǎn)除運(yùn)算,OpenCV中提供了cv2.divide()函數(shù)來進(jìn)行像素矩陣的點(diǎn)除運(yùn)算。其語法格式如下:result=cv2.divide(a,b)其中:result表示計(jì)算的結(jié)果;a和b表示需要進(jìn)行矩陣點(diǎn)除的兩個圖像像素值矩陣?!纠?.17】使用cv2.divide()函數(shù)進(jìn)行矩陣點(diǎn)除運(yùn)算,觀察效果。程序代碼如下:importcv2importnumpyasnp#定義一個隨機(jī)的4×4矩陣,范圍在[0,255]之間img1=np.random.randint(0,256,size=[4,4],dtype=np.uint8)img2=np.random.randint(0,256,size=[4,4],dtype=np.uint8)#使用divide函數(shù)進(jìn)行點(diǎn)除result=cv2.divide(img1,img2)print("img1=\n",img1)print("img2=\n",img2)print("result=\n",result)程序運(yùn)行結(jié)果如圖2-16所示。img1=[[6922316436][197165545][9425511587][2345824321]]img2=[[93163191101][121941278][228181238144][201172104243]]result=[[1110][16106][0101][1020]]圖2-16點(diǎn)除運(yùn)算結(jié)果矩陣的點(diǎn)除運(yùn)算的最終結(jié)果全是整數(shù),這是因?yàn)橄袼氐姆秶话阍?~255之間而且是整數(shù),當(dāng)定義的隨機(jī)矩陣是8位整數(shù)時(shí),在做除法運(yùn)算時(shí)對結(jié)果將自動取整?!纠?.18】創(chuàng)建一個數(shù)值為2的三維矩陣,與lena圖像進(jìn)行乘除運(yùn)算。程序代碼如下:importcv2importnumpyasnpimg=cv2.imread('d:/pics/lena.jpg')#讀取圖像

#創(chuàng)建長寬為200的圖片,三通道(BGR),像素大小為8位無符號整數(shù)data=2*np.ones([200,200,3],np.uint8)#使用multiply()函數(shù)進(jìn)行矩陣點(diǎn)乘運(yùn)算result1=cv2.multiply(img,data)#使用divide()函數(shù)進(jìn)行矩陣點(diǎn)除乘運(yùn)算result2=cv2.divide(img,data)cv2.imshow('Image',img)cv2.imshow('result1',result1)cv2.imshow('result2',result2)cv2.waitKey(0)cv2.destroyAllWindows()程序運(yùn)行結(jié)果如圖2-17所示。點(diǎn)乘圖像點(diǎn)除圖像圖像的邏輯運(yùn)算2.5圖像的邏輯運(yùn)算就是將兩幅圖像的對應(yīng)像素進(jìn)行邏輯運(yùn)算。邏輯運(yùn)算主要包括與、或、非和異或等。在進(jìn)行圖像處理時(shí)經(jīng)常會遇到按位邏輯運(yùn)算。本節(jié)主要介紹按位與、按位或、按位非和按位異或四種常用的邏輯運(yùn)算。2.5.1按位與運(yùn)算按位與的真值表如表2-2所示。OpenCV中的cv2.bitwise_and()函數(shù)用于進(jìn)行按位與運(yùn)算,它的語法格式為:result=cv2.bitwise_and(src1,src2)其中輸入輸出參數(shù)為:result:與輸入值具有相同大小的輸出值;src1:圖像矩陣1;src2:圖像矩陣2。【例2.19】構(gòu)造一個掩模圖像,使用按位與操作保留掩模內(nèi)的圖像。程序代碼如下:importcv2importnumpyasnpimg1=cv2.imread("d:/pics/lena.jpg")#讀取圖像cv2.imshow("img1",img1)img2=np.zeros(img1.shape,dtype=np.uint8)#構(gòu)造掩模圖像img2[50:150,50:150]=255cv2.imshow("img2",img2)result=cv2.bitwise_and(img1,img2)#進(jìn)行按位與,取出掩膜內(nèi)的圖像cv2.imshow("result",result)cv2.waitKey()cv2.destroyAllWindows()程序運(yùn)行結(jié)果如圖2-18所示。圖(a)是原始圖像,圖(b)是構(gòu)造的掩摸圖像,圖(c)是進(jìn)行按位與操作后的圖像,可以看出已經(jīng)取出了掩模內(nèi)的圖像。2.5.2按位或運(yùn)算

按位或的真值表如表2-3所示。按位或的規(guī)則是參與運(yùn)算的兩個值只要有一個為真,結(jié)果就為真。OpenCV中的cv2.bitwise_or()函數(shù)用于進(jìn)行按位或運(yùn)算,它的語法格式為:result=cv2.bitwise_or(src1,src2)其中輸入輸出參數(shù)為:result:與輸入值具有相同大小的輸出值;src1:圖像矩陣1;src2:圖像矩陣2?!纠?.20】構(gòu)造掩模圖像,使用按位或操作去掉掩模內(nèi)的圖像。程序代碼如下:importcv2importnumpyasnpimg1=cv2.imread("d:/pics/lena.jpg")#讀取圖像cv2.imshow("img1",img1)img2=np.zeros(img1.shape,dtype=np.uint8)#構(gòu)造掩模圖像img2[50:150,50:150]=255cv2.imshow("img2",img2)result=cv2.bitwise_or(img1,img2)#進(jìn)行按位或,刪掉掩膜內(nèi)的圖像cv2.imshow("result",result)cv2.waitKey()cv2.destroyAllWindows()程序運(yùn)行結(jié)果如圖2-19所示,圖(a)是原始圖像,圖(b)是構(gòu)造的掩摸圖像,圖(c)是進(jìn)行按位或操作后的圖像,可以看出已經(jīng)刪

溫馨提示

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

最新文檔

評論

0/150

提交評論