在 Python 中使用 OpenCV 進(jìn)行圖像處理
任務(wù)描述
· 使用 Python 代碼自己創(chuàng)建圖像。
· 拍攝 2 張圖像,裁剪兩張圖像的一部分并交換它們。
· 拍攝 2 張圖像并將它們組合成一張圖像。例如拼貼畫(huà)。
首先,我們將探索有關(guān) Python 中圖像處理和 OpenCV 庫(kù)的各種細(xì)節(jié)。
什么是圖像處理?
圖像是計(jì)算機(jī)世界中的多維數(shù)組。黑白圖像的 2D 數(shù)組和 RGB 的 3D 數(shù)組。
彩色圖像在計(jì)算機(jī)中以三維 (3D) 數(shù)組的形式存儲(chǔ),其中僅存儲(chǔ) 0-255 個(gè)值,此外 0 和 255 分別代表黑色和白色。
圖像處理通過(guò)數(shù)字計(jì)算機(jī)處理數(shù)字圖像。圖像處理專(zhuān)注于開(kāi)發(fā)能夠?qū)D像進(jìn)行處理的計(jì)算機(jī)系統(tǒng)。該系統(tǒng)的輸入是數(shù)字圖像,系統(tǒng)使用有效算法處理該圖像,并提供圖像作為輸出。
像素是圖像的最小單位。從技術(shù)上講,它是數(shù)組中行和列特定位置的一個(gè)條目。每個(gè)像素由三種顏色組成,即紅色、綠色和藍(lán)色。在組合這些不同的顏色時(shí)形成。多個(gè)像素一起形成一個(gè)完整的圖像。
視頻處理是指逐幀對(duì)視頻進(jìn)行操作。幀只是視頻的特定實(shí)例,即單個(gè)時(shí)間點(diǎn)的圖像。即使在一秒鐘內(nèi),我們也可能有多個(gè)幀。視頻是連續(xù)不斷的圖像流。
Python 提供了許多用于圖像處理的庫(kù),包括:
OpenCV - 圖像處理庫(kù)主要專(zhuān)注于實(shí)時(shí)計(jì)算機(jī)視覺(jué),廣泛應(yīng)用于 2D 和 3D 特征工具包、面部和手勢(shì)識(shí)別、人機(jī)交互、移動(dòng)機(jī)器人、對(duì)象識(shí)別等領(lǐng)域。
**Numpy 和 Scipy 庫(kù) **- 用于圖像操作和處理。
Sckikit - 為圖像處理提供大量算法。
Python Imaging Library (PIL) - 對(duì)圖像執(zhí)行基本操作,如創(chuàng)建縮略圖、調(diào)整大小、旋轉(zhuǎn)、在不同文件格式之間轉(zhuǎn)換等。
在這里,我們將使用 OpenCV 模塊。
OpenCV 是最流行的計(jì)算機(jī)視覺(jué)庫(kù)之一。如果你想在計(jì)算機(jī)視覺(jué)領(lǐng)域開(kāi)始你的旅程,那么對(duì) OpenCV 概念的透徹理解至關(guān)重要。
OpenCV是一個(gè)用于計(jì)算機(jī)視覺(jué)、機(jī)器學(xué)習(xí)和圖像處理的大型開(kāi)源庫(kù)。OpenCV 支持多種編程語(yǔ)言,如 Python、C++、Java 等。它可以處理圖像和視頻以識(shí)別物體、面部,甚至是人類(lèi)的筆跡。
當(dāng)它與各種庫(kù)集成時(shí),例如Numpy,一個(gè)高度優(yōu)化的數(shù)值運(yùn)算庫(kù),那么在 Numpy 中可以進(jìn)行的任何操作都可以與 OpenCV 結(jié)合使用。
一般顏色代碼是 RGB,但在 OpenCV 中使用的顏色代碼格式是 BGR(藍(lán)綠紅)。
安裝 OpenCV
要在你的系統(tǒng)上安裝 OpenCV,請(qǐng)運(yùn)行以下 pip 命令:
pip install opencv-python
旋轉(zhuǎn)圖像
首先,導(dǎo)入 cv2 模塊。
import cv2
現(xiàn)在要讀取圖像,使用 cv2 模塊的 imread() 方法,在參數(shù)中指定圖像的路徑并將圖像存儲(chǔ)在變量中,如下所示:
img = cv2.imread("pyimg.jpg")
該圖像現(xiàn)在被視為一個(gè)矩陣,其中行和列值存儲(chǔ)在 img 中。
實(shí)際上,如果你檢查 img 的類(lèi)型,它會(huì)給你以下結(jié)果:
>>>print(type(img))<class 'numpy.ndarray'>
這是一個(gè) NumPy 數(shù)組!這就是為什么使用 OpenCV 進(jìn)行圖像處理如此簡(jiǎn)單的原因。你一直在使用 NumPy 數(shù)組。
要顯示圖像,可以使用 cv2 的 imshow() 方法。
cv2.imshow('Original Image', img) cv2.waitKey(0)
waitkey() 函數(shù)將時(shí)間作為參數(shù)(以毫秒為單位)作為窗口關(guān)閉的延遲。在這里,我們將時(shí)間設(shè)置為零以永久顯示窗口,直到我們手動(dòng)關(guān)閉它。
要旋轉(zhuǎn)此圖像,你需要圖像的寬度和高度,因?yàn)樯院髮⒃谛D(zhuǎn)過(guò)程中使用它們。
height, width = img.shape[0:2]
shape 屬性返回圖像矩陣的高度和寬度。如果你打印
img.shape[0:2]
好的,現(xiàn)在我們有了圖像矩陣,我們想要得到旋轉(zhuǎn)矩陣。為了得到旋轉(zhuǎn)矩陣,我們使用 cv2 的*getRotationMatrix2D()方法。getRotationMatrix2D()*的語(yǔ)法是:
cv2.getRotationMatrix2D(center, angle, scale)
這里的中心是旋轉(zhuǎn)的中心點(diǎn),角度是以度為單位的角度,比例是使圖像適合屏幕的比例屬性。
要獲得我們圖像的旋轉(zhuǎn)矩陣,代碼是:
rotationMatrix = cv2.getRotationMatrix2D((width/2, height/2), 90, .5)
下一步是在旋轉(zhuǎn)矩陣的幫助下旋轉(zhuǎn)我們的圖像。
為了旋轉(zhuǎn)圖像,我們有一個(gè)名為wrapAffine的 cv2 方法,它以原始圖像、圖像的旋轉(zhuǎn)矩陣以及圖像的寬度和高度作為參數(shù)。
rotatedImage = cv2.warpAffine(img, rotationMatrix, (width, height))
旋轉(zhuǎn)后的圖像存儲(chǔ)在 rotateImage 矩陣中。要顯示圖像,請(qǐng)使用 imshow(),如下所示:
cv2.imshow('Rotated Image', rotatedImage)cv2.waitKey(0)
使用網(wǎng)絡(luò)攝像頭捕獲圖像:
import cv2 cap = cv2.VideoCapture(0)
# here, 0 — to access internal webcam & 1 to access external webcam ret ,
photo = cap.read()
# clicks the photoret
cv2.imwrite(“my”,photo)
# stores in a file
cap.release()
cv2.imshow(“my”, photo)
# displays the photo
cv2.waitKey()
# used to set the expiry time for the picture to be displayed
cv2.destroyAllWindows()
#used to destroy or close the picture window without crashing it
使用網(wǎng)絡(luò)攝像頭的視頻流:
import cv2
cap = cv2.VideoCapture(0)
ret, photo = cap.read()
while True:
ret, photo = cap.read()
cv2.imshow('hi', photo)
if cv2.waitKey(10) ==13:
break
cv.destroyAllwindows()
將圖像轉(zhuǎn)換為灰度(黑白)
轉(zhuǎn)換灰度圖像的簡(jiǎn)單方法是像這樣加載它:
img = cv2.imread("pyimg.jpg", 0)
還有另一種使用 BGR2GRAY 的方法。
要將彩色圖像轉(zhuǎn)換為灰度圖像,請(qǐng)使用 cv2 模塊的 BGR2GRAY 屬性。這在下面的示例中得到了證明:
導(dǎo)入 cv2 模塊:
import cv2
閱讀圖片:
img = cv2.imread("pyimg.jpg")
使用 cv2 模塊的 cvtColor() 方法,該方法將原始圖像和 COLOR_BGR2GRAY 屬性作為參數(shù)。將生成的圖像存儲(chǔ)在變量中:
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
顯示原始圖像和灰度圖像:
cv2.imshow("Original Image", img)cv2.imshow("Gray Scale Image", gray_img)cv2.waitKey(0)
調(diào)整圖像大小
要調(diào)整圖像大小,可以使用 openCV 的 resize() 方法。在 resize 方法中,你可以指定 x 和 y 軸的值,也可以指定表示圖像大小的行數(shù)和列數(shù)。
導(dǎo)入并讀取圖像:
import cv2img = cv2.imread("pyimg.jpg")
現(xiàn)在使用帶有軸值的調(diào)整大小方法:
newImg = cv2.resize(img, (0,0), fx=0.75, fy=0.75)cv2.imshow('Resized Image', newImg)cv2.waitKey(0)
現(xiàn)在使用行和列值來(lái)調(diào)整圖像大小:
newImg = cv2.resize(img, (550, 350))cv2.imshow('Resized Image', newImg)cv2.waitKey(0)
我們說(shuō)我們想要 550 列(寬度)和 350 行(高度)。
使用 Python 代碼創(chuàng)建圖像
輸出如下:
拍攝 2 張圖像,裁剪兩張圖像的一部分并交換它們。
結(jié)果:
拍攝 2 張圖像并將它們組合成一張圖像。例如拼貼畫(huà)。
輸出:
水平拼貼
垂直拼貼
原文標(biāo)題 : 在 Python 中使用 OpenCV 進(jìn)行圖像處理
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車(chē)
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
推薦專(zhuān)題
- 1 【一周車(chē)話】沒(méi)有方向盤(pán)和踏板的車(chē),你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車(chē),還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開(kāi)啟變現(xiàn)競(jìng)速
- 6 海信給AI電視打樣,12大AI智能體全面升級(jí)大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 10 比蘋(píng)果偉大100倍!真正改寫(xiě)人類(lèi)歷史的智能產(chǎn)品降臨
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷(xiāo)售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷(xiāo)售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專(zhuān)家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市