[python opencv 計算機視覺零基礎到實戰] 三、numpy與圖像編輯

一、學習目標

  1. 了解圖片的通道與數組結構
  2. 了解使用numpy創建一個圖片
  3. 了解使用numpy對圖片的一般操作方法

目錄

[python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld

[【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld

[[python opencv 計算機視覺零基礎到實戰] 三、numpy與圖像編輯] 一、opencv的helloworld

[[python opencv 計算機視覺零基礎到實戰] 四、了解色彩空間及其詳解] 一、opencv的helloworld

[[python opencv 計算機視覺零基礎到實戰] 五、對象追蹤] 一、opencv的helloworld

如有錯誤歡迎指出~

二、了解numpy對圖像的編輯

2.1 了解zeros方法的使用方法并且輸入了解uint8類型

在前兩節中,我們對圖像的屬性進行了查看,得到了寬、高以及通道,但是我們對整體的圖片數據結構還是存在一定的不理解;這一節將加深對圖片數據結構上的理解,方便我們接下來的學習。

首先我們需要使用numpy創建一張圖片,從最基本的操作逐步對圖像數據結構進行了解。我們先在代碼頭部引入所需庫:

import cv2
import numpy as np

引入之后,我們可以使用numpy創建一個指定大小以及通道數的圖片數據;可以使用numpy的zeros方法。zeros方法可以把數組轉換為我們所需要的矩陣,并且這個數組將會以0這個元素進行填充。zeros接收3個參數,第一個參數為shape形狀,這個形狀指你這個數組需要的維度;第二個接收的參數為dtype,表示該數組的數據類型,默認為numpy.float64;第三個接收的參數為order,這個參數是可選參數,有2個默認選項,分別是C與F,表示是行優先還是列優先,由于我們現在用不到所以暫時不做過多講解。

搞明白了zeros方法的參數后,我們可以簡單的創建一個一位數組:

data=np.zeros(3)
print(data)

以上代碼是創建了有3個元素的一維數組,用0進行填充,并且將值進行輸出,結果如下:

那如何創建一個二維數組呢?很簡單,但很多人會寫錯,以下是個錯誤示例:

data=np.zeros(3,2)

以上使用逗號進行間隔后,2作為了第二個參數dtype,但是dtype中并沒有該類型,所以導致了錯誤,將會提示:

這是進行傳參應該使用方括號或者圓括號將參數進行說明,代碼如下:

data=np.zeros([3,2])

data=np.zeros((3,2))

運行結果如下:

我們已知第二個參數dtype,接下來我們嘗試一下使用uint8類型對創建進行指定:

data=np.zeros((3,2),np.uint8)
print(data)

得到結果為:

由于在第一節中,我們已了解uint8的數據范圍就是0-255,我們將創建的3行2列的數組第0列第0個做加法運算,增加258,查看是否將會數據溢出:

data=np.zeros((3,2),np.uint8)
data[0][1]=data[0][1]+258
print(data[0][1])

運行結果如下:

結果正確,數據并沒有超過258,通過這個示例我們更加的了解了uint8該類型的取值范圍。

2.2 了解使用numpy創建與圖片數據結構一致的數據類型

我們已知一張圖片的數據類型為uint8,并且是3通道的,那么我們這時將可以通過zeros創建一張與圖片數據結構類似的圖片。現在我們創建一張長寬都為3,通道為3的數組矩陣:

data=np.zeros((3,3,3),np.uint8)
print(data)

這個查看數據:

以上結構很方便我們了解整個結構,接下來修改數據創建一個200*200,有3個通道的矩陣:

data=np.zeros((200,200,3),np.uint8)

創建完畢后我們可以使用顯示我們創建的一張“圖片”,并且需要添加等待,不然整個程序將會一閃而過:

data=np.zeros((200,200,3),np.uint8)
cv2.imshow("dataImg",data)

運行結果如下:

這個時候將會得到一張純黑色的圖片。我們現在可以通過搜索引擎查看對應純黑色的RGB值是多少,我通過搜索引擎查看,得到了0 0 0 為黑色;恰好,我們的數據都是以0作為填充的,所以結果為正確。查詢結果如下:

從以上圖片得知,顏色為白色則是255 255 255的RGB值,那么這時我們可以對該矩陣進行值的改變,即可得到一張白色圖片。那我們是否可以這樣編寫呢?

data=np.zeros((200,200,3),np.uint8)*255

以上的編寫方式是不對的,該方式是0成0,永遠等于0,不過以上方式可以使每個元素都乘上255。這個時候我們可以把數組的創建方法改為ones,ones與zeros類似,我們可以從方法名上可以得知,zeros是創建數組時填充0,那ones必定是填充1了。我們寫一個簡單代碼進行嘗試:

data=np.ones((3,3,3),np.uint8)
print(data)

運行結果如下:

修改之前的代碼將zeros方法改為ones方法,完整代碼如下:

import cv2
import numpy as npdata=np.ones((200,200,3),np.uint8)*255
cv2.imshow("dataImg",data)
cv2.waitKey (0)
cv2.destroyAllWindows()

這時將會得到一張白色的圖片:

2.3 使用OpenCV對圖片進行生成

其實我們在創建這些數據時,就已經是創建了一張圖片。我們的所有文件資源在計算機中都是以數字存儲,而我們所見的這些圖片只不過是以人類較為習慣的方式去進行呈現;即使我們操作Photoshop對圖片進行更改,那也是以一種人類較為習慣的方式去對一張圖片進行修改,但本質上是對數據的編輯。

那既然我們是創建了一張圖片,那我們就去保存這一張圖片。使用OpenCV的imwrite方法可以對圖片數據進行保存。imwrite接收兩個參數,第一個是path路徑,表示圖片存儲的位置,但是需要注意的是一定不能夠使用中文路徑,否則有可能會出現錯誤;第二個參數為一個數組類型的參數,也就是我們的圖像數據。那么我們就可以將自己生成的圖像數據傳入第二個參數。代碼如下:

import cv2
import numpy as npdata=np.ones((200,200,3),np.uint8)*255
cv2.imwrite(r"C:\Users\mx\Desktop\dataImg.png",data)
cv2.imshow("dataImg",data)
cv2.waitKey (0)
cv2.destroyAllWindows()

我所存儲的位置是桌面,運行程序后將會在桌面生成一個dataImg名稱的白色圖片。

我們以上代碼使用ones創建后,乘上255,這行代碼可以更改為:

data=np.zeros((200,200,3),np.uint8)
data.fill(255)

使用fill方法可以將一個數組內填充一個值。

2.4 了解通道到底指的是什么

有一些同學不了解圖像或者numpy,可能會對一些名稱有一定的不理解。什么是通道對于這一部分同學來說可能聽得還是有點糊涂的;很簡單,我們直接使用代碼來看通道是啥。

我們已經了解了numpy創建3個通道的圖片數據如下:

data=np.zeros((200,200,3),np.uint8)

那此時,我們將該代碼編程簡單直觀的方式,以便我們觀察,分別更改創建的數組為3,3與3,3,3以及3,3,4 :

data=np.zeros((3,3),np.uint8)
data=np.zeros((3,3,3),np.uint8)

這時候查看數據:

其實從3,3到3,3,3明顯的注意到是厚度增加了;我們之前說過,圖像是由3張單通道圖像組成,每一張表示一種色彩,其實就可以理解為我們所看見的圖像是由3張通道圖像疊加而成,這時就理解了該通道的含義。

注:文章首發于ebaina

三、總結

  1. 了解圖片的通道與數組結構
  2. 了解使用numpy使用zeros,ones創建圖像結構的數據
  3. 了解使用numpy使用fill對數據進行填充
  4. 了解了使用OpenCV 的imwrite方法保存數據

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287586.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287586.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287586.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 常用類庫_JAVA(三)JAVA常用類庫/JAVA IO

成鵬致遠 |lcw.cnblog.com|2014-02-01JAVA常用類庫1.StringBufferStringBuffer是使用緩沖區的,本身也是操作字符串的,但是與String類不同,String類的內容一旦聲明之后則不可改變,改變的只是其內存地址的指向,而StringB…

Error: package or namespace load failed for ‘rJava’:

https://stackoverflow.com/questions/30738974/rjava-load-error-in-rstudio-r-after-upgrading-to-osx-yosemite 安裝好的“xlsx”不能正常加載 library("xlsx") 報錯: 載入需要的程輯包:rJava Error: package or namespace load failed for…

Android之國際化部分文字生效而部分文字沒有生效的坑

1 問題 Android國際化我們知道只要在res目錄下面,創建不同國家的文件夾然后,把不同國家對于的語言以鍵值對的方式寫進strings.xml文件就行,這是一個非常簡單的操作,但是今天遇到了一個很奇葩的問題,在部分手機&#x…

【中間件】c#/.net使用GZY.Quartz.MUI搭建可視化的定時任務面板

GZY.Quartz.MUI是在github上開源的aspnetcore項目, 它旨在幫助開發人員通過面板來設置定時任務,主要想做的就是:像swaggerUI一樣,項目入侵量小,僅需要在Startup中注入的UI組件官方地址:https://www.cnblogs.com/GuZhenYin/p/15745002.html主要功能1.增加本地json持久…

Python學習筆記之字典

一、創建和使用字典 1、創建字典 phonebook{Alice:2341,Beth:9102,Cecil:3258} 2、dict,通過映射創建字典 >>> items[(name,Gumby),(age,34)] >>> ddict(items) >>> d 顯示:{name:Gumby,age:34} dict,通過關鍵字創建字典 >…

iOS UI基礎-7.0 UIScrollView

概述 移動設備的屏幕大小是極其有限的,因此直接展示在用戶眼前的內容也相當有限.當展示的內容較多,超出一個屏幕時,用戶可通過滾動手勢來查看屏幕以外的內容,普通的UIView不具備滾動功能,不能顯示過多的內容。UIScrollView是一個能…

【ArcGIS風暴】緩沖區分析、疊置分析綜合實驗案例:購房區域的選擇

實驗平臺:ArcGIS 9.3實驗目的:熟練掌握A rcGIS緩沖區分析和疊置分析操作,綜合利用各項空間分析工具解決實際問題。實驗要求:對每個條件進行緩沖區分析,運用空間疊置分析對多個圖層疊加,并分等級,確定合適的區域。實驗數據:ArcEx8實驗步驟打開ArcMap,加載數據ArcEx8,如…

[python opencv 計算機視覺零基礎到實戰] 四、了解色彩空間及其詳解

一、學習目標 了解什么是色彩空間了解opencv中色彩空間的轉換 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python opencv 計算機視覺零基…

java gui 按鍵 數組_java GUI分配數組值

好的,所以這是一個非常基本的例子.它需要更多的工作和優化,但應該讓你朝著正確的方向前進import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.Shape;im…

Android之如何實現阿拉伯版本(RTL)的recycleView的網格布局

1 問題 比如正常的recycleView的網格布局效果如下 1 2 34 5 67 8 現在需要變成這樣的效果 3 2 16 5 48 7 2 思考過程和嘗試解決方法 1)從recycleView上直接分析,看有沒有相關的方法變成這個格式,網上百度了,基本上找不到 2)既然recycleView里面有常見的幾種布局設置,…

