[Python從零到壹] 三十四.OpenCV入門詳解——顯示讀取修改及保存圖像

      網友投稿 1051 2025-03-31

      該系列文章主要講解Python OpenCV圖像處理和圖像識別知識,前期主要講解圖像處理基礎知識、OpenCV基礎用法、常用圖像繪制方法、圖像幾何變換等,中期講解圖像處理的各種運算,包括圖像點運算、形態學處理、圖像銳化、圖像增強、圖像平滑等,后期研究圖像識別、圖像分割、圖像分類、圖像特效處理以及圖像處理相關應用。

      上一篇文章介紹了圖像處理基礎知識,這篇文章將詳細講解OpenCV入門知識,包括OpenCV常見數據類型、顯示圖像、讀取像素、修改像素、創建圖像、復制圖像、保存圖像等內容。希望文章對您有所幫助,如果有不足之處,還請海涵。接下來,讓我們開啟整個系列的學習吧!

      文章目錄

      一.什么是圖像處理

      二.圖像處理基礎

      三.Python語言

      四.OpenCV安裝和基礎

      五.總結

      -:

      https://github.com/eastmountyxz/Python-zero2one

      前文賞析:

      第一部分 基礎語法

      [Python從零到壹] 一.為什么我們要學Python及基礎語法詳解

      [Python從零到壹] 二.語法基礎之條件語句、循環語句和函數

      [Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象

      第二部分 網絡爬蟲

      [Python從零到壹] 四.網絡爬蟲之入門基礎及正則表達式抓取博客案例

      [Python從零到壹] 五.網絡爬蟲之BeautifulSoup基礎語法萬字詳解

      [Python從零到壹] 六.網絡爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解

      [Python從零到壹] 七.網絡爬蟲之Requests爬取豆瓣電影TOP250及CSV存儲

      [Python從零到壹] 八.數據庫之MySQL基礎知識及操作萬字詳解

      [Python從零到壹] 九.網絡爬蟲之Selenium基礎技術萬字詳解

      [Python從零到壹] 十.Selenium爬取在線百科知識萬字詳解(NLP語料構造必備技能)

      第三部分 數據分析和機器學習

      [Python從零到壹] 十一.數據分析之Numpy、Pandas、Matplotlib和Sklearn入門知識萬字詳解

      [Python從零到壹] 十二.機器學習之回歸分析萬字總結

      [Python從零到壹] 十三.機器學習之聚類分析萬字總結全網首發(K-Means、BIRCH、層次聚類、樹狀聚類)

      [Python從零到壹] 十四.機器學習之分類算法五萬字總結全網首發(決策樹、KNN、SVM、分類對比實驗)

      [Python從零到壹] 十五.文本挖掘之數據預處理、Jieba工具和文本聚類萬字詳解

      [Python從零到壹] 十六.文本挖掘之詞云熱點與LDA主題分布分析萬字詳解

      [Python從零到壹] 十七.可視化分析之Matplotlib、Pandas、Echarts入門萬字詳解

      [Python從零到壹] 十八.可視化分析之Basemap地圖包入門詳解

      [Python從零到壹] 十九.可視化分析之熱力圖和箱圖繪制及應用詳解

      [Python從零到壹] 二十.可視化分析之Seaborn繪圖萬字詳解

      [Python從零到壹] 二十一.可視化分析之Pyechart繪圖萬字詳解

      [Python從零到壹] 二十二.可視化分析之OpenGL繪圖萬字詳解

      [Python從零到壹] 二十三.十大機器學習算法之決策樹分類分析詳解(1)

      [Python從零到壹] 二十四.十大機器學習算法之KMeans聚類分析詳解(2)

      [Python從零到壹] 二十五.十大機器學習算法之KNN算法及圖像分類詳解(3)

      [Python從零到壹] 二十六.十大機器學習算法之樸素貝葉斯算法及文本分類詳解(4)

      [Python從零到壹] 二十七.十大機器學習算法之線性回歸算法分析詳解(5)

      [Python從零到壹] 二十八.十大機器學習算法之SVM算法分析詳解(6)

      [Python從零到壹] 二十九.十大機器學習算法之隨機森林算法分析詳解(7)

      [Python從零到壹] 三十.十大機器學習算法之邏輯回歸算法及惡意請求檢測應用詳解(8)

      [Python從零到壹] 三十一.十大機器學習算法之Boosting和AdaBoost應用詳解(9)

      [Python從零到壹] 三十二.十大機器學習算法之層次聚類和樹狀圖聚類應用詳解(10)

      第四部分 Python圖像處理基礎

      [Python從零到壹] 三十三.圖像處理基礎篇之什么是圖像處理和OpenCV配置

      [Python從零到壹] 三十四.OpenCV入門詳解——顯示讀取修改及保存圖像

      第五部分 Python圖像運算和圖像增強

      第六部分 Python圖像識別和圖像處理經典案例

      第七部分 NLP與文本挖掘

      第八部分 人工智能入門知識

      第九部分 網絡攻防與AI安全

      第十部分 知識圖譜構建實戰

      擴展部分 人工智能高級案例

      一.OpenCV常見數據類型

      OpenCV是一個輕量級高效的跨平臺計算機視覺庫,實現了圖像處理和計算機視覺方面的多種通用算法。所謂的圖像可以理解為一個數組,圖像處理就是對數組的處理。首先,本文將介紹OpenCV中常見的數據類型,包括點Point類、顏色Scalar類、尺寸Size類、矩形Rect類、矩陣Mat類[1-2]。

      1.點Point

      表示二維坐標系中的點,含x和y。其示例如下:

      #OpenCV示例 Point p; p.x=1, p.y=2; Point p=Point(1, 2); #Python示例 points_list = [(160, 160), (136, 160)]

      2.顏色Scalar

      包含四個元素的數組,設置像素值RGB三通道,第四個參數可忽略。其示例如下:

      #OpenCV示例 BGR三分量 Scalar(b, g, r); #Python示例 (0, 0, 255)

      3.尺寸Size

      它和Point相似,主要成員包括height和width。其示例如下:

      #OpenCV示例 Size(5, 5); Size_(_Tp _width, _Tp _height); #Python示例 width, height = img.shape

      4.矩形Rect

      Rect類稱為矩形類,包含Point類的成員x和y(代表矩形左上角的坐標)和Size類的成員width和height(代表矩形的大?。F涫纠缦拢?/p>

      #OpenCV示例 Rect rect = rect1 & rect2; #求兩矩形交集 Rect rect = rect1 | rect2; #求兩矩形并集 Rect rectShift = rect + point; #矩形平移 Rect rect = rect1 + size; #矩形縮放 #Python示例 cv2.rectangle(img, (20,20), (150,250), (255,0,0), 2)

      5.矩陣Mat

      通用的矩陣類,用來創建和操作多維矩陣。其示例如下:

      #OpenCV示例 Mat M(3,2, CV_8UC3, Scalar(0,0,255)); #Python示例 np.zeros((256,256,3), np.uint8)

      二.OpenCV讀取與顯示圖像

      在OpenCV2中,圖像的讀取和顯示是最簡單的兩句代碼,它們通過imread()和imshow()函數實現[3]。OpenCV讀取圖像的imread()函數原型如下,它將從指定的文件加載圖像并返回矩陣,如果無法讀取圖像(因為缺少文件、權限不正確、格式不支持或圖像無效等),則返回空矩陣(Mat::data==NULL)。

      retval = imread(filename[, flags])

      – filename表示需要載入的圖片路徑名,其支持Windows位圖、JPEG文件、PNG圖片、便攜文件格式、Sun rasters光柵文件、TIFF文件、HDR文件等。

      flags為int類型,表示載入標識,它指定一個加載圖像的顏色類型,默認值為1。其中cv2.IMREAD_UNCHANGED表示讀入完整圖像或圖像不可變,包括alpha通道;cv2.IMREAD_GRAYSCALE表示讀入灰度圖像;cv2.IMREAD_COLOR表示讀入彩色圖像,默認參數,忽略alpha通道。

      OpenCV中顯示圖像調用imshow()函數,它將在指定窗口中顯示一幅圖像,窗口會自動調整為圖像大小,其原型如下所示:

      imshow(winname, mat)

      – winname表示窗口的名稱

      – mat表示要顯示的圖像

      下面是第一個示例程序,主要用于讀取和加載經典的“Lena”圖像。

      # -*- coding:utf-8 -*- # By:Eastmount import cv2 #讀取圖片 img = cv2.imread("Lena.png") #顯示圖像 cv2.imshow("Demo", img) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()

      輸出結果如圖2-1所示:

      需要注意,在圖像顯示過程中,如果代碼中沒有waitKey(0)函數,其運行結果可能會出現錯誤,加載一幅灰色的圖像,如圖2-2所示。

      因此,在顯示圖像過程中,通常還會調用兩個操作窗口的函數,它們分別是waitKey()和destroyAllWindows()。

      retval = waitKey([, delay])

      – 鍵盤綁定函數,共一個參數delay,表示等待的毫秒數,看鍵盤是否有輸入,返回值為ASCII值。如果其參數為0,則表示無限期的等待鍵盤輸入;參數大于0表示等待delay毫秒;參數小于0表示等待鍵盤單擊。

      destroyAllWindows()

      – 該函數可以輕易刪除所有建立的窗口。如果你想刪除特定的窗口可以使用 cv2.destroyWindow(),并在括號內輸入要刪除的窗口名。

      同時,可以設置加載圖像后無限期等待,直到輸入指定的按鍵才退出窗口,如下面的代碼需要輸入ESC才退出。

      # -*- coding:utf-8 -*- # By:Eastmount import cv2 #讀取圖片 img = cv2.imread("Lena.png") #顯示圖像 cv2.imshow("Demo", img) #無限期等待輸入 k=cv2.waitKey(0) #如果輸入ESC按鍵退出 if k==27: cv2.destroyAllWindows()

      此外,在對比實驗中,我們通常需要顯示多張圖片,此時可以調用NumPy和Matplotlib庫輔助完成[4],具體實現過程如下所示。

      NumPy(Numeric Python)是Python提供的數值計算擴展包,擁有高效的處理函數和數值編程工具,主要用于科學計算,如矩陣數據類型、線性代數、矢量處理等。

      Matplotlib是Python強大的數據可視化工具和2D繪圖庫,常用于創建海量類型的2D圖表和一些基本的3D圖表,類似于MATLAB和R語言。Matplotlib提供了一整套和Matlab相似的命令API,十分適合交互式地進行制圖,而且也可以方便地將它作為繪圖控件,嵌入GUI應用程序中。Matplotlib是一名神經生物學家John D. Hunter博士于2007年創建,函數設計上參考了Matlab,現在在Python的各個科學計算領域都得到了廣泛應用。

      該程序是調用cv2.imread()函數分別讀取四張圖片,并轉換為RGB顏色空間,接著通過for循環分別設置各子圖對應的圖像、標題及坐標軸名稱,其中plt.subplot(2,2)表示生成2×2張子圖。

      # -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取圖像 img1 = cv2.imread('lena.png') img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) img2 = cv2.imread('xluo.png') img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB) img3 = cv2.imread('flower.png') img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB) img4 = cv2.imread('huawei.png') img4 = cv2.cvtColor(img4, cv2.COLOR_BGR2RGB) #顯示四張圖像 titles = ['lena', 'people', 'flower', 'huawei'] images = [img1, img2, img3, img4] for i in range(4): plt.subplot(2, 2, i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()

      輸出如圖2-3所示,它顯示了四幅圖像。在圖像處理對比中,同時對比多種算法的處理效果是非常重要的手段之一。

      三.OpenCV像素處理

      OpenCV中讀取圖像的像素值可以直接通過遍歷圖像的位置實現,如果是灰度圖像則返回其灰度值,如果是彩色圖像則返回藍色(B)、綠色(G)、紅色(G)三個分量值。其示例如下:

      灰度圖像:返回值 = 圖像[位置參數]

      示例:test=img[88,42]

      彩色圖像:返回值 = 圖像[位置元素, 0 | 1 | 2 ]獲取BGR三個通道像素

      示例:blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]

      當需要修改圖像中的像素時,則定位指定像素并直接賦新像素值即可,彩色圖像需要依次給三個分量賦值。如下列代碼所示。

      # -*- coding:utf-8 -*- # By:Eastmount import cv2 #讀取圖片 img = cv2.imread("Lena.png") #讀取像素 test = img[88,142] print("讀取的像素值:", test) #修改像素 img[88,142] = [255, 255, 255] print("修改后的像素值:", test) #分別獲取BGR通道像素 blue = img[88,142,0] print("藍色分量", blue) green = img[88,142,1] print("綠色分量", green) red = img[88,142,2] print("紅色分量", red) #顯示圖像 cv2.imshow("Demo", img) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()

      讀取的像素值及修改后的像素值結果如圖2-4所示。

      下面代碼是將100到200行、150到250列的像素區域設置為白色的效果。

      # -*- coding:utf-8 -*- # By:Eastmount import cv2 #讀取圖片 img = cv2.imread("Lena.png") #該區域設置為白色 img[100:200, 150:250] = [255,255,255] #顯示圖像 cv2.imshow("Demo", img) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()

      圖2-5是最終顯示的效果圖,它將img[100:200, 150:250] 區域顯示為白色。

      四.NumPy像素處理

      前面是直接讀取和修改圖像像素的方法,下面講解通過NumPy庫讀取像素和修改像素的方法。NumPy是Python提供的數值計算擴展包,擁有高效的處理函數和數值編程工具,Array是NumPy庫中最基礎的數據結構,表示數組。NumPy可以很方便地創建各種不同類型的多維數組,并且執行一些基礎操作。

      在圖像處理中,NumPy讀取像素調用item()函數實現,修改像素調用itemset()實現,其原型如下所示[5]。使用Numpy進行像素讀取,調用方式如下:

      返回值 = 圖像.item(位置參數)

      例如:blue = img.item(78, 100, 0)

      使用Numpy的itemset函數修改像素,調用方式如下:

      圖像.itemset(位置, 新值)

      例如:img.itemset((88,99), 255)

      最終實現代碼如下所示。

      # -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy #讀取圖片 img = cv2.imread("Lena.png") print(type(img)) #Numpy讀取像素 print(img.item(78, 100, 0)) print(img.item(78, 100, 1)) print(img.item(78, 100, 2)) #Numpy修改像素 img.itemset((78, 100, 0), 100) img.itemset((78, 100, 1), 100) img.itemset((78, 100, 2), 100) print(img.item(78, 100, 0)) print(img.item(78, 100, 1)) print(img.item(78, 100, 2))

      輸出結果如下所示,原始圖像BGR像素值為88、84、196,修改后的像素值為100、100、100。

      88 84 196 100 100 100

      五.OpenCV創建圖像

      由于在OpenCV2中沒有CreateImage函數,如果需要創建圖像,則需要使用Numpy庫函數實現。如下述代碼,調用np.zeros()函數創建空圖像,創建的新圖像使用Numpy數組的屬性來表示圖像的尺寸和通道信息,其中參數img.shape表示原始圖像的形狀,np.uint8表示類型。

      emptyImage = np.zeros(img.shape, np.uint8)

      例如img.shape為(500, 300, 3),它表示500×300像素的圖像,3表示這是一個RGB圖像。

      # -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取圖片 img = cv2.imread("Lena.png") #創建空圖像 emptyImage = np.zeros(img.shape, np.uint8) #顯示圖像 cv2.imshow("Demo", emptyImage) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()

      顯示結果如圖2-6所示,這是一幅新創建的“空白”圖像。

      六.OpenCV復制圖像

      復制原有圖像來獲取一幅新圖像,可以調用copy()函數實現。

      emptyImage2 = img.copy()

      下述代碼實現了圖像的創建和復制功能。

      # -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取圖片 img = cv2.imread("Lena.png") #創建空圖像 emptyImage = np.zeros(img.shape, np.uint8) #復制圖像 emptyImage2 = img.copy() #顯示圖像 cv2.imshow("Demo1", img) cv2.imshow("Demo2", emptyImage) cv2.imshow("Demo3", emptyImage2) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()

      最終輸出結果如圖2-7所示,Demo1表示原始圖像,Demo2表示創建的空白圖像,Demo3表示復制的圖像。

      七.OpenCV保存圖像

      在OpenCV中,輸出圖像到文件使用的函數為imwrite(),其函數原型如下:

      retval = imwrite(filename, img[, params])

      – filename表示要保存的路徑及文件名

      – img表示圖像矩陣

      [Python從零到壹] 三十四.OpenCV入門詳解——顯示讀取修改及保存圖像

      – params表示特定格式保存的參數編碼,默認值為空。對于JPEG圖片,該參數(cv2.IMWRITE_JPEG_QUALITY)表示圖像的質量,用0-100的整數表示,默認值為95。對于PNG圖片,該參數(cv2.IMWRITE_PNG_COMPRESSION)表示的是壓縮級別,從0到9,壓縮級別越高,圖像尺寸越小,默認級別為3。對于PPM、PGM、PBM圖片,該參數表示一個二進制格式的標志(cv2.IMWRITE_PXM_BINARY)[2]。注意,該類型為Long,必須轉換成int。

      下面是一個調用imwrite()函數輸出圖像到指定的文件的代碼。

      # -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取圖像 img = cv2.imread("Lena.png") #顯示圖像 cv2.imshow("Demo", img) #保存圖像 cv2.imwrite("dst1.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 5]) cv2.imwrite("dst2.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 100]) cv2.imwrite("dst3.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0]) cv2.imwrite("dst4.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9]) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()

      原始圖像“Lena.jpg”為222KB,調用imwrite()函數輸出保存的圖像共四張,如圖2-8所示,其中“dst1.jpg”被壓縮,大小為4.90KB,“dst2.jpg”圖像大小為99.1KB,“dst3.png”大小為499KB,“dst4.png”大小為193KB。

      八.總結

      寫到這里,這篇文章就介紹結束。本文詳細介紹了OpenCV圖像處理的基礎用法,包括圖像讀取、顯示、像素處理、創建、復制、寫入和保存。通過這篇文章,初學者將學會基本的圖像處理操作,代碼比較簡單,但希望大家一定要自己動手實現所有代碼和案例,只有不斷實踐才能提升。

      感謝在求學路上的同行者,不負遇見,勿忘初心。

      感恩能與大家在華為云遇見!

      希望能與大家一起在華為云社區共同成長,原文地址:https://blog.csdn.net/Eastmount/article/details/122654530

      (By:娜璋之家 Eastmount 2022-02-28 夜于武漢)

      參考文獻:

      [1] 岡薩雷斯. 數字圖像處理(第3版)[M]. 北京:電子工業出版社, 2013.

      [2] 阮秋琦. 數字圖像處理學(第3版)[M]. 北京:電子工業出版社,2008.

      [3] Eastmount. [Python圖像處理] 一.圖像處理基礎知識及OpenCV入門函數[EB/OL]. (2018-08-16). https://blog.csdn.net/Eastmount/article/details/81748802.

      [4] 楊秀璋, 顏娜. Python網絡數據爬取及分析從入門到精通(分析篇)[M]. 北京:北京航天航空大學出版社, 2018.

      [5] Eastmount. [Python圖像處理] 二.OpenCV+Numpy庫讀取與修改像素[EB/OL]. (2018-08-28). https://blog.csdn.net/eastmount/article/details/82120114.

      OpenCV Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS一個頁面怎么分成多個頁面打印? wps分頁打印的教程
      下一篇:excel批量填充公式的教程
      相關文章
      国产亚洲精aa成人网站| 激情无码亚洲一区二区三区 | 中文字幕亚洲情99在线| 亚洲一区二区三区日本久久九| 伊人久久亚洲综合| www亚洲精品少妇裸乳一区二区| 亚洲自偷自偷在线成人网站传媒| 亚洲精品中文字幕乱码影院| 亚洲伦理一区二区| 亚洲AV无码久久精品色欲| 久久亚洲AV无码西西人体| 亚洲成A人片77777国产| 亚洲av无码有乱码在线观看| 亚洲精品中文字幕| 亚洲熟妇无码一区二区三区导航| 国产婷婷综合丁香亚洲欧洲| 亚洲AV无码一区二区三区人 | 亚洲综合激情另类专区| 亚洲人成人网站在线观看| 亚洲国产成人久久精品99 | 亚洲综合av永久无码精品一区二区| 亚洲国产精品无码久久九九| 亚洲AV无码专区日韩| 国产精品亚洲专区无码不卡| 性色av极品无码专区亚洲| 亚洲av成人无码网站…| 含羞草国产亚洲精品岁国产精品| 最新亚洲人成无码网www电影| 亚洲人成网站免费播放| 亚洲免费网站观看视频| 亚洲精品无播放器在线播放| 亚洲Av永久无码精品一区二区| 亚洲成a人片在线不卡一二三区| 欧洲亚洲国产精华液| 国产精品手机在线亚洲| 亚洲A丁香五香天堂网| 亚洲国产精品国产自在在线 | 色在线亚洲视频www| 国产亚洲精品影视在线| 亚洲日本天堂在线| 日韩国产欧美亚洲v片|