您好,登錄后才能下訂單哦!
本篇內容介紹了“Python+OpenCV實現圖像基本操作的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
計算機眼中的圖像由一個個像素組成, 每個像素點的值在0-255之間,代表像素點的亮度(0為最暗,255為最亮)。
灰度圖(黑白圖)為單通道。
彩色圖為三通道。彩色圖像包括三個顏色通道——B,G,R,分別表示藍、綠、紅。
圖像的高和寬分別代表圖像在豎直和水平方向分別有多少個像素點。也等價于每個顏色通道矩陣的維度:
彩色圖像為三維數組,分別為行數(高度),列數(寬度),顏色通道;
灰度圖為二維數組,分別為行數(高度),列數(寬度)。
文件路徑:不能包含中文字符
讀取模式:
cv2.IMREAD_COLOR 彩色BGR模式,忽略透明度,可以用 1代替,默認編譯模式。
cv2.IMREAD_GRAYSCALE 灰度模式,可以用 0 代替,將圖像轉換為灰度圖像。
cv2.IMREAD_UNCHANGED 輸出包含alpha通道的圖像,可以用 -1 代替
補充說明:
Alpha通道是指圖像中的透明度信息,它可以控制像素的透明度和不透明度。對于包含alpha通道的圖像,在讀取時需要使用IMREAD_UNCHANGED標志來保留這些透明度信息,以便后續處理和操作。如果不使用該標志,則讀取的圖像將被默認處理成不包含alpha通道的普通圖像。
代碼示例:
#包的配置 import cv2 import matplotlib.pyplot as plt import numpy as np img=cv2.imread(自行復制圖片路徑到這里) # 注意不要使用雙層引號 print(img) #打印像素 print(img.shape) #(高,寬,通道)
第一個print會打印出來圖像矩陣,由于顯示太多就不展示了,大家自己嘗試看看效果;
第二個print會打印出圖像的高、寬和通道數,彩色圖像的通道數是3,灰度圖的通道數為1
圖像的顯示
cv2.imshow("窗口名", 要顯示的圖片)
窗口名,通常是字符串類型
cv2.imshow("img",img) cv2.waitKey(0) #等待鍵盤輸入,輸入任意鍵返回 cv2.destroyAllWindows() #關閉窗口
硬核知識:
waitKey()
內數值若為0,則表示輸入任意鍵后退出,若為大于0的數字,則以毫秒為單位倒計時退出。
新手上路,有時會碰到圖片太大顯示不全的問題,這時在三行代碼的前面加上cv2.namedWindow('img', cv2.WINDOW_KEEPRATIO)
就能解決了
這是由于上述代碼默認的窗口屬性為cv2.WINDOW_AUTOSIZE(按照圖片大小自動調整窗口大小),則當圖片尺寸小于屏幕大小時,按圖片尺寸設置窗口大小,顯示一個完整的圖片。當圖片尺寸大于屏幕大小時,窗口依舊按照圖片尺寸設置,則我們的屏幕不能顯示整個窗口,從而產生圖片顯示不全的問題
image=img[ : , : ]
冒號前后是像素區域
截取步驟就這一行代碼就能實現,例如:image=img[0:200,100:200]
再加上面的圖片讀取,圖片顯示,就能完整的看到效果了
img=cv2.imread("自行復制圖像路徑") image=img[0:200,100:200] cv2.imshow("image",image) cv2.waitKey(0) #等待鍵盤輸入,輸入任意鍵返回 cv2.destroyAllWindows() #關閉窗口
對于視頻的處理,其實和對圖像的處理是相同的,原理就是利用循環將視頻拆分成一幀一幀的圖像,對每一幀圖像進行處理
對視頻的處理主要包括如下步驟:
cv2.VideoCapture()
讀取攝像頭畫面或者視頻文件,本文章使用視頻文件來演示
檢查是否打開成功,返回一個布爾值和一幀圖像的矩陣數組
對每一幀圖像進行處理
#視頻格式 vc=cv2.VideoCapture("自行復制視頻路徑") #檢查是否打開成功 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) #轉換為灰度圖 cv2.imshow('result',gray) # 將灰度圖輸出 if cv2.waitKey(100) & 0xFF == 27: #處理完后每一幀的等待時間 break vc.release() cv2.destroyAllWindows()
邊界填充常見的有6種方法
BORDER_REPLICATE:復制法,也就是復制最邊緣像素。
BORDER_REFLECT:反射法,對感興趣的圖像中的像素在兩邊進行復制
例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最邊緣像素為軸,對稱,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包裝法abcdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常數值填充,需要在設置一個value值,以顯示填充的顏色。
下面是一張示例圖像,經過程序處理后得到的六張圖像
代碼示例:
img = cv2.imread("自行復制圖像鏈接") img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 將BGR圖片轉換為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()
**前提:**兩張圖像擁有相同的大小和類型,在處理時應該將兩幅圖像相同位置的像素的灰度值(灰度圖)或彩色像素各通道值(彩色圖像)分別相加。通常情況下,在灰度圖像中,像素用 8 個比特位(一個字節)來表示,像素值的范圍是[0,255]。兩個像素值在進行加法運算時,求得的和很可能超過 255,此時就將這個數%256取余。
使用價值
往小處講:
圖像的加法可以實現兩張圖像的融合,同時保留原圖像的信息。在灰度圖像中,加法會使圖像變亮;而在彩色圖像中,加法會使圖像顏色更鮮艷。加法也可用于實現圖像的平均化和均衡化。
向大處說:
圖像增強:利用兩個圖像的加法,可以增強圖像的亮度、清晰度和對比度等方面,使得圖像更加鮮明、清晰。
圖像融合:將兩個不同的圖像進行加法運算,可以實現圖像的融合。例如在醫學圖像的處理中,將 MRI 和 CT 兩個不同的圖像進行加法融合,可以更清晰地顯示出人體器官的位置和結構信息。
圖像合成:利用圖像加法可以將圖像元素進行合成,生成新的圖像。例如,將兩個不同的圖像進行疊加,可以生成動態圖像或者創意圖像。
噪聲消除:將兩個相同的圖像進行加法運算,可以消除其中的噪聲。由于噪聲是隨機變化的,將兩個相同的圖像進行加法運算可以消除噪聲的影響,提高圖像的質量。
代碼示例:
import cv2 # 讀取兩張灰度圖像 img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE) # 將兩張圖像相同位置的像素灰度值相加 result = cv2.add(img1, img2) # 顯示結果圖像 cv2.imshow('Result Image', result) cv2.waitKey(0) cv2.destroyAllWindows()
圖像的融合
cv2.addWeighted(圖片, 0.5, 圖片, 0.4, 0)
解釋:第一個參數是輸入的第一張圖像,第二個參數是第一張圖像的權重值;第三個參數是輸入的第二張圖像,第四個參數是第二張圖像的權重值;第五個參數是一個可選的縮放常數,可以用于調整輸出圖像的亮度。
img_1 = cv2.imread(自行復制圖像路徑) img_2 = cv2.imread(自行復制圖像路徑) # 打印出圖片像素尺寸 print(img_1.shape) print(img_2.shape) # 統一圖片尺寸 res_1 = cv2.resize(img_1, (1700, 1200)) # 圖像重置函數 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圖片轉換為RGB圖片 plt.imshow(res) plt.show() cv2.waitKey(0) cv2.destroyAllWindows()
這是將兩張圖片融合后的效果示例
“Python+OpenCV實現圖像基本操作的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。