图像处理tif图片

2019-11-13 09:12:02 Harbour_zhang 阅读数 472
  • 异常处理及程序打包

    1、快速的进行python语言的入门,并在使用过程中得到提升 2、python常用库的深入理解 3、机器学习算法原理的讲解及python实现 4、机器学习、python处理轨迹数据的案例应用

    34人学习 王静
    免费试看

二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色。

在图像处理中,常用的二值图像是‘.TIF’格式的。这种格式的文件,每一个像素只由1比特的 0 或者 1组成。

例如,一张这样的二值图像:

在这里插入图片描述
在MATLAB 读取后,是一个256 * 256 的 由 0 或 1 组成的矩阵。

下面贴出把JPG格式图片转为TIF的MATLAB代码 :

img = imread('lena.jpg');  % 读取图片
i = rgb2gray(img)          % 转为灰度图片
level = graythresh(i);     % 自动选择转换为二值图像的阈值
b=imbinarize(i,level);     % 图像二值化
imshow(b);				   % 显示图片


imwrite(b,'lena.tif');      % 存储图片
2018-08-28 12:00:13 lovetobelove 阅读数 2897
  • 异常处理及程序打包

    1、快速的进行python语言的入门,并在使用过程中得到提升 2、python常用库的深入理解 3、机器学习算法原理的讲解及python实现 4、机器学习、python处理轨迹数据的案例应用

    34人学习 王静
    免费试看

        最近做课题,图片都是2.5G左右的tif格式图片,太大了,各种软件都打不开,于是用matlab打开并处理。

        首先我的电脑配置 :i5处理器,8G,win 10 操作系统64位,matlab版本: matlab2014a,64位

下面 的程序是将一张图片,分成10*10,100张的小图,原创具体我忘了在哪找的了,如有侵权,请私信我。

clc;
clear all;
src_path='F:\1.tif'; %%原始图片路径
dst_path='F:\分解图片 第10张\';   %%分割后保存图片的路径

A=imread(src_path);            %读入图片路径
[m,n,h]=size(A);               %取出图片的行列

for i = 1:10
for j = 1:10
m_start=1+(i-1)*fix(m/10);       %%分块
m_end=i*fix(m/10);
n_start=1+(j-1)*fix(n/10);
n_end=j*fix(n/10);
a=A(m_start:m_end,n_start:n_end,:);  %将每块读入矩阵

imwrite(a,[dst_path num2str(i) '-' num2str(j) '.tif'],'tif');  
                                %保存每块图片,输出命名为1-1等
end
end 

 

2019-04-17 17:07:21 zsc201825 阅读数 1429
  • 异常处理及程序打包

    1、快速的进行python语言的入门,并在使用过程中得到提升 2、python常用库的深入理解 3、机器学习算法原理的讲解及python实现 4、机器学习、python处理轨迹数据的案例应用

    34人学习 王静
    免费试看

语言:Python,主要函数包:gdal,代码如下:

import gdal

# 读取要切的原图
in_ds = gdal.Open("1060_50.tif")
print("open tif file succeed")
width = in_ds.RasterXSize                         # 获取数据宽度
height = in_ds.RasterYSize                        # 获取数据高度
outbandsize = in_ds.RasterCount                   # 获取数据波段数
im_geotrans = in_ds.GetGeoTransform()             # 获取仿射矩阵信息
im_proj = in_ds.GetProjection()                   # 获取投影信息
datatype = in_ds.GetRasterBand(1).DataType
im_data = in_ds.ReadAsArray()                     #获取数据 

# 读取原图中的每个波段
in_band1 = in_ds.GetRasterBand(1)
in_band2 = in_ds.GetRasterBand(2)
in_band3 = in_ds.GetRasterBand(3)

# 定义切图的起始点坐标
offset_x = 0  
offset_y = 0

#offset_x = width/2  # 这里是随便选取的,可根据自己的实际需要设置
#offset_y = height/2

# 定义切图的大小(矩形框)
block_xsize = 100  # 行
block_ysize = 100  # 列

