Python 计算机视觉(三)—— 数字图像处理基本操作
目錄
1. 讀取顯示圖像
(1)讀取圖像
cv2.imread() 函數
image.open() 函數
(2)顯示圖像
cv2.imshow()函數
?img.show()函數
2. 讀取修改像素
(1)讀取像素
print(img.shape)函數
print(img.size)函數
print(img)函數
使用 numpy 庫
像素值不同的原因
(2)修改像素
3. 保存圖像
(1)使用 PIL 庫
(2)使用 OpenCV 庫
4. 獲取圖像屬性
總結
1. 讀取顯示圖像
讀取顯示這部分在前面已經記錄過了,在這里我們簡單過一下:?Python 計算機視覺(二) —— OpenCV 基礎
(1)讀取圖像
cv2.imread() 函數
import cv2 img1 = cv2.imread('E:\Python\StudyOfOpencv\qilin1.jpeg')注意路徑中不能包含有中文以及一些莫名其妙的空格哦 ,不然會報錯
imread() 函數不僅僅只有一個圖像路徑的參數 ,路徑后面還有一個 flag 參數可以決定讀入的圖像的顏色類型
至于該參數可選取的值以及意義如下:
IMREAD_ANYCOLOR = 4?????? #讀取彩色圖像
IMREAD_ANYDEPTH = 2?????? #讀取灰度圖像
IMREAD_COLOR = 1????????????? #讀取彩色圖像
IMREAD_GRAYSCALE = 0???? #讀取灰度圖像
IMREAD_IGNORE_ORIENTATION = 128
IMREAD_LOAD_GDAL = 8
IMREAD_REDUCED_COLOR_2 = 17
IMREAD_REDUCED_COLOR_4 = 33
IMREAD_REDUCED_COLOR_8 = 65
IMREAD_REDUCED_GRAYSCALE_2 = 16
IMREAD_REDUCED_GRAYSCALE_4 = 32
IMREAD_REDUCED_GRAYSCALE_8 = 64
IMREAD_UNCHANGED = -1
至于其他的一些參數的意義可以自己去嘗試得到輸出進行觀察
image.open() 函數
使用該方法讀取到的是圖片本身
from PIL import Image
安裝 PIL 庫時可能會報錯,試著安裝 Pillow-PIL?
from PIL import Image img2 = Image.open('E:\Python\StudyOfOpencv\qilin2.jpeg')(2)顯示圖像
cv2.imshow()函數
使用 imread 函數讀取圖像,顯示圖像使用 cv2.imshow() 函數,但需要創建顯示窗口,在窗口中顯示圖像,這些我也在前面的那篇文章中提到過
import cv2 img1 = cv2.imread('E:\Python\StudyOfOpencv\qilin1.jpeg') #讀取圖像 cv2.namedWindow("Qilin") cv2.imshow("Qilin", img1) #顯示圖像 cv2.waitKey(delay = 0)得到圖像顯示:
?img.show()函數
使用的是 Image.open() 函數讀取圖像,則需要用該函數顯示圖像,不需要創建窗口
img.show() 中的 img 是圖像名稱,需要進行修改
from PIL import Image img2 = Image.open('E:\Python\StudyOfOpencv\qilin2.jpeg') #讀取圖像 img2.show() #顯示圖像使用該函數打開圖像可能會報錯,提示沒有對應軟件打開文件
解決方法:打開設置-->應用 --> 默認程序 --> 選擇報錯的文件后綴為其添加默認的應用軟件
得到圖像顯示:
在此處是用圖像軟件打開的,原因就是上面提到的需要為該文件添加默認打開軟件
2. 讀取修改像素
(1)讀取像素
print(img.shape)函數
使用 cv2.imread() 函數讀取圖像后,為顯示圖像的類型以及分辨率可以使用該函數
print(img1.shape)得到輸出:(506, 564, 3)
說明該圖像是 564*506 的三通道 圖像,至于分辨率為什么反過來后面再說
print(img.size)函數
使用 Image.open() 得到圖像后使用該函數輸出圖像的大小,即分辨率
print(img2.size)得到輸出:(564, 506)
可以看出剛好和前面的是反過來的
print(img)函數
使用 cv2.imread() 函數得到的圖像要用該函數輸出像素值:
print(img1)[[[254 251 253]
? [254 251 253]
? [254 251 253]
? ...
? [245 236 227]
? [245 236 227]
? [245 236 227]]
?[[254 251 253]
? [254 251 253]
? [254 251 253]
? ...
? [245 236 227]
? [245 236 227]
? [245 236 227]]
?[[254 251 253]
? [254 251 253]
? [254 251 253]
? ...
? [245 235 228]
? [245 235 228]
? [245 235 228]]
?...
?[[ 45? 62? 71]
? [ 44? 62? 69]
? [ 44? 61? 70]
? ...
? [ 32? 46? 42]
? [ 32? 46? 42]
? [ 32? 46? 42]]
?[[ 41? 57? 64]
? [ 41? 57? 63]
? [ 41? 57? 64]
? ...
? [ 27? 41? 37]
? [ 32? 46? 42]
? [ 31? 45? 41]]
?[[ 43? 57? 63]
? [ 43? 57? 63]
? [ 43? 57? 63]
? ...
? [ 27? 41? 37]
? [ 32? 46? 42]
? [ 31? 45? 41]]]
使用 numpy 庫
前面提到過,使用 Image.open() 函數得到的圖象是原始的圖像,所以需要將它轉化為數組形式再進行輸出得到相應的像素點值
from PIL import Image import numpy as np img2 = Image.open('E:\Python\StudyOfOpencv\qilin1.jpeg') image = np.asarray(img2) print(image)[[[253 251 254]
? [253 251 254]
? [253 251 254]
? ...
? [227 236 245]
? [227 236 245]
? [227 236 245]]
?[[253 251 254]
? [253 251 254]
? [253 251 254]
? ...
? [227 236 245]
? [227 236 245]
? [227 236 245]]
?[[253 251 254]
? [253 251 254]
? [253 251 254]
? ...
? [228 235 245]
? [228 235 245]
? [228 235 245]]
?...
?[[ 71? 62? 45]
? [ 69? 62? 44]
? [ 70? 61? 44]
? ...
? [ 42? 46? 32]
? [ 42? 46? 32]
? [ 42? 46? 32]]
?[[ 64? 57? 41]
? [ 63? 57? 41]
? [ 64? 57? 41]
? ...
? [ 37? 41? 27]
? [ 42? 46? 32]
? [ 41? 45? 31]]
?[[ 63? 57? 43]
? [ 63? 57? 43]
? [ 63? 57? 43]
? ...
? [ 37? 41? 27]
? [ 42? 46? 32]
? [ 41? 45? 31]]]
像素值不同的原因
通過兩種不同的函數得到的圖像讀取的像素剛好是反過來的這是因為:cv2.imread() 讀取的是 BGR 格式,而 Image.open() 讀取的是 RGB 格式,所以它們兩者的 Red&Blue 通道剛好反過來了
而且使用 cv2.imread() 函數得到的圖像本來就是經過采樣的,所以可以直接打印分辨率,然而 image.open() 函數得到的圖像則是原本的圖像,所以需要將其轉化為數組形式才能打印分辨率
(2)修改像素
要將圖像修改為灰度圖,那么在 OpenCv 庫中使用 cvtColor() 函數就可以實現,這在上一篇文章中提到過
但如果是使用 Image.open() 庫得到的圖像,則需要對每一個像素點的像素值進行調整
img2 = Image.open('E:\Python\StudyOfOpencv\qilin1.jpeg') pix = img2.load() #導入像素 width = img2.size[0] #獲取寬度 height = img2.size[1] #獲取長度 temp = 1 for x in range(width): #遍歷寬度temp += 1for y in range(height): #遍歷長度if temp % 2 == 0: #每隔一個像素點轉化為一個白點img2.putpixel((x, y), (255, 255, 255)) img2.show()得到圖像如上?
3. 保存圖像
(1)使用 PIL 庫
(之前的圖案因為不明原因違規取消了,現在換個圖片,但愿不會再次違規)
對于上面的得到的圖像使用 img2.save() 函數就可以進行保存:
img2.save('E:\Python\StudyOfOpencv\qilin1_1.jpeg')?(2)使用 OpenCV 庫
首先我們將圖像轉化為灰度圖像:
img1 = cv2.imread('E:\Python\StudyOfOpencv\qilin1.jpeg') cv2.namedWindow("Qilin") img_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #對圖像進行灰度處理 cv2.imshow("Qilin", img_gray)得到的灰度圖像如下:?
?再將其保存:?
cv2.imwrite('E:\Python\StudyOfOpencv\qilinone.jpeg', img_gray)如果報錯了檢查一下是否在保存路徑中忘了添加圖像后綴?
4. 獲取圖像屬性
使用 cv2.imread() 函數讀取圖像后,為顯示圖像的類型以及分辨率可以使用 print(img.shape), 前面提到過,這里就不贅述了
也提到過 print(img.size) 當然這適用于使用 Image.open() 得到的圖像
總結
這篇文章主要承接了上一篇文章 —— OpenCV 基礎,記錄了其他的幾種顯示圖像,保存圖像、觀察圖像特性的方法,主要也是為后面的學習打下基礎
總結
以上是生活随笔為你收集整理的Python 计算机视觉(三)—— 数字图像处理基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 计算机视觉(二) —— O
- 下一篇: Python 计算机视觉(四)—— Op