溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python+OpenCV實現(xiàn)圖像基本操作的方法是什么

發(fā)布時間:2023-04-19 15:50:57 來源:億速云 閱讀:123 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Python+OpenCV實現(xiàn)圖像基本操作的方法是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

1. 計算機眼中的圖像

計算機眼中的圖像由一個個像素組成, 每個像素點的值在0-255之間,代表像素點的亮度(0為最暗,255為最亮)。

灰度圖(黑白圖)為單通道。

彩色圖為三通道。彩色圖像包括三個顏色通道——B,G,R,分別表示藍、綠、紅。

2. 圖像的表示

圖像的高和寬分別代表圖像在豎直和水平方向分別有多少個像素點。也等價于每個顏色通道矩陣的維度:

彩色圖像為三維數(shù)組,分別為行數(shù)(高度),列數(shù)(寬度),顏色通道;

灰度圖為二維數(shù)組,分別為行數(shù)(高度),列數(shù)(寬度)。

3. 基礎(chǔ)操作 圖像的讀取

文件路徑:不能包含中文字符

讀取模式:

cv2.IMREAD_COLOR 彩色BGR模式,忽略透明度,可以用 1代替,默認編譯模式。
cv2.IMREAD_GRAYSCALE 灰度模式,可以用 0 代替,將圖像轉(zhuǎn)換為灰度圖像。
cv2.IMREAD_UNCHANGED 輸出包含alpha通道的圖像,可以用 -1 代替

補充說明:

Alpha通道是指圖像中的透明度信息,它可以控制像素的透明度和不透明度。對于包含alpha通道的圖像,在讀取時需要使用IMREAD_UNCHANGED標(biāo)志來保留這些透明度信息,以便后續(xù)處理和操作。如果不使用該標(biāo)志,則讀取的圖像將被默認處理成不包含alpha通道的普通圖像。

代碼示例:

#包的配置
import cv2
import matplotlib.pyplot as plt
import numpy as np


img=cv2.imread(自行復(fù)制圖片路徑到這里) # 注意不要使用雙層引號
print(img)               #打印像素
print(img.shape)         #(高,寬,通道)

第一個print會打印出來圖像矩陣,由于顯示太多就不展示了,大家自己嘗試看看效果;

第二個print會打印出圖像的高、寬和通道數(shù),彩色圖像的通道數(shù)是3,灰度圖的通道數(shù)為1

圖像的顯示

cv2.imshow("窗口名", 要顯示的圖片)

窗口名,通常是字符串類型

cv2.imshow("img",img)
cv2.waitKey(0)      #等待鍵盤輸入,輸入任意鍵返回
cv2.destroyAllWindows()    #關(guān)閉窗口

硬核知識:

  • waitKey()內(nèi)數(shù)值若為0,則表示輸入任意鍵后退出,若為大于0的數(shù)字,則以毫秒為單位倒計時退出。

  • 新手上路,有時會碰到圖片太大顯示不全的問題,這時在三行代碼的前面加上cv2.namedWindow('img', cv2.WINDOW_KEEPRATIO)就能解決了

  • 這是由于上述代碼默認的窗口屬性為cv2.WINDOW_AUTOSIZE(按照圖片大小自動調(diào)整窗口大小),則當(dāng)圖片尺寸小于屏幕大小時,按圖片尺寸設(shè)置窗口大小,顯示一個完整的圖片。當(dāng)圖片尺寸大于屏幕大小時,窗口依舊按照圖片尺寸設(shè)置,則我們的屏幕不能顯示整個窗口,從而產(chǎn)生圖片顯示不全的問題

4. 截取部分圖像數(shù)據(jù)(ROI)

image=img[ : , : ]

冒號前后是像素區(qū)域

截取步驟就這一行代碼就能實現(xiàn),例如:image=img[0:200,100:200]

再加上面的圖片讀取,圖片顯示,就能完整的看到效果了

img=cv2.imread("自行復(fù)制圖像路徑")
image=img[0:200,100:200]
cv2.imshow("image",image)
cv2.waitKey(0)      #等待鍵盤輸入,輸入任意鍵返回
cv2.destroyAllWindows()    #關(guān)閉窗口

5. 視頻的讀取

對于視頻的處理,其實和對圖像的處理是相同的,原理就是利用循環(huán)將視頻拆分成一幀一幀的圖像,對每一幀圖像進行處理

對視頻的處理主要包括如下步驟:

cv2.VideoCapture() 讀取攝像頭畫面或者視頻文件,本文章使用視頻文件來演示

  • 檢查是否打開成功,返回一個布爾值和一幀圖像的矩陣數(shù)組

  • 對每一幀圖像進行處理

#視頻格式
vc=cv2.VideoCapture("自行復(fù)制視頻路徑")

#檢查是否打開成功
if vc.isOpened():
    open, frame = vc.read()
else:
    open = False

#逐幀處理
while open:
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        #灰度處理
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  #轉(zhuǎn)換為灰度圖
        cv2.imshow('result',gray)     # 將灰度圖輸出
        if cv2.waitKey(100) & 0xFF == 27: #處理完后每一幀的等待時間
            break
vc.release()
cv2.destroyAllWindows()