poj1189 簡單dp

http://poj.org/problem?id1189 Description 有一個三角形木板,豎直立放。上面釘著n(n1)/2顆釘子,還有(n1)個格子(當n5時如圖1)。每顆釘子和周圍的釘子的距離都等于d,每一個格子的寬度也都等于d,且除了最左端和最右端…

WPF|如何在 WPF 中設計漂亮的社交媒體信息儀表板

1. 效果展示先來直接欣賞效果:2. 準備創建一個WPF工程,比如站長使用 .NET 7[1] 創建名為 Dashboard3 的WPF項目,添加一些圖片資源,項目目錄如下:2.1 圖片資源可在網站 iconfont[2] 下載 關閉、最小化 圖標,…

CentOS 設置服務開機啟動的方法

為什么80%的碼農都做不了架構師?>>> CentOS設置服務開機啟動的兩種方法 1、利用 chkconfig 來配置啟動級別 在CentOS或者RedHat其他系統下,如果是后面安裝的服務,如httpd、mysqld、postfix等,安裝后系統默認不會自動啟…

【ArcGIS風暴】水文分析模塊實驗:山脊線和山谷線提取

實驗平臺:ArcGIS 9.3實驗目的:學習和掌握山脊線和山谷線提取的原理及方法實驗要求:利用ArcGIS水文分析模塊提取樣區的山脊線和山谷線實驗數據:Ex1實驗步驟:1.正負地形的提取 (1)打開Arcmap,加載數據EX1,如圖 (2)平滑處理(均值濾波)。加載Spatial Analyst模塊,單擊…

