既然我們是面向Python的OpenCV(OpenCV for Python)那我們就必須要熟悉Numpy這個庫,尤其是其中的數組的庫,Python是沒有數組的,唯有借助他庫才有所實現想要的目的。
# 老三樣庫--事先導入
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
二、圖像的認識
2.1圖像的表示
2.1.1 單通道__二值圖像
二值圖像是指僅僅包含黑色和白色兩種顏色的圖像。
白色像素點(白色小方塊區(qū)域)處理為“1”,將黑色像素點(黑色小方塊區(qū)域)處理為“0”,以方便進行后續(xù)的存儲和處理等操作
例如:二維碼和條形碼就是簡單的二值
2.1.2 單通道__灰度圖像
二值圖像表示起來簡單方便,但是因為其僅有黑白兩種顏色,所表示的圖像不夠細膩。如果想要表現更多的細節(jié),就需要使用更多的顏色。能夠表示的信息更多了
256 個灰度級,用數值區(qū)間[0, 255]來表示,中,
數值“255”表示純白色,數值“0”表示純黑色.
# 處理圖像
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img =np.zeros((256,256,3),np.uint8)
plt.imshow(img[:,:,::-1])
隨機抓取一點看:
x=np.random.randint(0,256)
y=np.random.randint(0,256)
img[x,y],x,y
再次隨機
2.1.3 多通道__RGB彩色圖像
自然界:紅色、綠色和藍色,即三基色(按照一定的比例混合構成。)
要區(qū)別于美術中的三原色:紅黃藍
色彩空間:
從光學角度出發(fā)可以將顏色解析為主波長,純度,明度等,
從心理學角度和視覺角度出發(fā)可以將顏色解析為色調,飽和度,亮度等,我們將這些采用不同方式表達顏色的模式稱為色彩空間。
RGB三個通道,每個通道取值[0,255]之間,組合表示顏色。共可以調配出所有常見的 256×256×256=16,777,216
種顏色。
RGB=(R*65536)+(G*256)+B
以#FFF為例子
#FFF是#FFFFFF的簡稱
其他顏色
區(qū)別于OpenCV的通道
在RGB的色彩空間之中是以R,G,B的順序存儲的,然而在OpenCV中的通道是B,G,R
即:在處理圖像的時候,需要對指定的圖像通道順序進行轉換。除此以外,還可以根據需要對不同色彩空間的圖像進行類型轉換(灰度圖像處理為二值圖像,將彩色圖像處理灰度圖)
比方說,掃描二維碼的時候,我們需要01的黑白畫面就可以,不需要[0,255]的復雜
2.2 逐點處理(逐像素)并操作
像素的一格一格的小點來描述圖像,現在有numpy和matplotlib.pyplot就相當于在二位的直角坐標系中的第二象限,就能夠通過索引的形式對我們設定的圖像或者導入的圖像進行操作,訪問。
img[1,1]=(0,0,255)
plt.imshow(img[:,:,::-1])
2.2.1 灰度圖像
首先使用 Numpy 庫來生成一個 n×m 大小的數組,用來模擬一個黑色圖像.
使用 Numpy 庫中的函數 zeros()可以生成一個元素值都是 0 的數組
img=np.zeros((n,m),dtype=np.uint8
二維數組與圖像之間存在對應關系。
(1)如何證明plt和cv2的的灰度圖是一樣的
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖像
img = cv2.imread("./Pic/f2e919585490afd1bebd313257e7ad9.jpg", 0)
# # 使用cv2.imwrite將OpenCV數組圖像保存為圖像文件
# cv2.imwrite('./Pic/f2e919585490afd1bebd313257e7ad9.jpg', img)
# 如果你想要讀取并顯示保存后的圖像,可以執(zhí)行以下代碼
saved_img = cv2.imread('./Pic/f2e919585490afd1bebd313257e7ad9.jpg', 0)
plt.imshow(saved_img, cmap='gray')
plt.title('Saved Image')
print(img==saved_img)
(2)避免錯誤:TypeError: unsupported operand type(s) for -: 'AxesImage' and 'int'
即:不可直接比較,需要將周圖像的信息轉換為數組的形式,一一對比。[軸圖像無法和numpy數組]
軸圖像轉換為數組形式plt.imread或plt.imsave
import matplotlib.pyplot as plt
# 讀取Matplotlib圖像并將其轉換為數組
image_plt = plt.imread('your_image_path.jpg')
# 現在,image_plt是一個包含圖像像素數據的NumPy數組
# 你可以對它進行處理或進行其他操作
或者,如果你要保存Matplotlib圖像到文件中,你可以使用plt.imsave函數:
import matplotlib.pyplot as plt
# 創(chuàng)建一個示例圖像(這是一個例子,你可以替換它為你自己的圖像數據)
image_data = ... # 這里應該是一個NumPy數組
# 使用plt.imsave保存NumPy數組為圖像文件
plt.imsave('output_image.jpg', image_data)
通過這兩種方法,你可以在Matplotlib圖像和NumPy數組之間進行相互轉換。注意,如果你使用了一些Matplotlib特定的繪圖函數來創(chuàng)建圖像,你可以使用plt.gcf()獲取當前的圖形對象,然后使用savefig方法將其保存為圖像文件。
(3)plt就顯示是正常的顏色。參數 cmap
在使用 Matplotlib 繪制圖像時,可以使用不同的 colormap(顏色映射)來表示單通道圖像,例如使用 cmap=‘gray’ 來顯示灰度圖像。對于四通道的圖像,Matplotlib 也可以正確地顯示透明度(Alpha)通道。
這是由于plt的映射到在灰度圖像中,你只有一個通道,表示亮度值,但你可以使用不同的 Colormap 來表示這些亮度值。
cool 包含青綠色和品紅色的陰影色。從青綠色平滑變化到品紅色。
gray 返回線性灰度色圖。
bone 具有較高的藍色成分的灰度色圖。該色圖用于對灰度圖添加電子的視圖。
opencv是BGR通道,plt默認RGB通道,若使用cv2.imread()讀入圖像,用plt.imshow()展示原始圖像或者展示對讀入圖像進行一系列操作后的圖像時,需要進行通道轉換。
顯示灰度圖像:
import matplotlib.pyplot as plt
import cv2
# 讀取灰度圖像
gray_image = cv2.imread('gray_image.png', cv2.IMREAD_GRAYSCALE)
# 顯示灰度圖像
plt.imshow(gray_image, cmap='gray')
plt.show()
顯示四通道圖像(RGBA):
import matplotlib.pyplot as plt
import cv2
# 讀取四通道圖像
rgba_image = cv2.imread('rgba_image.png', cv2.IMREAD_UNCHANGED)
# 顯示四通道圖像,包括透明度通道
plt.imshow(rgba_image)
plt.show()
cmap
是 Matplotlib 中的參數,用于指定顏色映射(Colormap),它決定了如何將數據值映射到顏色。Colormap 是一種顏色表,可以將數值數據映射到對應的顏色。它在繪制單通道圖像或圖表時非常有用,以幫助可視化數據。
Colormap 并不是通道的意思,而是指定如何將單一通道的數值映射到顏色的規(guī)則。在灰度圖像中,你只有一個通道,表示亮度值,但你可以使用不同的 Colormap 來表示這些亮度值。
Matplotlib 提供了多種內置的 Colormap,一些常見的包括:
-
'viridis'
:從紫色到黃綠色的顏色映射,用于表示數據值的連續(xù)變化。 -
'jet'
:經典的彩虹顏色映射。 -
'gray'
:灰度顏色映射,用于表示單通道圖像,將較暗的值映射為黑色,較亮的值映射為白色。 -
'copper'
:銅色顏色映射,常用于表示表面溫度。
你可以在 Matplotlib 中使用 cmap
參數來指定所使用的顏色映射。例如:
import matplotlib.pyplot as plt
import numpy as np
# 創(chuàng)建一個示例的單通道數據
data = np.random.random((10, 10))
# 使用'viridis' Colormap來繪制數據
plt.imshow(data, cmap='viridis')
plt.colorbar() # 顯示顏色條
plt.show()
這將使用 ‘viridis’ Colormap 來表示數據中不同值的顏色。你可以根據你的需求選擇合適的 Colormap 來更好地可視化你的數據。不同的 Colormap 可以傳達不同的信息和情感。
(4)避免少cmap的參數出現的問題
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=np.ones((200,800,3),dtype=np.uint8)
img[:] = 255
cv2.imshow("this",img)
plt.imshow(img, cmap='gray')
cv2.waitKey(0)
cv2.destroyAllWindows()
img
(5)修改像素點
函數 item()能夠更加高效地訪問圖像的像素點,該函數的語法格式為:
item(行,列)
函數 itemset()可以用來修改像素值,其語法格式為:
itemset(索引值,新值
import numpy as np
img=np.random.randint(10,99,size=[5,5],dtype=np.uint8)
print("img=\n",img)
print("讀取像素點 img.item(3,2)=",img.item(3,2))
img.itemset((3,2),255)
print("修改后 img=\n",img)
print("修改后像素點 img.item(3,2)=",img.item(3,2))
隨機生成一張灰度圖
img=np.random.randint(0,256,size=[256,256],dtype=np.uint8) cv2.imshow("demo",img) cv2.waitKey() cv2.destroyAllWindows()
**
**
2.2.2 彩色圖像
RGB 模式的彩色圖像在讀入 OpenCV 內進行處理時,會反向的讀取圖像像素BGR,并存儲在ndarray中。其中的BGR為三維數組
import numpy as np
import cv2
#-----------藍色通道值--------------
blue=np.zeros((300,300,3),dtype=np.uint8)
blue[:,:,0]=255
print("blue=\n",blue)
cv2.imshow("blue",blue)
#-----------綠色通道值--------------
green=np.zeros((300,300,3),dtype=np.uint8)
green[:,:,1]=255
print("green=\n",green)
cv2.imshow("green",green)
#-----------紅色通道值--------------
red=np.zeros((300,300,3),dtype=np.uint8)
red[:,:,2]=255
print("red=\n",red)
cv2.imshow("red",red)
#-----------釋放窗口--------------
cv2.waitKey()
cv2.destroyAllWindows()
修改像素點
函數 item()訪問 RGB 模式圖像的像素值時,其語法格式為:
item(行,列,通道)
函數 itemset()修改(設置)RGB 模式圖像的像素值時,其語法格式為:
itemset(三元組索引值,新值)
需要注意,針對 RGB 圖像的訪問,必須同時指定行、列以及行列索引(通道),例如
img.item(a,b,c)。僅僅指定行和列是不可以的
import numpy as np
img=np.random.randint(10,99,size=[2,4,3],dtype=np.uint8)
print("img=\n",img)
print("讀取像素點 img[1,2,0]=",img.item(1,2,0))
print("讀取像素點 img[0,2,1]=",img.item(0,2,1))
print("讀取像素點 img[1,0,2]=",img.item(1,0,2))
img.itemset((1,2,0),255)
img.itemset((0,2,1),255)
img.itemset((1,0,2),255)
print("修改后 img=\n",img)
第 2 章 圖像處理基礎
27
print("修改后像素點 img[1,2,0]=",img.item(1,2,0))
print("修改后像素點 img[0,2,1]=",img.item(0,2,1))
print("修改后像素點 img[1,0,2]=",img.item(1,0,2))
生成一幅彩色圖像,讓其中的像素值均為隨機數。 根據題目要求,編寫代碼如下: import cv2
import numpy as np
> img=np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)
> cv2.imshow("demo",img)
> cv2.waitKey()
> cv2.destroyAllWindows()
2.2.3 感興趣區(qū)域(ROI)【待處理】
ROI(region of interest),感興趣區(qū)域。機器視覺、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規(guī)則多邊形等方式勾勒出需要處理的區(qū)域,稱為感興趣區(qū)域,ROI。在Halcon、OpenCV、Matlab等機器視覺軟件上常用到各種算子(Operator)和函數來求得感興趣區(qū)域ROI,并進行圖像的下一步處理。
import cv2
img-cv2.imread(圖像名稱)x=img[200:400,200:400]
從被處理的圖像以方框、圓、橢圓、不規(guī)則多邊形等方式勾勒出需要處理的區(qū)域。
可以通過各種算子(Operator)和函數來求得感興趣區(qū)域ROI,并進行圖像的下一步處理。
2.3 圖像的屬性
圖像的屬性
、
屬性— API
形狀 img.shape
圖像大小 img.size
數據類型 img.dtype
? shape:如果是彩色圖像,則返回包含行數、列數、通道數的數組;如果是二值圖像或者灰度圖像,則僅返回行數和列數。通過該屬性的返回值是否包含通道數,可以判斷一幅圖像是灰度圖像(或二值圖像)還是彩色圖像。
? size:返回圖像的像素數目。其值為“行×列×通道數”,灰度圖像或者二值圖像的通道數為 1。
? dtype:返回圖像的數據類型
2.4 通道的操作
針對 OpenCV 內的 BGR
圖像 img,如下語句分別從中提取了 B 通道、G 通道、R 通道。
b = img[ : , : , 0 ]
g = img[ : , : , 1 ]
r = img[ : , : , 2 ]
2.4.1 cv2.split()能夠拆分圖像的通道
b,g,r=cv2.split(img)
#通道拆分
b,g,r=cv.split(newimg)
拆分后就是單通道,需要灰度圖
plt.imshow(b,cmap=plt.cm.gray)
2.4.2 cv2.merge()可以實現圖像通道的合并
newimg=cv2.merge([b,g,r])
2.5 色彩轉變
2.5.1 色彩空間轉換
gray=cv.cvtColor(newimg,cv.COLOR_BGR2GRAY)
# plt.imshow(gray)
要以灰度圖顯示
plt.imshow(gray,cmap=plt.cm.gray)
文章來源:http://www.zghlxwxcb.cn/news/detail-742095.html
轉換為HSV
hsv=cv.cvtColor(newimg,cv.COLOR_BGR2HSV)
plt.imshow(hsv)
文章來源地址http://www.zghlxwxcb.cn/news/detail-742095.html
到了這里,關于我在Vscode學OpenCV 處理圖像的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!