OpenCV :圖像基本操作
點擊下方卡片,關(guān)注“新機器視覺”公眾號
重磅干貨,第一時間送達(dá)
轉(zhuǎn)自:AI技術(shù)前線
01
加載圖像
imread?功能是加載圖像文件成為一個 Mat 對象,其中第一個參數(shù)表示圖像文件名稱,第二個參數(shù)表示加載的圖像是什么類型,支持常見的三個參數(shù)值
IMREAD_UNCHANDED(<0)?表示加載原圖,不做任何改變
IMREAD_GRAYSCALE(0)?表示吧原圖作為灰度圖像加載進(jìn)來
IMREAD_COLOR(>0)?表示把原圖作為 RGB 圖像加載進(jìn)來
# 導(dǎo)入 OpenCV 庫import cv2 as cv# 加載圖像img = cv.imread("./1.jpg")# 打印圖像類型print(type(img))print(img)

圖像顯示
# 導(dǎo)入 OpenCV 庫import cv2 as cv# 加載圖像img = cv.imread("./1.jpg")# 圖像的顯示,也可以創(chuàng)建多個窗口cv.imshow("image",img)# 等待時間,毫秒級,0 表示任意鍵終止cv.waitKey(0)cv.destroyAllWindows()

數(shù)據(jù)讀取-圖像
# 導(dǎo)入 OpenCV 庫import cv2 as cv# 灰色顯示img?=?cv.imread("./1.jpg",cv.IMREAD_GRAYSCALE)# 打印信息print(img)

# 導(dǎo)入 OpenCV 庫import?cv2?as?cvimg = cv.imread("./1.jpg",cv.IMREAD_GRAYSCALE)cv.imshow("image",img)cv.waitKey(0)cv.destroyAllWindows()

截取部分圖像數(shù)據(jù)
# 導(dǎo)入 OpenCV 庫import cv2 as cv# 加載圖像img?=?cv.imread("./1.jpg",)# 截取部分圖像cat = img[0:200, 0:200]# 顯示截取的圖像cv.imshow("cat",cat)cv.waitKey(0)cv.destroyAllWindows()
顏色通道提取
# 導(dǎo)入 OpenCV 庫import cv2 as cvimg = cv.imread("./1.jpg",)b,g,r = cv.split(img)print(b)

# 導(dǎo)入 OpenCV 庫import cv2 as cvimg = cv.imread("./1.jpg",)cur_img?=?img.copy()# 注意參數(shù)的變化cur_img[:,:,0] = 0cur_img[:,:,1] = 0cv.imshow('R',cur_img)cv.waitKey(0)cv.destroyAllWindows()

# 導(dǎo)入 OpenCV 庫import cv2 as cvimg = cv.imread("./1.jpg",)cur_img = img.copy()# 注意參數(shù)的變化cur_img[:,:,0] = 0cur_img[:,:,2] = 0cv.imshow('G',cur_img)cv.waitKey(0)cv.destroyAllWindows()

# 導(dǎo)入 OpenCV 庫import cv2 as cvimg = cv.imread("./1.jpg",)cur_img = img.copy()# 注意參數(shù)的變化cur_img[:,:,1] = 0cur_img[:,:,2] = 0cv.imshow('B',cur_img)cv.waitKey(0)cv.destroyAllWindows()

# 導(dǎo)入 OpenCV 庫import cv2 as cv# 導(dǎo)入 maplotlibimport matplotlib.pyplot as pltimg = cv.imread("./1.jpg",)# 定義圖片顯示大小top_size,buttom_size,left_size,right_size = (50,50,50,50)# 復(fù)制法,也就是復(fù)制最邊緣像素replicate?=?cv.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv.BORDER_REPLICATE)# 反射法,對感興趣的圖像中的像素在兩邊進(jìn)行復(fù)制例如:fedcbajabcdefghjhgfedcbreflect = cv.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv.BORDER_REFLECT)# 反射法,也就是以最邊緣像素為軸、對稱、gfedcbjabcdefghigfedcbareflect01 = cv.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv.BORDER_REFLECT_101)# 外包裝法 cdeifghjabcdefghjabcdefgwrap = cv.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv.BORDER_WRAP)# 常量法,常數(shù)值填充constant = cv.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv.BORDER_CONSTANT)# 設(shè)置圖像位置plt.subplot(231)# 設(shè)置圖像顯示plt.imshow(img,'gray')# 設(shè)置標(biāo)題plt.title('ORIGINAL')plt.subplot(232)plt.imshow(replicate,'gray')plt.title("REPLICATE")plt.subplot(233)plt.imshow(reflect,'gray')plt.title("REFLECT")plt.subplot(234)plt.imshow(reflect01,'gray')plt.title("REPLICATE01")plt.subplot(235)plt.imshow(wrap,'gray')plt.title("WRAP")plt.subplot(236)plt.imshow(constant,'gray')plt.title("CONSTANT")# 圖像顯示plt.show()

