> 文档中心 > python使用opencv将tif裁剪为任意形状

python使用opencv将tif裁剪为任意形状

python使用opencv将tif裁剪为任意形状

  • 前言
  • 一、opencv是什么?
  • 二、使用步骤
    • 1.安装依赖
    • 2.裁剪
  • 总结

前言

博主最近在研究如何将tif裁剪成需要的任意形状,博主考虑过gdal,PIL库,但是根据查找到的资料,里面的切割函数切割出来的图只能是矩形,最后博主使用opencv来实现这个功能

一、opencv是什么?

OpenCV是一个基于Apache2.0许可发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

二、使用步骤

1.安装依赖

pip install opencv-pythonpip install numpy

2.裁剪

博主提供的代码是根据像素坐标裁剪tif,如果有朋友有需要根据地理经纬度来裁剪tif,可以去了解一下gdal库,代码的points里面存储的就是要裁剪的tif多边形组成的各点像素坐标,最后可以生成tif或者jpg,png,但目前该代码存在的问题在于裁剪出来的tif图片会损失地理坐标信息,如果有大佬有更好的想法,欢迎在文章下面评论

代码如下 :

import cv2import numpy as np#读取tifimg = cv2.imread('1.tif')# 转换为hsvhsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 新建掩膜(多个点围起来的多边形)points = np.array([[(0, 1), (100, 200), (512, 512), (5, 100),(25, 100)]])mask = np.zeros(img.shape, dtype=np.uint8)# 填充掩膜为白色cv2.fillPoly(mask, points, (255, 255, 255,0))# 和原始图片进行and操作,获得掩膜区域res = cv2.bitwise_and(img, mask)b, g, r = cv2.split(res)# 新建alpha通道,mask是3通道,shape是(3, 512, 512),alpha需要的是(512,512)并且只取一个通道alpha = np.rollaxis(mask, 2, 0)[0]# 合并merge = cv2.merge((b, g, r, alpha))#根据需求选择生成图像类型,tif,jpg,pngcv2.imwrite('2.tif', merge)

总结

上述内容如果存在问题,欢迎大家批评指正!!!