1. 程式人生 > 其它 >02-影象處理入門基礎

02-影象處理入門基礎

影象是由一個個畫素構成的

我們所說的影象,通常分為二值影象、灰度影象、RGB影象

二值影象:影象當中的每個畫素點,只能取0或255,其中0為黑,255為白
灰度影象:影象當中的每個畫素點,可以取最暗黑色到最亮的白色的灰度之間256級灰度,其中二值影象和灰度影象都是單通道圖片
RGB影象:影象當中的每個畫素由R、G、B三個分量表示,即RGB三通道彩色圖片,其中每個通道取值範圍0-255之間

import cv2

# 彩色圖片轉換為灰度圖
src = cv2.imread("image.jpg",cv2.IMREAD_COLOR)
cv2.imshow("original",src)

img_gray 
= cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) cv2.imshow("img_gray",img_gray) # 灰度圖轉彩色圖片(這裡其實是將灰度影象的單通道變為三通道,沒有變為original的原始影象,整體影象還是灰色的) img_rgb = cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR) cv2.imshow("img_rgb",img_rgb) cv2.waitKey(0) cv2.destroyAllWindows()

畫素處理
1.讀取畫素
返回值 = 影象(位置引數)
1> 灰度影象,返回灰度值
2> RGB影象,返回值為B,G,R的值(這是因為,RGB影象中的實際通道順序是BGR)

2.修改畫素值


影象(位置引數) = 修改的值

import cv2

# 1.灰度圖
# cv.IMREAD_GRAYSCALE:以灰度模式載入影象
img_gray=cv2.imread("image.jpg",cv2.IMREAD_GRAYSCALE)

# 讀取畫素,返回影象第3行第10列的灰度值
p = img_gray[3,10]
print("灰度圖中第3行第10列的灰度值:",p)

# 修改畫素值
img_gray[3,10] = 100
print("修改畫素值後,灰度圖中第3行第10列的灰度值:",img_gray[3,10],end="\n\n")

# 2,RGB影象
# cv2.IMREAD_COLOR:載入彩色影象。任何影象的透明度都會被忽視,它是預設標誌
img = cv2.imread("image.jpg",cv2.IMREAD_COLOR) # 讀取畫素,返回影象第3行第10列的B,G,R的值 blue = img[3,10,0] green = img[3,10,1] red = img[3,10,2] print("RGB影象中第3行第10列的B,G,R分別為:",blue,green,red) # 修改畫素值 img[3,10] = [100,100,100] print("修改畫素值後,RGB影象中第3行第10列的B,G,R分別為:",img[3,10,0],img[3,10,1],img[3,10,2])

使用numpy進行畫素處理
Numpy(Numerical Python)是一個開源的Python科學計算庫,用於快速處理任意維度的陣列
安裝:pip install numpy

1.讀取畫素
返回值 = 影象.item(位置引數)
1> 灰度影象,返回灰度值
2> RGB影象,返回值為B,G,R的值(這是因為,RGB影象中的實際通道順序是BGR)

2.修改畫素值
影象名.itemset(位置引數,新值)

import numpy as np
import cv2

# 1.灰度圖
# cv.IMREAD_GRAYSCALE:以灰度模式載入影象
img_gray=cv2.imread("image.jpg",cv2.IMREAD_GRAYSCALE)

# 讀取畫素,返回影象第3行第10列的灰度值
p = img_gray.item(3,10)
print("灰度圖中第3行第10列的灰度值:",p)

# 修改畫素值
img_gray.itemset((3,10),100)
print("修改畫素值後,灰度圖中第3行第10列的灰度值:",img_gray.item(3,10),end="\n\n")

# 2,RGB影象
# cv2.IMREAD_COLOR:載入彩色影象。任何影象的透明度都會被忽視,它是預設標誌
img = cv2.imread("image.jpg",cv2.IMREAD_COLOR)