BORDER_REPLICATE?:復(fù)制法,也就是復(fù)制最邊緣像素
BORDER_REFLECT?:反射法,對感興趣的圖像中的像素在兩邊進(jìn)行復(fù)制例如:fedcbajabcdefghjhgfedcb(這里我也不是很明白,會的朋友請在評論區(qū)解釋下,感謝)
BORDER_REFLECT_101?:反射法,也就是以最邊緣像素為軸、對稱、gfedcbjabcdefghigfedcba
BORDER_WRAP?:外包裝法 cdeifghjabcdefghjabcdefg
BORDER_CONSTANT?:常量法,常數(shù)值填充
數(shù)值計算
import cv2 as cvimg = cv.imread("./1.jpg")img2 = img + 10img[:5,:,0]print(img)print("--------------------------")print(img2)


圖像融合

import cv2 as cvimg = cv.imread("./1.jpg")img_cat?=?cv.imread("./2.jpg")result = img + img_catprint(result)

import cv2 as cvimg = cv.imread("./1.jpg")img_cat?=?cv.imread("./2.jpg")print(img.shape)print(img_cat.shape)

import cv2 as cvimg = cv.imread("./1.jpg")img_cat = cv.imread("./2.jpg")print(img.shape)# 設(shè)置與 img 一樣的數(shù)值img_cat = cv.resize(img_cat,(721,300))print(img_cat.shape)

import cv2 as cvimport matplotlib.pyplot as pltimg = cv.imread("./1.jpg")img_cat = cv.imread("./2.jpg")# 設(shè)置與 img 一樣的數(shù)值img_cat = cv.resize(img_cat,(721,300))# 設(shè)置寬度值res?=?cv.addWeighted(img,0.4,img_cat,0.6,0)# 圖像顯示plt.imshow(res)plt.show()

圖像保存
# 導(dǎo)入 OpenCV 庫import cv2 as cv# 讀取圖像img = cv.imread("./1.jpg",cv.IMREAD_GRAYSCALE)# 圖像保存# 第一個參數(shù)是圖像要保存的路徑,第二個圖像是要保存的圖像cv.imwrite("./demo.jpg",img)

數(shù)據(jù)讀取-視頻
video = cv2.VideoCapture("demo.mp4")
# 檢查是否打開正確if video.isOpened():# 我們都知道視頻和游戲其實都是由圖像組成的,通過訪問圖像的幀數(shù)連貫形成的,這里也是一樣# video.read() 一幀一幀地讀取# open 得到的是一個布爾值,就是 True 或者 False# frame 得到當(dāng)前這一幀的圖像open, frame = video.read()else:open = False
while open:ret, frame = video.read()# 如果讀到的幀數(shù)不為空,那么就繼續(xù)讀取,如果為空,就退出if frame is None:breakif ret == True:# 轉(zhuǎn)換為灰度圖gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow("video",gray)# 這里使用 waitKey 可以控制視頻的播放速度,數(shù)值越小,播放速度越快# 這里等于 27 也即是說按下 ESC 鍵即可退出該窗口if cv2.waitKey(10) & 0xFF == 27:breakvideo.release()cv2.destroyAllWindows()
import?cv2video?=?cv2.VideoCapture("./demo.mp4")# 檢查是否打開正確if video.isOpened():# 我們都知道視頻和游戲其實都是由圖像組成的,通過訪問圖像的幀數(shù)連貫形成的,這里也是一樣# video.read() 一幀一幀地讀取# open 得到的是一個布爾值,就是 True 或者 False# frame 得到當(dāng)前這一幀的圖像open, frame = video.read()else:????open?=?Falsewhile open:ret, frame = video.read()# 如果讀到的幀數(shù)不為空,那么就繼續(xù)讀取,如果為空,就退出if frame is None:breakif ret == True:# 轉(zhuǎn)換為灰度圖gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow("video",gray)# 這里使用 waitKey 可以控制視頻的播放速度,數(shù)值越小,播放速度越快# 這里等于 27 也即是說按下 ESC 鍵即可退出該窗口if cv2.waitKey(10) & 0xFF == 27:breakvideo.release()cv2.destroyAllWindows()

注釋掉設(shè)置灰色的部分
將原視頻顯示在窗口上

本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
評論
圖片
表情