k=0
for i in range(width//block_xsize):
    for j in range(height//block_xsize):
        out_band1 = in_band1.ReadAsArray(i*block_xsize, j*block_xsize, block_xsize, block_ysize)
        out_band2 = in_band2.ReadAsArray(i*block_xsize, j*block_xsize, block_xsize, block_ysize)
        out_band3 = in_band3.ReadAsArray(i*block_xsize, j*block_xsize, block_xsize, block_ysize)
        print(out_band3)
        k+=1

## 从每个波段中切需要的矩形框内的数据(注意读取的矩形框不能超过原图大小)
#out_band1 = in_band1.ReadAsArray(offset_x, offset_y, block_xsize, block_ysize)
#out_band2 = in_band2.ReadAsArray(offset_x, offset_y, block_xsize, block_ysize)
#out_band3 = in_band3.ReadAsArray(offset_x, offset_y, block_xsize, block_ysize)

# 获取Tif的驱动,为创建切出来的图文件做准备
        gtif_driver = gdal.GetDriverByName("GTiff")

# 创建切出来的要存的文件(3代表3个不都按,最后一个参数为数据类型,跟原文件一致)
        out_ds = gtif_driver.Create(str(k)+'clip4.tif', block_xsize, block_ysize, outbandsize, datatype)
#print("create new tif file succeed")

        # 获取原图的原点坐标信息
        ori_transform = in_ds.GetGeoTransform()
        if ori_transform:
            print (ori_transform)
            print("Origin = ({}, {})".format(ori_transform[0], ori_transform[3]))
            print("Pixel Size = ({}, {})".format(ori_transform[1], ori_transform[5]))
        
        # 读取原图仿射变换参数值
        top_left_x = ori_transform[0]  # 左上角x坐标
        w_e_pixel_resolution = ori_transform[1] # 东西方向像素分辨率
        top_left_y = ori_transform[3] # 左上角y坐标
        n_s_pixel_resolution = ori_transform[5] # 南北方向像素分辨率
        
        # 根据反射变换参数计算新图的原点坐标
        top_left_x = top_left_x + i*block_xsize * w_e_pixel_resolution
        top_left_y = top_left_y + j*block_xsize * n_s_pixel_resolution
        
        # 将计算后的值组装为一个元组,以方便设置
        dst_transform = (top_left_x, ori_transform[1], ori_transform[2], top_left_y, ori_transform[4], ori_transform[5])
        
        # 设置裁剪出来图的原点坐标
        out_ds.SetGeoTransform(dst_transform)
        
        # 设置SRS属性(投影信息)
        out_ds.SetProjection(in_ds.GetProjection())
        
        # 写入目标文件
        out_ds.GetRasterBand(1).WriteArray(out_band1)
        out_ds.GetRasterBand(2).WriteArray(out_band2)
        out_ds.GetRasterBand(3).WriteArray(out_band3)
        
        # 将缓存写入磁盘
        out_ds.FlushCache()
        print("FlushCache succeed")
        
        # 计算统计值
        # for i in range(1, 3):
        #     out_ds.GetRasterBand(i).ComputeStatistics(False)
        # print("ComputeStatistics succeed")
        
        del out_ds
        
        print("End!")

 

2013-03-16 00:14:43 Augusdi 阅读数 3733
  • 异常处理及程序打包

    1、快速的进行python语言的入门,并在使用过程中得到提升 2、python常用库的深入理解 3、机器学习算法原理的讲解及python实现 4、机器学习、python处理轨迹数据的案例应用

    34人学习 王静
    免费试看

       tif图片主要分为两种:一种是单张的,还有一种是分层的,分层的tif图片其实就一张tif图片里面包含多张图片,然后可以翻页的那种,有点类似于动态GIF图片,不过tif的翻页不是自动的,需要手动点击翻页按钮才行,下面就是一张tif分层的图片(网上不太好找,可以自己下一个AcdSee做tif的图片)。

一、使用cxImage读取tif图片

        对于单张的tif图片,直接可以用以下方式来读取:

CxImage*   cxImg;
cxImg->Load(lpszPathName,CXIMAGE_FORMAT_TIF);


 

       对于分层的tif图片,可以定义一个CxImage的数组(不是CxImage*类型的数组)来保存分层tif图片中每张图片,具体如下所示:

CxImage*    imgs;//此处为一个CxImage类型的数组
CxImage*     cxImg;
if(cxImg->Load(lpszPathName,CXIMAGE_FORMAT_TIF))
{
      int  frameNum=cxImg->GetNumFrames();//获得分层tif图片的帧数
       imgs=new CxImage[frameNum];//动态创建CxImage数组
       for(int i=0;i<frameNum;i++)
      {
          cxImg->SetFrame(i);//设置当前要读取的帧为第i帧
            cxImg->Load(lpszPathName,CXIMAGE_FORMAT_TIF);
          imgs[i].Copy(*cxImg);
      }
 }


二、保存tif图片

        保存tif格式图片也分为单张的和分层的tif图片两种。

        1、单张tif图片的保存

               直接使用cxImg->Save(lpszPathName,CXIMAGE_FORMAT_TIF);

         2、分层tif图片的保存

FILE*    hFile;
hFile=fopen(lpszPathName,"w+b");
CxImageTIF   tifImg;//需要增加头文件ximatif.h,该头文件在CxImage目录下
for(int i=0;i<frameNum;i++)
{
	//frameNum和imgs[i]的定义和读取分层tif图片中一样
	tifImg.Copy(imgs[i]);
	tifImg.Encode(hFile,TRUE);
}
fclose(hFile);


三、选择tif图片的压缩方式

        tif图片的可选压缩方式有很多种,比较常见的有JPEG,LZW,CCITT_T6等等,具体可以在相关的头文件里面查找。

        选择相应的压缩方式可以使用CxImage的SetCodecOption方法。

       例如:cxImg->SetCodecOption(COMPRESSION_LZW);

       需要注意的是,当选择JPEG压缩方式的时候,只能处理灰度或者是RGB图像

2019-06-21 22:40:56 LawenceRay 阅读数 2117
  • 异常处理及程序打包

    1、快速的进行python语言的入门,并在使用过程中得到提升 2、python常用库的深入理解 3、机器学习算法原理的讲解及python实现 4、机器学习、python处理轨迹数据的案例应用

    34人学习 王静
    免费试看

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(label_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格式图片进行随机裁剪和数据增广