<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OpenCV :圖像基本操作

          共 21508字,需瀏覽 44分鐘

           ·

          2023-10-23 21:26

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

                    
                    
          重磅干貨,第一時間送達(dá)

          轉(zhuǎn)自:AI技術(shù)前線


          大家好,今天分享這篇文章主要介紹了OpenCV基本操作中的圖像基礎(chǔ)操作,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考。

          01

          加載圖像


          • imread 功能是加載圖像文件成為一個 Mat 對象,其中第一個參數(shù)表示圖像文件名稱,第二個參數(shù)表示加載的圖像是什么類型,支持常見的三個參數(shù)值

          • IMREAD_UNCHANDED(<0) 表示加載原圖,不做任何改變

          • IMREAD_GRAYSCALE(0) 表示吧原圖作為灰度圖像加載進(jìn)來

          • IMREAD_COLOR(>0) 表示把原圖作為 RGB 圖像加載進(jìn)來


          注意:OpenCV 支持 JPG、PNG、TIFF 等常見格式圖像文件加載(默認(rèn)讀取的格式是 BGR)
                         
                         
          # 導(dǎo)入 OpenCV 庫import cv2 as cv# 加載圖像img = cv.imread("./1.jpg")# 打印圖像類型print(type(img))print(img)

          輸出:


          可以發(fā)現(xiàn)這是個 numpy 數(shù)據(jù)類型的,而且是三個維度的,比如 [H,W,C]

          圖像顯示

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

          輸出:(按下任意鍵關(guān)閉該窗口)

          數(shù)據(jù)讀取-圖像

                         
                         
          # 導(dǎo)入 OpenCV 庫import cv2 as cv
          # 灰色顯示img = cv.imread("./1.jpg",cv.IMREAD_GRAYSCALE)
          # 打印信息print(img)

          輸出:


          這里打印的結(jié)果就不像上面那樣有三個維度了,因?yàn)槭腔疑模簿褪菦]有彩色的,所以這里表示的只有 H 和 W。

          當(dāng)然,這里的代碼只是打印信息而已,還不能顯示到窗口,顯示到窗口還需要增加幾句代碼,如下:

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

          輸出:(可以發(fā)現(xiàn),圖片是以灰色顯示了的)

          截取部分圖像數(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()
          輸出:

          顏色通道提取

          通過 cv2 的 split() 方法可以進(jìn)行顏色的通道提取

                         
                         
          # 導(dǎo)入 OpenCV 庫import cv2 as cv
          img = cv.imread("./1.jpg",)b,g,r = cv.split(img)
          print(b)

          輸出:


          只保留 R

          上面說過 OpenCV 默認(rèn)讀取的格式是 BGR

                         
                         
          # 導(dǎo)入 OpenCV 庫import cv2 as cv
          img = 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()

          R 是 Red 的縮寫,這里顯示的是紅色

          只保留 G

                         
                         
          # 導(dǎo)入 OpenCV 庫import cv2 as cv

          img = 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()

          G 是 Green 的縮寫,這里顯示的是綠色

          只保留 B
                         
                         
          # 導(dǎo)入 OpenCV 庫import cv2 as cv
          img = 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()

          B 是 Blue 的縮寫,這里顯示的是藍(lán)色

          邊界填充 
                         
                         
          # 導(dǎo)入 OpenCV 庫import cv2 as cv# 導(dǎo)入 maplotlibimport matplotlib.pyplot as plt
          img = 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()


          第一幅圖是原始的圖片,其它的都是進(jìn)行過處理的

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

          • BORDER_REFLECT :反射法,對感興趣的圖像中的像素在兩邊進(jìn)行復(fù)制例如:fedcbajabcdefghjhgfedcb(這里我也不是很明白,會的朋友請?jiān)谠u論區(qū)解釋下,感謝)

          • BORDER_REFLECT_101 :反射法,也就是以最邊緣像素為軸、對稱、gfedcbjabcdefghigfedcba

          • BORDER_WRAP :外包裝法 cdeifghjabcdefghjabcdefg

          • BORDER_CONSTANT :常量法,常數(shù)值填充

          數(shù)值計(jì)算

                         
                         
          import cv2 as cv
          img = cv.imread("./1.jpg")
          img2 = img + 10img[:5,:,0]
          print(img)print("--------------------------")print(img2)

          我們來看下這段代碼的輸出結(jié)果:(由于輸出結(jié)果有點(diǎn)長,這里只截取部分結(jié)果)

          這是 img 的輸出,注意觀察它的值


          這是 img2 的輸出,可以發(fā)現(xiàn),img2 中的每個值都加了 10 ,如果值超出 255 ,

          則得到結(jié)果如:253 + 10 = 263,263 - 255 = 7,那么計(jì)算結(jié)果就為 7

          圖像融合

          需要融合的兩張圖像如下:


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

          輸出:


          說明 img 和 img_cat 的值是不相同的,所以需要轉(zhuǎn)換一下。

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

          可以發(fā)現(xiàn),兩張圖像的 H 和 W 值確實(shí)是不相等的,所以無法進(jìn)行數(shù)值相加

          正確計(jì)算數(shù)值

                         
                         
          import cv2 as cv
          img = 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)

          現(xiàn)在兩張的數(shù)值是相等的了,可以進(jìn)行圖像融合了,這里其實(shí)就是使用了 resize() 方法將其擴(kuò)大了

          完整代碼:

                         
                         
          import cv2 as cvimport matplotlib.pyplot as plt
          img = 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()

          輸出:(prefect)


          02

          圖像保存


          圖像的保存非常簡單,只需要使用 imwrite() 方法即可將圖像保存起來:

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

          執(zhí)行上面的代碼就會在當(dāng)前路徑下生成一整 demo.jpg 的圖像


          03

          數(shù)據(jù)讀取-視頻


          cv2.VideoCapture 可以捕獲攝像頭,用數(shù)字來控制不同的設(shè)備,例如 0,1,如果是視頻文件,直接指定好路徑即可
          舉例:

          (1)讀取視頻

                         
                         
          video = cv2.VideoCapture("demo.mp4")

          (2)檢查視頻是否打開正確

                         
                         
          # 檢查是否打開正確if video.isOpened(): # 我們都知道視頻和游戲其實(shí)都是由圖像組成的,通過訪問圖像的幀數(shù)連貫形成的,這里也是一樣 # video.read() 一幀一幀地讀取 # open 得到的是一個布爾值,就是 True 或者 False # frame 得到當(dāng)前這一幀的圖像 open, frame = video.read()else: open = False

          (3)遍歷每一幀圖像

                         
                         
          while open: ret, frame = video.read() # 如果讀到的幀數(shù)不為空,那么就繼續(xù)讀取,如果為空,就退出 if frame is None: break if 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 cv2
          video = cv2.VideoCapture("./demo.mp4")
          # 檢查是否打開正確if video.isOpened(): # 我們都知道視頻和游戲其實(shí)都是由圖像組成的,通過訪問圖像的幀數(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: break if 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()


          當(dāng)然,上面的程序是將原視頻設(shè)置為灰色的,想要顯示的是原視頻,只需要修改上述代碼中的兩個部分就行了

          • 注釋掉設(shè)置灰色的部分

          • 將原視頻顯示在窗口上




          原文鏈接:https://blog.csdn.net/Woo_home/article/details/106005676

          作者:Woo_home
          文章來源:CSDN博客


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

                        
                        
          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個基于OpenCV實(shí)現(xiàn)20個實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 850
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产色欲一区二区精品 | 无码白浆 | 北条麻纪 无码 在线 视频 | 国内一级内射视频 | 男人操女人视频网站 |