2019-09-27--GDAL

作者: qiwener | 来源:发表于2019-09-29 11:15 被阅读0次

    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

    相关文章

      网友评论

        本文标题:2019-09-27--GDAL

        本文链接:https://www.haomeiwen.com/subject/zqpouctx.html