python預處理tif格式圖片

RGB彩色圖像大家都不陌生,但是什麼是真彩色、什麼是加彩色呢?[競賽羣裏看到別人說真彩色、假彩色,當時完全不懂,碰巧撞上了,記一下]
R原色對應TM4波段、G原色對應TM3波段、B原色對應TM2波段,合成得到標準假彩色影像。
R原色對應TM3波段、G原色對應TM2波段、B原色對應TM1波段,合成得到真彩色影像。
R原色對應TM7波段、G原色對應TM5波段、B原色對應TM2波段,合成得到其它假彩色影像。

通常遙感圖像有以下兩種編碼方式
img


tif格式圖片與常見的RGB三通道圖像不同,還可能包含如近紅外、中紅外、遠紅外以及熱紅外光譜信息。
在處理tif格式數據時,用opencv等庫無法解析,需要使用PIL或者libtiff中的TIFF

.這裏介紹一下如何對tif文件進行數據增強。
對高分辨率的遙感圖像先進行分割,隨機選取初始點,對圖像和標籤裁剪出固定大小的區域,對每一個區域進行翻轉、旋轉、高斯模糊等操作,之後存儲爲.tif數據格式文件。

#!usr/bin/env python
#-*- coding:utf-8 _*-
#@author:mqray
#@file: aug_data.py
#@time: 2019/6/21 16:19

from PIL import Image,ImageFilter,ImageDraw,ImageEnhance
import  random
import os
import  numpy as np
from tqdm import tqdm

img_weight = 256
img_height = 256

def file_name(file_path):
    img_name_list = []
    for root,dirs,files in os.walk(file_path):
        for file in files:
            img_name = os.path.split(file)[1]
            img_name_list.append(img_name)
    return img_name_list

img_store_list = file_name(r'C:\Users\Administrator\Desktop\PG1\2019seg\train\src')
# print(img_store_list)

def add_noise(img):
    # length, height, dims = img.shape
    drawObject = ImageDraw.Draw(img)
    for i in range(250):
        tmp_x = np.random.randint(0,img.size[0])
        tmp_y = np.random.randint(0,img.size[1])
        drawObject.point((tmp_x,tmp_y),fill='black')#添加白噪聲,噪點顏色可變
    return img

#色調增強
def random_color(img):
    img = ImageEnhance.Color(img)
    img = img.enhance(2)
    return img

def data_augment(row_roi,label_roi):
    #圖像標籤同時進行90,180,270旋轉
    if np.random.random() < 0.25:
        row_roi = row_roi.rotate(90)
        label_roi = label_roi.rotate(90)
    if np.random.random() < 0.25:
        row_roi = row_roi.rotate(180)
        label_roi = label_roi.rotate(180)
    if np.random.random() < 0.25:
        row_roi = row_roi.rotate(270)
        label_roi = label_roi.rotate(270)

    #圖像、標籤同時豎直旋轉
    if np.random.random() < 0.25:
        row_roi = row_roi.transpose(Image.FLIP_LEFT_RIGHT)
        label_roi = label_roi.transpose(Image.FLIP_LEFT_RIGHT)
    #圖像、標籤同時水平旋轉
    if np.random.random() < 0.25:
        row_roi = row_roi.transpose(Image.FLIP_TOP_BOTTOM)
        label_roi = label_roi.transpose(Image.FLIP_TOP_BOTTOM)
    #對圖像進行高斯模糊
    if np.random.random() < 0.25:
        row_roi = row_roi.filter(ImageFilter.GaussianBlur)
    #對圖像進行色調增強
    if np.random.random() < 0.25:
        row_roi = random_color(row_roi)
    #對圖像加噪聲
    if np.random.random() < 0.25:
        row_roi = add_noise(row_roi)

    return row_roi,label_roi

def create_dataset(img_nums=100000,mode = 'orginal'):
    print('creating dataset...')
    src_path = r'C:\Users\Administrator\Desktop\PG1\2019seg\train\src'
    label_path = r'C:\Users\Administrator\Desktop\PG1\2019seg\train\label'
    single_img_count = img_nums/len(img_store_list)
    g_count = 0
    le = len(img_store_list)
    for i in tqdm(range(le)):
        count = 0
        row_img_path = src_path + os.sep + img_store_list[i]
        label_img_path = label_path + os.sep + img_store_list[i]
        row_img = Image.open(row_img_path)
        label_img = Image.open(row_img_path)

        while(count<single_img_count):
            w1 = random.randint(0,row_img.size[0] - img_weight)
            h1 = random.randint(0,row_img.size[1] - img_height)
            w2 = w1 + img_weight
            h2 = h1 + img_height

            row_img = row_img.crop((w1,h1,w2,h2))
            label_img = label_img.crop((w1,h1,w2,h2))

            if mode == 'augment':
                row_img,label_img = data_augment(row_img,label_img)
            row_img_store = r'E:\PycharmProjects\ImageProcessing\img_store\train_row\%d.tif' % g_count
            label_img_store = r'E:\PycharmProjects\ImageProcessing\img_store\train_label\%d.tif' % g_count
            print(label_img_store)
            row_img.save(row_img_store)
            label_img.save(label_img_store)

            count += 1
            g_count += 1


if __name__ == '__main__':
    create_dataset(mode='augment')

參考:
1.使用Python對tif格式圖片進行隨機裁剪和數據增廣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章