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