訂閱
糾錯
加入自媒體

在 Python 中使用 OpenCV 進(jìn)行圖像處理

任務(wù)描述

· 使用 Python 代碼自己創(chuàng)建圖像。

· 拍攝 2 張圖像,裁剪兩張圖像的一部分并交換它們。

· 拍攝 2 張圖像并將它們組合成一張圖像。例如拼貼畫。

首先,我們將探索有關(guān) Python 中圖像處理和 OpenCV 庫的各種細(xì)節(jié)。

什么是圖像處理?

圖像是計算機(jī)世界中的多維數(shù)組。黑白圖像的 2D 數(shù)組和 RGB 的 3D 數(shù)組。

彩色圖像在計算機(jī)中以三維 (3D) 數(shù)組的形式存儲,其中僅存儲 0-255 個值,此外 0 和 255 分別代表黑色和白色。

圖像處理通過數(shù)字計算機(jī)處理數(shù)字圖像。圖像處理專注于開發(fā)能夠?qū)D像進(jìn)行處理的計算機(jī)系統(tǒng)。該系統(tǒng)的輸入是數(shù)字圖像,系統(tǒng)使用有效算法處理該圖像,并提供圖像作為輸出。

像素是圖像的最小單位。從技術(shù)上講,它是數(shù)組中行和列特定位置的一個條目。每個像素由三種顏色組成,即紅色、綠色和藍(lán)色。在組合這些不同的顏色時形成。多個像素一起形成一個完整的圖像。

視頻處理是指逐幀對視頻進(jìn)行操作。幀只是視頻的特定實例,即單個時間點(diǎn)的圖像。即使在一秒鐘內(nèi),我們也可能有多個幀。視頻是連續(xù)不斷的圖像流。

Python 提供了許多用于圖像處理的庫,包括:

OpenCV - 圖像處理庫主要專注于實時計算機(jī)視覺,廣泛應(yīng)用于 2D 和 3D 特征工具包、面部和手勢識別、人機(jī)交互、移動機(jī)器人、對象識別等領(lǐng)域。

**Numpy 和 Scipy 庫 **- 用于圖像操作和處理。

Sckikit - 為圖像處理提供大量算法。

Python Imaging Library (PIL) - 對圖像執(zhí)行基本操作,如創(chuàng)建縮略圖、調(diào)整大小、旋轉(zhuǎn)、在不同文件格式之間轉(zhuǎn)換等。

在這里,我們將使用 OpenCV 模塊。

OpenCV 是最流行的計算機(jī)視覺庫之一。如果你想在計算機(jī)視覺領(lǐng)域開始你的旅程,那么對 OpenCV 概念的透徹理解至關(guān)重要。

OpenCV是一個用于計算機(jī)視覺、機(jī)器學(xué)習(xí)和圖像處理的大型開源庫。OpenCV 支持多種編程語言,如 Python、C++、Java 等。它可以處理圖像和視頻以識別物體、面部,甚至是人類的筆跡。

當(dāng)它與各種庫集成時,例如Numpy,一個高度優(yōu)化的數(shù)值運(yùn)算庫,那么在 Numpy 中可以進(jìn)行的任何操作都可以與 OpenCV 結(jié)合使用。

一般顏色代碼是 RGB,但在 OpenCV 中使用的顏色代碼格式是 BGR(藍(lán)綠紅)。

安裝 OpenCV

要在你的系統(tǒng)上安裝 OpenCV,請運(yùn)行以下 pip 命令:

pip install opencv-python

旋轉(zhuǎn)圖像

首先,導(dǎo)入 cv2 模塊。

import cv2

現(xiàn)在要讀取圖像,使用 cv2 模塊的 imread() 方法,在參數(shù)中指定圖像的路徑并將圖像存儲在變量中,如下所示:

img = cv2.imread("pyimg.jpg")

該圖像現(xiàn)在被視為一個矩陣,其中行和列值存儲在 img 中。

實際上,如果你檢查 img 的類型,它會給你以下結(jié)果:

>>>print(type(img))<class 'numpy.ndarray'>

這是一個 NumPy 數(shù)組!這就是為什么使用 OpenCV 進(jìn)行圖像處理如此簡單的原因。你一直在使用 NumPy 數(shù)組。

要顯示圖像,可以使用 cv2 的 imshow() 方法。

cv2.imshow('Original Image', img) cv2.waitKey(0)

waitkey() 函數(shù)將時間作為參數(shù)(以毫秒為單位)作為窗口關(guān)閉的延遲。在這里,我們將時間設(shè)置為零以永久顯示窗口,直到我們手動關(guān)閉它。

要旋轉(zhuǎn)此圖像,你需要圖像的寬度和高度,因為稍后將在旋轉(zhuǎn)過程中使用它們。

height, width = img.shape[0:2]

shape 屬性返回圖像矩陣的高度和寬度。如果你打印

img.shape[0:2]

好的,現(xiàn)在我們有了圖像矩陣,我們想要得到旋轉(zhuǎn)矩陣。為了得到旋轉(zhuǎn)矩陣,我們使用 cv2 的*getRotationMatrix2D()方法。getRotationMatrix2D()*的語法是:

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)圖像,我們有一個名為wrapAffine的 cv2 方法,它以原始圖像、圖像的旋轉(zhuǎn)矩陣以及圖像的寬度和高度作為參數(shù)。

rotatedImage = cv2.warpAffine(img, rotationMatrix, (width, height))

旋轉(zhuǎn)后的圖像存儲在 rotateImage 矩陣中。要顯示圖像,請使用 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)換灰度圖像的簡單方法是像這樣加載它:

img = cv2.imread("pyimg.jpg", 0)

還有另一種使用 BGR2GRAY 的方法。

要將彩色圖像轉(zhuǎn)換為灰度圖像,請使用 cv2 模塊的 BGR2GRAY 屬性。這在下面的示例中得到了證明:

導(dǎo)入 cv2 模塊:

import cv2

閱讀圖片:

img = cv2.imread("pyimg.jpg")

使用 cv2 模塊的 cvtColor() 方法,該方法將原始圖像和 COLOR_BGR2GRAY 屬性作為參數(shù)。將生成的圖像存儲在變量中:

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)在使用行和列值來調(diào)整圖像大。

newImg = cv2.resize(img, (550, 350))cv2.imshow('Resized Image', newImg)cv2.waitKey(0)

我們說我們想要 550 列(寬度)和 350 行(高度)。

使用 Python 代碼創(chuàng)建圖像

輸出如下:

拍攝 2 張圖像,裁剪兩張圖像的一部分并交換它們。

結(jié)果:

拍攝 2 張圖像并將它們組合成一張圖像。例如拼貼畫。

輸出:

水平拼貼

垂直拼貼

       原文標(biāo)題 : 在 Python 中使用 OpenCV 進(jìn)行圖像處理

聲明: 本文由入駐維科號的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號