1. 利用GDAL處理JPG圖像
(1)利用GDAL把a(bǔ)rray存成JPEG
利用GDAL庫(kù)函數(shù)創(chuàng)建圖像時(shí)倚舀,一般會(huì)用到GDALDriver類Create()函數(shù),但是Create()函數(shù)不支持JPEG勤揩、PNG等格式,不過(guò)秘蛔,CreateCopy()支持這些格式陨亡,所以根據(jù)已有的圖像數(shù)據(jù),不能直接創(chuàng)建jpg深员、png格式的圖像负蠕,而要借助GDAL的MEM內(nèi)存文件,來(lái)創(chuàng)建他們辨液。
用GDAL存儲(chǔ)圖像時(shí)的順序?yàn)锽GR(一般彩色圖像都是以BGR存儲(chǔ))虐急,但讀取圖像的順序?yàn)镽GB。
(2)利用GDAL把圖像轉(zhuǎn)換為JPEG
'''
-of 輸出格式滔迈,默認(rèn)GTiff止吁。可以修改為所有GDAL支持的格式
-co create option燎悍。每種格式都有規(guī)定的co敬惦,需要查看格式說(shuō)明。如:JPEG格式谈山,可以使用WORLDFILE=YES(生成worldfile文 件).
-QUALITY=75(設(shè)置壓縮率俄删,默認(rèn)是75%,只能取10~100范圍的值奏路,>95無(wú)法提高質(zhì)量畴椰,但會(huì)增大文件)。
-b n:指定第幾個(gè)波段對(duì)應(yīng)的源數(shù)據(jù)波段數(shù)n鸽粉⌒敝可以有多個(gè)。如果不指定触机,默認(rèn)情況下是一一對(duì)應(yīng)帚戳。
-a_srs assign srs指定的坐標(biāo)系統(tǒng)。
'''
# 設(shè)置jpg的壓縮率
gdal_translate -of JPEG -co WORLDFILE=YES -co QUALITY=75 j50c4.vrt translatejpeg75.jpg
# 將四波段RGBA的tif轉(zhuǎn)換成JPEG RGB儡首。
gdal_translate -of JPEG -b 1 -b 2 -b 3 source.tif test.jpg
# 重新定義源圖像的坐標(biāo)系統(tǒng)(不能變換片任,只能定義,不改變圖像值)
gdal_translate -a_srs EPSG:32650 -of GTiff J50_lonlat-L12.tif j50-2.tif
2. python不同圖像庫(kù)讀取蔬胯、存儲(chǔ)圖像時(shí)的差異記錄
(1)數(shù)據(jù)維度
數(shù)據(jù)維度為:[Height, Width, Channel] or [Channel, Height, Width]
其中对供,channel也有順序,一般是3波段數(shù)channels=3笔宿,但是順序有差異犁钟,例如opencv對(duì)于讀進(jìn)來(lái)的圖片的通道排列是BGR棱诱,而不是主流的RGB(其他圖像庫(kù)的一般是RGB,cv2的大坑)涝动。
(2)opencv
opencv讀入圖片的矩陣格式是:(height,width,channels)迈勋,讀進(jìn)來(lái)直接是numpy array,數(shù)據(jù)類型是uint8醋粟,可以按照numpy array進(jìn)行數(shù)據(jù)操作靡菇。
import cv2
import numpy as np
#讀入圖片:默認(rèn)彩色圖,cv2.IMREAD_GRAYSCALE灰度圖米愿,cv2.IMREAD_UNCHANGED包含alpha通道
img = cv2.imread('1.jpg')
cv2.imshow('src',img)
print(img.shape) # (h,w,c)
print(img.size) # 像素總數(shù)目
print(img.dtype)
print(img)
cv2.waitKey()
#opencv讀入的矩陣是BGR厦凤,如果想轉(zhuǎn)為RGB,可以這么轉(zhuǎn)
img4 = cv2.imread('1.jpg')
img4 = cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)
或者育苟,使用這種方式较鼓,調(diào)整通道順序channel或band:
im_data_2 = im_data[::-1, :, :] # RGB2BGR C*H*N
上述代碼中,在通道順序?yàn)?[Channel, Width, Height]的情況下违柏,第一維度是channel博烂;這種情況下需要確定channel的波段順序是什么,是RGB漱竖,還是BGR禽篱。可以利用代碼中“ im_data[::-1, :, :] ”實(shí)現(xiàn)調(diào)整馍惹,第一維度逆序調(diào)整躺率,第2,3維度不變。
(3)PIL Image
PIL讀進(jìn)來(lái)的圖像是一個(gè)對(duì)象万矾,而不是我們所熟知的numpy 矩陣悼吱。其他庫(kù)讀進(jìn)來(lái)的圖片都是以numpy 矩陣。
from PIL import Image
import numpy as np
img = Image.open('1.jpg')
print(img.format) # JPG format
print(img.size) # (w良狈,h)
print(img.mode) # L為灰度圖舆绎,RGB為真彩色,RGBA為加了透明通道
img.show() # 顯示圖片
gray = Image.open('1.jpg').convert('L') # 轉(zhuǎn)換為灰度圖
#pillow讀進(jìn)來(lái)的圖片不是矩陣,將圖片轉(zhuǎn)矩陣,channel last
arr = np.array(img)
print(arr.shape) # [Height, Width, Channel]
print(arr.dtype) # uint8
# print(arr) # print array
#矩陣再轉(zhuǎn)為圖像
new_im = Image.fromarray(arr)
new_im.save('new.png')
#分離合并通道
r, g, b = img.split()
img = Image.merge("RGB", (b, g, r))
img = img.copy() #復(fù)制圖像
# 利用ROI裁切感興趣區(qū)域的圖像
roi = img.crop((0,0,300,300)) #(左上x(chóng)们颜,左上y,右下x猎醇,右下y)坐標(biāo)
roi.show() # show ROI picture
(4)skimage:skimage.io.imread
skimage可以讀取超過(guò)3波段的圖像窥突。圖像也是以numpy array形式讀入。
from skimage import io
im = io.imread('1.jpg')
print(im.shape) # numpy矩陣硫嘶,(h,w,c)
print(im.dtype) # uint8
print(im.size) # h*w
io.imshow(im)
io.imsave('sk.png',im) # save as other picture
print(im)
im2 = io.imread('1.jpg',as_grey=True) #讀入灰度圖阻问,但是灰度圖像的矩陣的值被歸一化了。
#也可以以這種方式獲得灰度圖:
from skimage import color
im3 = io.imread('1.jpg')
im3 = color.rgb2grey(im3)
print(im3.dtype)
print(im3.size)
print(im3.shape)
io.imshow(im3)
io.show()
'''
skimage.color.rgb2grey(rgb)
skimage.color.rgb2hsv(rgb)
skimage.color.rgb2lab(rgb)
skimage.color.gray2rgb(image)
skimage.color.hsv2rgb(hsv)
skimage.color.lab2rgb(lab)
'''
(5)matplotlib:matplotlib.image.imread
繪圖工具庫(kù)沦疾。plt.imread讀入的就是一個(gè)矩陣称近,跟opencv一樣第队,但彩圖讀進(jìn)的是RGB,與opencv有區(qū)別
import matplotlib.pyplot as plt
import numpy as np
image = plt.imread('1.jpg')
plt.imshow(image)
plt.show()
#也可以關(guān)閉顯示x刨秆,y軸上的數(shù)字
image = plt.imread('1.jpg')
plt.imshow(image)
plt.axis('off')
plt.show()
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()
(6)總結(jié)
- 除了opencv讀入的彩色圖片以BGR順序存儲(chǔ)外衡未,其他所有圖像庫(kù)讀入彩色圖片都以RGB存儲(chǔ)尸执。
- 除了PIL讀入的圖片是img類之外,其他庫(kù)讀進(jìn)來(lái)的圖片都是以numpy 矩陣缓醋。
- 各個(gè)圖像庫(kù)的性能如失,opencv最佳。
————————————————
參考轉(zhuǎn)載自:
https://blog.csdn.net/hong__fang/article/details/42266215
http://blog.sina.com.cn/s/blog_a7ebc03b0102xaqg.html
https://www.cnblogs.com/skyfsm/p/8276501.html