2019-09-27--GDAL

1. 利用GDAL处理JPG图像

(1)利用GDAL把array存成JPEG

利用GDAL库函数创建图像时,一般会用到GDALDriver类Create()函数,但是Create()函数不支持JPEG、PNG等格式,不过,CreateCopy()支持这些格式,所以根据已有的图像数据,不能直接创建jpg、png格式的图像,而要借助GDAL的MEM内存文件,来创建他们。

用GDAL存储图像时的顺序为BGR(一般彩色图像都是以BGR存储),但读取图像的顺序为RGB。

(2)利用GDAL把图像转换为JPEG

'''
-of 输出格式,默认GTiff。可以修改为所有GDAL支持的格式
-co create option。每种格式都有规定的co,需要查看格式说明。如:JPEG格式,可以使用WORLDFILE=YES(生成worldfile文 件).
-QUALITY=75(设置压缩率,默认是75%,只能取10~100范围的值,>95无法提高质量,但会增大文件)。
-b n:指定第几个波段对应的源数据波段数n。可以有多个。如果不指定,默认情况下是一一对应。
-a_srs assign srs指定的坐标系统。
'''
 # 设置jpg的压缩率
gdal_translate -of JPEG -co WORLDFILE=YES -co QUALITY=75 j50c4.vrt translatejpeg75.jpg

# 将四波段RGBA的tif转换成JPEG RGB。
gdal_translate -of JPEG -b 1 -b 2 -b 3 source.tif test.jpg

# 重新定义源图像的坐标系统(不能变换,只能定义,不改变图像值)
gdal_translate -a_srs EPSG:32650 -of GTiff J50_lonlat-L12.tif j50-2.tif

2. python不同图像库读取、存储图像时的差异记录

(1)数据维度

数据维度为:[Height, Width, Channel] or [Channel, Height, Width]
其中,channel也有顺序,一般是3波段数channels=3,但是顺序有差异,例如opencv对于读进来的图片的通道排列是BGR,而不是主流的RGB(其他图像库的一般是RGB,cv2的大坑)。

(2)opencv

opencv读入图片的矩阵格式是:(height,width,channels),读进来直接是numpy array,数据类型是uint8,可以按照numpy array进行数据操作。

import cv2
import numpy as np
#读入图片:默认彩色图,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) # 像素总数目
print(img.dtype)
print(img)
cv2.waitKey()

#opencv读入的矩阵是BGR,如果想转为RGB,可以这么转
img4 = cv2.imread('1.jpg')
img4 = cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)

或者,使用这种方式,调整通道顺序channel或band:

im_data_2 = im_data[::-1, :, :]     # RGB2BGR   C*H*N

上述代码中,在通道顺序为 [Channel, Width, Height]的情况下,第一维度是channel;这种情况下需要确定channel的波段顺序是什么,是RGB,还是BGR。可以利用代码中“ im_data[::-1, :, :] ”实现调整,第一维度逆序调整,第2,3维度不变。

(3)PIL Image

PIL读进来的图像是一个对象,而不是我们所熟知的numpy 矩阵。其他库读进来的图片都是以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')   # 转换为灰度图

#pillow读进来的图片不是矩阵,将图片转矩阵,channel last
arr = np.array(img)
print(arr.shape)   # [Height, Width, Channel] 
print(arr.dtype)   # uint8
# print(arr)   # print array 

#矩阵再转为图像
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() #复制图像

# 利用ROI裁切感兴趣区域的图像
roi = img.crop((0,0,300,300)) #(左上x,左上y,右下x,右下y)坐标
roi.show()  # show ROI picture

(4)skimage:skimage.io.imread

skimage可以读取超过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

绘图工具库。plt.imread读入的就是一个矩阵,跟opencv一样,但彩图读进的是RGB,与opencv有区别

import matplotlib.pyplot as plt
import numpy as np

image = plt.imread('1.jpg')
plt.imshow(image)
plt.show()

#也可以关闭显示x,y轴上的数字
image = plt.imread('1.jpg')
plt.imshow(image)
plt.axis('off')
plt.show()

im_r = image[:,:,0] #红色通道
plt.imshow(im_r)
plt.show()
#此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数解决
plt.imshow(im_r,cmap='Greys_r')
plt.show()

(6)总结

  • 除了opencv读入的彩色图片以BGR顺序存储外,其他所有图像库读入彩色图片都以RGB存储。
  • 除了PIL读入的图片是img类之外,其他库读进来的图片都是以numpy 矩阵。
  • 各个图像库的性能,opencv最佳。

————————————————
参考转载自:
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343