6個(gè)案例手把手教你用Python和OpenCV進(jìn)行圖像處理

導(dǎo)讀:圖像是由若干個(gè)像素組成的,因此,圖像處理可以看作計(jì)算機(jī)對像素的處理。在面向Python的OpenCV中,可以通過位置索引的方式對圖像內(nèi)的像素進(jìn)行訪問和處理。
本文手把手教你圖像處理的基本操作。

01 圖像的讀取、顯示和保存
OpenCV提供了cv2模塊,用于進(jìn)行圖像的處理操作。
1. 讀取圖像
OpenCV提供了cv2.imread()函數(shù)用于進(jìn)行圖像的讀取操作。該函數(shù)的基本格式為:
retval = cv2.imread(filename[, flags])
其中:
retval是返回值,其值是讀取到的圖像。
filename是要讀取圖像的完整文件名。
flags是讀取標(biāo)記,用來控制讀取文件的類型。部分常用的標(biāo)記值如表3-1所示,其中第一列的值與第三列的數(shù)值表示的含義一致。
-
例3-1 使用cv2.imread()函數(shù)讀取一幅圖像
import cv2 as cv
image = cv2.imread("F:/picture/lena.png") # 讀取lena圖像
print(image)
None = cv2.namedWindow(window)
cv2.namedWindow("image")
None = cv2.imshow(window, image)
-
window是窗口的名字。 -
image是要顯示的圖像。
retval= cv2.waitKey([delay])
-
retval是返回值。 -
delay表示等待鍵盤觸發(fā)的時(shí)間,單位是ms。當(dāng)該值為負(fù)數(shù)或0時(shí)表示無限等待,默認(rèn)值為0。
None = cv2. destroyAllWindows ()
-
例3-2 顯示讀取的圖像
import cv2 as cv # 導(dǎo)入從cv2模塊
image = cv.imread("F:/picture/lena.png") # 讀取lena圖像
cv.namedWindow("image") # 創(chuàng)建一個(gè)image的窗口
cv.imshow("image", image) # 顯示圖像
cv.waitKey() # 默認(rèn)為0,無限等待
cv.destroyAllWindows() # 釋放所有窗口
retval= cv2.imwrite(filename, img[, params])
-
retval是返回值。 -
filename是要保存的圖像的完整路徑名,包括文件的擴(kuò)展名。 -
img是要保存的圖像的名字。 -
params是保存的類型參數(shù),可選。
-
例3-3 編寫程序,將讀取到的圖像保存
import cv2 as cv # 導(dǎo)入從cv2模塊
image = cv.imread("F:/picture/lena.png") # 讀取lena圖像
cv.imwrite("F:/picture/lenaresult.png",image) #將圖像保存到F:/picture/下,名字為lenaresult
b,g,r = cv2.split(img)
-
b、g、r分別是B通道、G通道、R通道的圖像信息。 -
img是要拆分的圖像。
-
例3-4 編寫程序,使用split()函數(shù)對圖像進(jìn)行拆分
import cv2 as cv
image = cv.imread("F:/picture/lena.png")
b,g,r = cv.split(image) # 拆分圖像通道分為b,g,r三個(gè)通道
cv.imshow("b",b) # 顯示b通道的圖像信息
cv.imshow("g",g) # 顯示g通道的圖像信息
cv.imshow("r",r) # 顯示r通道的圖像信息
cv.imshow("image", image)
cv.waitKey()
cv.destroyAllWindows()
imagebgr = cv2.merge([b,g,r])
-
imagebgr是合并后的圖像。 -
b、g、r分別是B通道、G通道、R通道的圖像信息。
-
例3-5 編寫程序,演示合并圖像的過程
import cv2 as cv
image = cv.imread("F:/picture/lena.png")
b,g,r = cv.split(image) # 拆分圖像通道分為b,g,r三個(gè)通道
imagebgr = cv.merge([b,g,r]) # 將b,g,r三個(gè)通道的圖像合并
cv.imshow("image", image)
cv.imshow("imagegbgr", imagebgr)
cv.waitKey()
cv.destroyAllWindows()
-
shape:表示圖像的大小。如果是彩色圖像,則返回包含行數(shù)、列數(shù)和通道數(shù)的數(shù)組;如果是二值圖像或灰度圖像,則返回包含行數(shù)和列數(shù)的數(shù)組。 -
size:表示返回的圖像的像素?cái)?shù)目。 -
dtype:表示返回的圖像的數(shù)據(jù)類型。
-
例3-6 編寫程序,觀察圖像的屬性值
import cv2 as cv
image = cv.imread("F:/picture/lena.png")
print("image.shape",image.shape) # 輸出圖像的大小屬性
print("image.size",image.size) # 輸出圖像的像素?cái)?shù)目屬性
print("image.dtype",image.dtype) # 輸出圖像的類型屬性
image.shape (512, 512, 3)
image.size 786432
image.dtype uint8
關(guān)于作者:高敬鵬,博士學(xué)歷,碩士生導(dǎo)師,2002年至今,任職于哈爾濱工程大學(xué)信息與通信工程學(xué)院。研究方向主要包括人工智能、機(jī)器學(xué)習(xí)、圖像處理、信號檢測、目標(biāo)識別、現(xiàn)代通信技術(shù)與電子系統(tǒng)等。
江志燁,博士學(xué)歷,研究員,任職于北京航天長征飛行器研究所。
趙娜,博士學(xué)歷,講師,任職于重慶電子工程職業(yè)學(xué)院。
本文摘編自《機(jī)器學(xué)習(xí):基于OpenCV和Python的智能圖像處理》,經(jīng)出版方授權(quán)發(fā)布。
轉(zhuǎn)載請聯(lián)系微信:DoctorData
推薦語:依照由淺入深、循序漸進(jìn)的原則編寫,并與大量實(shí)例相結(jié)合,使讀者可以邊學(xué)邊練,從而提高學(xué)習(xí)的興趣與效率。