[python opencv 計算機視覺零基礎到實戰] 五、對象追蹤

一、學習目標 了解為什么色彩空間的轉換那么重要了解opencv中進行對象跟蹤的方法 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python op…

Android之用glide加載gif圖片靜態展示

1 問題 圖片是gif動圖,我們需要獲取第一幀的靜態圖片并且展示。 2 解決辦法 public void changeGifToPicture(NonNull Context context, NonNull String url, NonNull ImageView imageView) {Glide.with(context).asBitmap().load(url).into(new BitmapImageViewTa…

flex java框架_fleXive——JavaEE框架

fleXive——JavaEE框架fleXive是一個開源的JavaEE框架,基于LGPL許可證,最新版本3.0RC1,它基于EJB3,并帶有補充的JSF組件庫,具有靈活性和可擴展性。它主要致力于企業級(Enterprise-scale)內容建模、存儲和檢索&#xff…

【ArcGIS風暴】在ArcGIS中實現將一個圓16等分

本文實現在ArcGIS中畫一個圓,然后將其16等分。 步驟一:生成圓(多邊形圖層) (1)創建一個點圖層(圖名Center),如果需要精確定位該點,建議通過輸入坐標點的方式來創建,這一步比較簡單,不再詳述; (2)利用Buffer命令創建緩沖區(圖名Circle_2km),因為要處理的對象…

iOS UIViewContentMode 使用詳解

iOS在處理圖片的時候,會出現拉伸變形的情況,可以根據UIViewContentMode的屬性,來控制圖片 UIViewContentMode包含以下枚舉值 UIViewContentModeScaleToFill :拉伸自適應填滿整個視圖 UIViewContentModeScaleAspectFit :自適應打下比例顯示 UIViewContentModeScaleA…

二進制安裝mariadb-10.2.8

centos7.3上二進制安裝mariadb-10.2.8-linux-x86_641、查看是否安裝mariadbrpm -qa mariadb*如果已經安裝就卸載。2、下載mariadb最新版本yum info mariadb官網地址:http://mariadb.org 下載:mariadb-10.2.8-linux-x86_64.tar.gz3、創建mysql用戶rpm 安…