# 讀取畫素,返回影象第3行第10列的B,G,R的值
blue = img.item(3,10,0)
green =  img.item(3,10,1)
red = img.item(3,10,2)
print("RGB影象中第3行第10列的B,G,R分別為:",blue,green,red)

# 修改畫素值
img.itemset((3,10,0),100)
img.itemset((3,10,1),100)
img.itemset((3,10,2),100)
print("修改畫素值後,RGB影象中第3行第10列的B,G,R分別為:",img.item(3,10,0),img.item(3,10,1),img.item(3,10,2)

獲取影象屬性
1.形狀:行、列、通道數
通過影象名.shape獲取影象的形狀,返回包括行數,列數,通道數的元組
1> 灰度影象,返回行數、列數
2> 彩色影象,返回行數、列數、通道數

2.畫素數目
通過影象名.size獲取影象的畫素數目
1> 灰度影象,返回行數*列數
2> 彩色影象,返回行數*列數*通道數

3.影象的資料型別
通過影象名.dtype獲取當前影象的資料型別

import cv2

# 1.灰度圖
# cv.IMREAD_GRAYSCALE:以灰度模式載入影象
img_gray=cv2.imread("image.jpg",cv2.IMREAD_GRAYSCALE)

# 獲取影象的形狀
print("灰度圖的形狀",img_gray.shape)
# 獲取影象的畫素數目
print("灰度圖的畫素數目",img_gray.size)
# 獲取影象的資料型別
print("灰度圖的資料型別",img_gray.dtype,end="\n\n")

# 2,RGB影象
# cv2.IMREAD_COLOR:載入彩色影象。任何影象的透明度都會被忽視,它是預設標誌
img = cv2.imread("image.jpg",cv2.IMREAD_COLOR)

# 獲取影象的形狀
print("RGB彩色圖的形狀",img.shape)
# 獲取影象的畫素數目
print("RGB彩色圖的畫素數目",img.size)
# 獲取影象的資料型別
print("RGB彩色圖的資料型別",img.dtype)

影象ROI,感興趣區域
在影象處理領域,我們常常需要設定感興趣區域(ROI,region of interest),這個區域就是影象分析所關注的焦點,這樣以便進行進一步處理,可以大大減少處理時間

定義ROI區域有兩種方法
1> 使用表示矩形的區域React,它指定矩形的左上角座標和矩形的長寬
2> 指定感興趣行或列的範圍(Range),Range是指從起始索引到終止索引(不包括終止索引)的一連段連續序列

import cv2
import numpy as np
 
# 讀取圖片
src=cv2.imread("test.jpg",cv2.IMREAD_COLOR)  #讀取圖片
cv2.imshow("src",src)     
 
# 提取ROI感興趣區域
face = np.zeros((80,80,3))
face=src[10:90,70:150]
cv2.imshow("face",face)   

# 將上述提取的ROI區域,RGB彩色圖轉換為灰度圖
gray=cv2.cvtColor(face,cv2.COLOR_BGR2GRAY)   
cv2.imshow("gray",gray)   

# 將上述ROI區域的灰度圖轉化為RGB彩色圖
backface=cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)  

# 原圖的ROI感興趣區域進行替換
src[10:90,70:150]=backface   
cv2.imshow("backface",src)   

cv2.waitKey(0)
cv2.destroyAllWindows()

通道的拆分與合併
1.拆分通道
2.合併通道

import cv2

img = cv2.imread("image.jpg",cv2.IMREAD_COLOR)

# 拆分通道
# b,g,r = cv2.split(img)
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]

cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)

cv2.waitKey(0)
cv2.destroyAllWindows()

# 合併通道
rgb_img = cv2.merge([r,g,b])
bgr_img = cv2.merge((b,g,r))

cv2.imshow("RGB",rgb_img)
cv2.imshow("BGR",bgr_img)
cv2.waitKey(0)
cv2.destroyAllWindows()