目錄
- 一、前言
- 二、opencv——cv2.imread
- 三、PIL——PIL.Image.open
- 四、matplotlib——matplotlib.image.imread
- 五、scipy.misc——scipy.misc.imread
- 六、skimage——skimage.io.imread
- 七、Tensorflow——tf.image.decode
- 八、總結(jié)
- #、參考文章
一、前言
在研究深度學(xué)習(xí)計(jì)算機(jī)視覺的時(shí)候,經(jīng)常需要進(jìn)行圖像讀取,但是各種第三方庫的方法又不一樣,用的時(shí)候又有點(diǎn)萌萌的,不知道有什么區(qū)別,比較常用的就是
OpenCV
和
PIL
的
Image
,但是在格式上也總是有各種各樣的問題,所以這一次就好好總結(jié)主流Python圖像庫的一些基本使用方法和需要注意的地方。
1. Opencv
2. PIL(pillow)
3. matplotlib.image
4. scipy.misc
5. skimage
6. Tensorflow
二、opencv——cv2.imread
OpenCV作為最常用的圖像處理庫,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法,可以說是很全面和強(qiáng)大了。如果你只想掌握一個(gè)圖像庫的話,OpenCV是你的最佳選擇。
注意 :
- OpenCV 讀進(jìn)來的圖片已經(jīng)是一個(gè) numpy 矩陣了,彩色圖片維度是高度、寬度、通道數(shù)(height,width,channels),數(shù)據(jù)類型是 uint8 。
- OpenCV 讀進(jìn)來的圖片的通道排列是 BGR ,而不是主流的 RGB ,需要轉(zhuǎn)換才能變成 RGB 。
- OpenCV 讀取灰度圖的時(shí)候,可以直接參數(shù)讀取灰度圖;或者先讀入彩色圖,再轉(zhuǎn)灰度圖。
import
cv2
import
matplotlib
.
pyplot
as
plt
# 讀入圖片:默認(rèn)彩色圖,cv2.IMREAD_GRAYSCALE灰度圖,cv2.IMREAD_UNCHANGED包含alpha通道
img
=
cv2
.
imread
(
'2.jpg'
)
gray
=
cv2
.
cvtColor
(
img
,
cv2
.
COLOR_BGR2GRAY
)
# 轉(zhuǎn)換為灰度圖
img_rgb
=
cv2
.
cvtColor
(
img
,
cv2
.
COLOR_BGR2RGB
)
# 轉(zhuǎn)換為RGB
# plt顯示圖像
plt
.
subplot
(
131
)
plt
.
imshow
(
img
)
plt
.
title
(
'img'
)
plt
.
axis
(
'off'
)
plt
.
subplot
(
132
)
plt
.
imshow
(
gray
)
plt
.
title
(
'gray'
)
plt
.
axis
(
'off'
)
plt
.
subplot
(
133
)
plt
.
imshow
(
img_rgb
)
plt
.
title
(
'img_rgb'
)
plt
.
axis
(
'off'
)
plt
.
show
(
)
# cv2顯示圖像
cv2
.
imshow
(
'src'
,
img
)
cv2
.
imshow
(
'gray'
,
gray
)
cv2
.
imshow
(
'RGB'
,
img_rgb
)
print
(
img
.
shape
)
# (h,w,c)
print
(
img
.
size
)
# 像素總數(shù)目
print
(
img
.
dtype
)
# 像素類型
print
(
gray
.
shape
)
print
(
gray
.
size
)
print
(
gray
.
dtype
)
cv2
.
imwrite
(
'test.jpg'
,
img_rgb
)
# 保存圖像
cv2
.
waitKey
(
)
# 一直顯示
# (336, 500, 3)
# 504000
# uint8
# (336, 500)
# 168000
# uint8
plt
顯示圖像:
cv2
顯示圖像:
細(xì)心的同學(xué)發(fā)現(xiàn)一個(gè)問題,
plt
和
cv2
顯示圖像顏色恰好是相反的,這是一個(gè)接口的問題,因?yàn)?
plt
是RGB接口的,但是
cv2
是BGR接口的,所以
plt
顯示的是正確的顏色,也就是‘BGR’、灰度圖、‘RGB’,但是
cv2
顯示就是相反的顏色。
除此之外,OpenCV 對于讀進(jìn)來的圖片的通道排列是 BGR ,而不是主流的 RGB ,這也是它最被人詬病的地方,容易出錯(cuò),千萬要注意。
# opencv讀入的矩陣是BGR,轉(zhuǎn)為RGB
# img_cv2(BGR) --> img_rgb(RGB)
img_cv2
=
cv2
.
imread
(
'1.jpg'
)
img_rgb
=
cv2
.
cvtColor
(
img_cv2
,
cv2
.
COLOR_BGR2RGB
)
OpenCV 讀取灰度圖的時(shí)候,可以直接參數(shù)讀取灰度圖;或者先讀入彩色圖,再轉(zhuǎn)灰度圖。
import
cv2
# 直接參數(shù)讀取灰度圖
gray1
=
cv2
.
imread
(
'1.jpg'
,
cv2
.
IMREAD_GRAYSCALE
)
# 灰度圖
cv2
.
imshow
(
'gray1'
,
gray1
)
# 也可以這么寫,先讀入彩色圖,再轉(zhuǎn)灰度圖
src
=
cv2
.
imread
(
'1.jpg'
)
gray2
=
cv2
.
cvtColor
(
src
,
cv2
.
COLOR_BGR2GRAY
)
cv2
.
imshow
(
'gray2'
,
gray2
)
cv2
.
waitKey
(
)
兩種讀取灰度圖方法的結(jié)果是完全相同的。
正常情況下,我們的圖片是0-255的,但是有時(shí)候我們需要?dú)w一化處理為0~1。
# opencv讀入的圖片矩陣數(shù)值是0到255
import
cv2
img_norm
=
cv2
.
imread
(
'1.jpg'
)
img_norm
=
img_norm
.
astype
(
"float"
)
/
255.0
# 注意需要先轉(zhuǎn)化數(shù)據(jù)類型為float
print
(
img_norm
.
dtype
)
print
(
img_norm
)
cv2
.
imshow
(
'img_norm'
,
img_norm
)
cv2
.
waitKey
(
)
# float64
[
[
[
0.88235294
0.89019608
0.86666667
]
[
0.88235294
0.88627451
0.87058824
]
[
0.8745098
0.87843137
0.8627451
]
.
.
.
.
.
.
[
0
.
0.08235294
0.10588235
]
[
0
.
0.02745098
0.04705882
]
[
0
.
0.03137255
0.04313725
]
]
]
OpenCV如何進(jìn)行存儲(chǔ)圖片呢?使用
cv2.imwrite
函數(shù)即可。
# 存儲(chǔ)圖片
cv2
.
imwrite
(
'test1.jpg'
,
img_norm
)
# 得到的是全黑的圖片,因?yàn)槲覀儼阉鼩w一化了
# 所以要得到可視化的圖,需要先*255還原
img_test
=
img_norm
*
255
cv2
.
imwrite
(
'test2.jpg'
,
img_test
)
# 這樣就可以看到彩色原圖了
三、PIL——PIL.Image.open
PIL 即 Python Imaging Library,也即為我們所稱的 Pillow,已經(jīng)是 Python 平臺(tái)事實(shí)上的圖像處理標(biāo)準(zhǔn)庫了。PIL 功能非常強(qiáng)大,但API卻非常簡單易用。它比 OpenCV 更為輕巧,正因如此,它深受大眾的喜愛。
from
PIL
import
Image
import
numpy
as
np
img
=
Image
.
open
(
'1.jpg'
)
print
(
img
.
format
)
print
(
img
.
size
)
# 注意,省略了通道。 (w,h)
print
(
img
.
mode
)
# L為灰度圖,RGB為真彩色,RGBA為加了透明通道
img
.
show
(
)
# 顯示圖片
gray
=
img
.
convert
(
'L'
)
# 轉(zhuǎn)化為灰度圖
print
(
gray
.
mode
)
# L為灰度圖,RGB為真彩色,RGBA為加了透明通道
gray
.
show
(
)
# pillow讀進(jìn)來的圖片不是矩陣,我們將圖片轉(zhuǎn)矩陣
arr
=
np
.
array
(
img
)
print
(
arr
.
shape
)
print
(
arr
.
dtype
)
print
(
arr
)
# 灰度圖的轉(zhuǎn)化與彩圖轉(zhuǎn)化一樣
arr_gray
=
np
.
array
(
gray
)
print
(
arr_gray
.
shape
)
print
(
arr_gray
.
dtype
)
print
(
arr_gray
)
# 矩陣再轉(zhuǎn)為圖像,進(jìn)行存儲(chǔ)
new_im
=
Image
.
fromarray
(
arr
)
new_im
.
save
(
'test.png'
)
# JPEG
# (500, 336)
# RGB
# L
# (336, 500, 3)
# uint8
[
[
[
221
227
225
]
[
222
226
225
]
[
220
224
223
]
.
.
.
.
.
.
[
27
21
0
]
[
12
7
0
]
[
11
8
0
]
]
]
# (336, 500)
# uint8
[
[
224
224
222
.
.
.
223
223
223
]
[
226
225
224
.
.
.
222
222
222
]
[
225
225
225
.
.
.
222
222
222
]
.
.
.
[
240
242
245
.
.
.
1
1
5
]
[
242
239
242
.
.
.
10
2
5
]
[
236
229
232
.
.
.
20
7
7
]
]
四、matplotlib——matplotlib.image.imread
Matplotlib 是 Python 的 2D 繪圖庫,它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。
import
matplotlib
.
pyplot
as
plt
image
=
plt
.
imread
(
'1.jpg'
)
plt
.
imshow
(
image
)
plt
.
show
(
)
image2
=
plt
.
imread
(
'1.jpg'
)
plt
.
imshow
(
image2
)
plt
.
axis
(
'off'
)
# 也可以關(guān)閉顯示x,y軸上的數(shù)字
plt
.
show
(
)
# plt.imread讀入的就是一個(gè)矩陣,跟opencv一樣,但彩圖讀進(jìn)的是RGB,與opencv有區(qū)別
print
(
image
.
shape
)
# (h,w,c)
print
(
image
.
size
)
print
(
image
.
dtype
)
print
(
image
)
# (336, 500, 3)
# 504000
# uint8
[
[
[
221
227
225
]
[
222
226
225
]
[
220
224
223
]
.
.
.
.
.
.
[
27
21
0
]
[
12
7
0
]
[
11
8
0
]
]
]
import
matplotlib
.
pyplot
as
plt
image
=
plt
.
imread
(
'1.jpg'
)
im_r
=
image
[
:
,
:
,
0
]
# 紅色通道
plt
.
imshow
(
im_r
)
plt
.
show
(
)
# 此時(shí)會(huì)發(fā)現(xiàn)顯示的是熱量圖,不是我們預(yù)想的灰度圖,可以添加 cmap 參數(shù)解決
plt
.
imshow
(
im_r
,
cmap
=
'Greys_r'
)
plt
.
show
(
)
# 與opencv結(jié)合使用
import
cv2
import
matplotlib
.
pyplot
as
plt
image2
=
cv2
.
imread
(
'1.jpg'
)
plt
.
imshow
(
image2
)
plt
.
axis
(
'off'
)
plt
.
show
(
)
# 發(fā)現(xiàn)圖像顏色怪怪的,原因是我們前面提到的cv2讀取圖片時(shí)的RGB順序不同的原因,轉(zhuǎn)換一下就可以了
image2
=
cv2
.
cvtColor
(
image2
,
cv2
.
COLOR_BGR2RGB
)
plt
.
imshow
(
image2
)
plt
.
axis
(
'off'
)
plt
.
show
(
)
# 所以無論用什么庫讀進(jìn)圖片,只要把圖片改為矩陣,那么matplotlib就可以處理了
# pillow和matplotlib結(jié)合
from
PIL
import
Image
import
numpy
as
np
import
matplotlib
.
pyplot
as
plt
image3
=
Image
.
open
(
'1.jpg'
)
image3
=
np
.
array
(
image3
)
plt
.
figure
(
)
plt
.
imshow
(
image3
)
plt
.
axis
(
'off'
)
# 存儲(chǔ)圖像,注意,必須在show之前savefig,否則存儲(chǔ)的圖片一片空白
plt
.
savefig
(
'timo.jpg'
)
plt
.
show
(
)
如果先
plt.show
,再
plt.savefig
,保存的圖片就是全白色的。
import
matplotlib
.
pyplot
as
plt
im_1
=
plt
.
imread
(
'1.jpg'
)
im_2
=
plt
.
imread
(
'2.jpg'
)
figure
=
plt
.
figure
(
figsize
=
(
10
,
5
)
)
# 調(diào)整顯示圖片的大小
''' figsize參數(shù):指定繪圖對象的寬度和高度,單位為英寸; dpi參數(shù)指定繪圖對象的分辨率,即每英寸多少個(gè)像素,缺省值為80。 因此本例中所創(chuàng)建的圖表窗口的寬度為10*80 = 800像素 '''
plt
.
axis
(
"off"
)
# 不顯示刻度
ax
=
figure
.
add_subplot
(
121
)
# 圖片以1行2列的形式顯示
plt
.
axis
(
'off'
)
ax
.
imshow
(
im_1
)
# 第一張圖
ax
.
set_title
(
'image 1'
)
# 給圖片加titile
ax
=
figure
.
add_subplot
(
122
)
plt
.
axis
(
'off'
)
ax
.
imshow
(
im_2
)
# 第二張圖
ax
.
set_title
(
'image 2'
)
# 給圖片加titile
plt
.
savefig
(
'twp.jpg'
)
plt
.
show
(
)
五、scipy.misc——scipy.misc.imread
from
scipy
import
misc
import
matplotlib
.
pyplot
as
plt
im
=
misc
.
imread
(
'1.jpg'
)
print
(
im
.
dtype
)
print
(
im
.
size
)
print
(
im
.
shape
)
# 存儲(chǔ)圖像,這個(gè)不需要先存儲(chǔ),和前面不一樣
misc
.
imsave
(
'misc1.png'
,
im
)
plt
.
imshow
(
im
)
plt
.
show
(
)
print
(
im
)
# uint8
# 504000
# (336, 500, 3)
[
[
[
221
227
225
]
[
222
226
225
]
[
220
224
223
]
.
.
.
.
.
.
[
27
21
0
]
[
12
7
0
]
[
11
8
0
]
]
]
六、skimage——skimage.io.imread
from
skimage
import
io
image
=
io
.
imread
(
'1.jpg'
)
print
(
image
.
shape
)
# numpy矩陣,(h,w,c)
print
(
image
.
dtype
)
print
(
image
.
size
)
io
.
imshow
(
image
)
# 存儲(chǔ)圖像,這個(gè)不需要先存儲(chǔ),和前面不一樣
io
.
imsave
(
'sk.png'
,
image
)
io
.
show
(
)
print
(
image
)
# (336, 500, 3)
# uint8
# 504000
[
[
[
221
227
225
]
[
222
226
225
]
[
220
224
223
]
.
.
.
.
.
.
[
27
21
0
]
[
12
7
0
]
[
11
8
0
]
]
]
from
skimage
import
io
# from skimage import color
image2
=
io
.
imread
(
'1.jpg'
,
as_grey
=
True
)
# 讀入灰度圖
# image3 = io.imread('1.jpg')
# image3 = color.rgb2grey(image3)
''' skimage.color.rgb2grey(rgb) skimage.color.rgb2hsv(rgb) skimage.color.rgb2lab(rgb) skimage.color.gray2rgb(image) skimage.color.hsv2rgb(hsv) skimage.color.lab2rgb(lab) '''
print
(
image2
.
dtype
)
print
(
image2
.
size
)
print
(
image2
.
shape
)
io
.
imshow
(
image2
)
io
.
imsave
(
'sk_gray.png'
,
image2
)
io
.
show
(
)
print
(
image2
)
# float64
# 168000
# (336, 500)
[
[
0.88463059
0.88265843
0.87481529
.
.
.
0.87390667
0.87390667
0.87390667
]
[
0.89247373
0.88658
0.88265843
.
.
.
0.87307333
0.87307333
0.87307333
]
[
0.88658
0.88658
0.8843251
.
.
.
0.87253765
0.87253765
0.87253765
]
.
.
.
[
0.94454039
0.95238353
0.96414824
.
.
.
0.00333333
0.00361608
0.01876667
]
[
0.95238353
0.94061882
0.95238353
.
.
.
0.04138824
0.01061098
0.01872196
]
[
0.92885412
0.90140314
0.91316784
.
.
.
0.08141529
0.02963843
0.03161059
]
]
七、Tensorflow——tf.image.decode
tf.image.decode
是一系列的函數(shù):
-
tf.image.decode_bmp
channels = ?
0:使用BMP編碼圖像中的通道數(shù)量。
3:輸出RGB圖像。
4:輸出RGBA圖像。
-
tf.image.decode_jpeg
channels = ?
0:使用JPEG編碼圖像中的通道數(shù)量。
1:輸出灰度圖像。
3:輸出RGB圖像。
-
tf.image.decode_png
channels = ?
0:使用PNG編碼圖像中的通道數(shù)量。
1:輸出灰度圖像。
3:輸出RGB圖像。
4:輸出RGBA圖像。
實(shí)例推薦博客——TensorFlow圖像數(shù)據(jù)處理函數(shù)——圖像大小調(diào)整(最全面的可運(yùn)行的代碼)
八、總結(jié)
TensorFlow 的讀取方式使用的比較少,除了 TensorFlow 之外,大都是比較熱門的方法。
除了 OpenCV 讀入的彩色圖片以 BGR 順序存儲(chǔ)外,其他所有圖像庫讀入彩色圖片都以 RGB 存儲(chǔ)。
除了 PIL 讀入的圖片是 img 類之外,其他庫讀進(jìn)來的圖片都是以 numpy 矩陣。
綜合來看,還是 OpenCV 的性能更好,更推薦使用。
#、參考文章
- Python各類圖像庫的圖片讀寫方式總結(jié)
- https://www.w3cschool.cn/tensorflow_python/
- 官方API文檔
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