6. 邊界填充

邊界填充常見的有6種方法

BORDER_REPLICATE:復(fù)制法,也就是復(fù)制最邊緣像素。

BORDER_REFLECT:反射法,對感興趣的圖像中的像素在兩邊進行復(fù)制

例如:fedcba|abcdefgh|hgfedcb

BORDER_REFLECT_101:反射法,也就是以最邊緣像素為軸,對稱,gfedcb|abcdefgh|gfedcba

BORDER_WRAP:外包裝法abcdefgh|abcdefgh|abcdefg

BORDER_CONSTANT:常量法,常數(shù)值填充,需要在設(shè)置一個value值,以顯示填充的顏色。

下面是一張示例圖像,經(jīng)過程序處理后得到的六張圖像

Python+OpenCV實現(xiàn)圖像基本操作的方法是什么

Python+OpenCV實現(xiàn)圖像基本操作的方法是什么

代碼示例:

img = cv2.imread("自行復(fù)制圖像鏈接")

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 將BGR圖片轉(zhuǎn)換為RGB圖片
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)  # 定義圖片尺寸

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_CONSTANT, value=0)
plt.imshow(img)  # 原圖顯示
plt.show()

plt.subplot(2, 3, 1), plt.imshow(img, 'gray'), plt.title('original')
plt.subplot(2, 3, 2), plt.imshow(replicate, 'gray'), plt.title('replicate')
plt.subplot(2, 3, 3), plt.imshow(reflect, 'gray'), plt.title('reflect')
plt.subplot(2, 3, 4), plt.imshow(reflect101, 'gray'), plt.title('reflect')
plt.subplot(2, 3, 5), plt.imshow(wrap, 'gray'), plt.title('wrap')
plt.subplot(2, 3, 6), plt.imshow(constant, 'gray'), plt.title('constant')

plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

7. 圖像的加法 圖像的加法

**前提:**兩張圖像擁有相同的大小和類型,在處理時應(yīng)該將兩幅圖像相同位置的像素的灰度值(灰度圖)或彩色像素各通道值(彩色圖像)分別相加。通常情況下,在灰度圖像中,像素用 8 個比特位(一個字節(jié))來表示,像素值的范圍是[0,255]。兩個像素值在進行加法運算時,求得的和很可能超過 255,此時就將這個數(shù)%256取余。

使用價值

往小處講:

圖像的加法可以實現(xiàn)兩張圖像的融合,同時保留原圖像的信息。在灰度圖像中,加法會使圖像變亮;而在彩色圖像中,加法會使圖像顏色更鮮艷。加法也可用于實現(xiàn)圖像的平均化和均衡化。

向大處說:

  • 圖像增強:利用兩個圖像的加法,可以增強圖像的亮度、清晰度和對比度等方面,使得圖像更加鮮明、清晰。

  • 圖像融合:將兩個不同的圖像進行加法運算,可以實現(xiàn)圖像的融合。例如在醫(yī)學(xué)圖像的處理中,將 MRI 和 CT 兩個不同的圖像進行加法融合,可以更清晰地顯示出人體器官的位置和結(jié)構(gòu)信息。

  • 圖像合成:利用圖像加法可以將圖像元素進行合成,生成新的圖像。例如,將兩個不同的圖像進行疊加,可以生成動態(tài)圖像或者創(chuàng)意圖像。

  • 噪聲消除:將兩個相同的圖像進行加法運算,可以消除其中的噪聲。由于噪聲是隨機變化的,將兩個相同的圖像進行加法運算可以消除噪聲的影響,提高圖像的質(zhì)量。

代碼示例:

import cv2
# 讀取兩張灰度圖像
img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)
# 將兩張圖像相同位置的像素灰度值相加
result = cv2.add(img1, img2)
# 顯示結(jié)果圖像
cv2.imshow('Result Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

圖像的融合

cv2.addWeighted(圖片, 0.5, 圖片, 0.4, 0)

解釋:第一個參數(shù)是輸入的第一張圖像,第二個參數(shù)是第一張圖像的權(quán)重值;第三個參數(shù)是輸入的第二張圖像,第四個參數(shù)是第二張圖像的權(quán)重值;第五個參數(shù)是一個可選的縮放常數(shù),可以用于調(diào)整輸出圖像的亮度。

img_1 = cv2.imread(自行復(fù)制圖像路徑)
img_2 = cv2.imread(自行復(fù)制圖像路徑)

# 打印出圖片像素尺寸
print(img_1.shape)
print(img_2.shape)

# 統(tǒng)一圖片尺寸
res_1 = cv2.resize(img_1, (1700, 1200))  # 圖像重置函數(shù)
res_2 = cv2.resize(img_2, (1700, 1200))

# 圖片融合
res = cv2.addWeighted(res_1, 0.4, res_2, 0.8, 0)
res = cv2.cvtColor(res, cv2.COLOR_BGR2RGB)  # 將BGR圖片轉(zhuǎn)換為RGB圖片

plt.imshow(res)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

這是將兩張圖片融合后的效果示例

Python+OpenCV實現(xiàn)圖像基本操作的方法是什么

“Python+OpenCV實現(xiàn)圖像基本操作的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI