如何用ENVI和ARCGIS切割出图像的制定区域
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用ENVI和ARCGIS切割出图像的制定区域相关的知识,希望对你有一定的参考价值。
参考技术A 可以根据1、范围来采集clip(arctoolbox里面)。矩形范围
2、好像也可以通过多边形裁剪,如果没有,程序肯定可以的
3、通过mosaic也可以
1、对矢量数据进行裁减:
Arctoolbox中,spatial
tool
extractclip
在InputFeatures中选择被裁剪的图层,在ClipFeatures中选择裁剪形状
2、利用矩形对栅格数据裁剪:Arctoolbox中,data
managementrasterclip
InputRaster中选择被裁剪的栅格数据,设定好矩形四个顶点即可
3、在Spatial
Analyst
Tools中提供了多种对栅格数据的提取方法,Arctoolbox中,SpatialAnalystToolsextraction包括提取值到点,根据属性提取,用圆提取,用多边形提取,用掩模提取,用点提取,用矩形提取等,其中的用掩模提取功能可以让我们通过不规则边界来获取需要的栅格数据。
arcgis图层裁剪
首先在ArcCatlog
里创建一个shapefile得面,加载到arcmap里,同时也要
把你剪切的shapefile文件和长方形区域的shapefile文件也加载上,切忌这两个文件不能处于编辑状态,点击arctoolbox-analysis
tools-extract-clip,在打开的窗口的第一个框里输入要剪切的文件,第二个框里输入长方形区域文件,点ok就好了。
利用OpenCV的函数calcHist()计算出图像的直方图数据后绘制图像的直方图
利用OpenCV的函数calcHist()计算出图像的直方图数据后绘制图像的直方图
在上一篇博文 https://www.hhai.cc/thread-200-1-1.html 中已经对OpenCV的直方图计算函数calcHist()进行了详细介绍。
这篇博文介绍如何用直方图数据绘制直方图。
OpenCV是没有统计图绘制的相关函数的,所以要么用第三方库,要么想另外的办法。
先说Python-OpenCV中如何用直方图数据绘制直方图,由于Python安装和导入扩展库是非常方便简单的,所以我们用扩展库Matplotlib来绘制图像的直方图。
关于扩展库Matplotlib的安装大家可以参见下面这篇博文:
https://www.hhai.cc/thread-64-1-1.html
关于扩展库Matplotlib的使用示例可以参考下面这篇博文:
https://www.hhai.cc/thread-210-1-1.html
示例代码如下:
# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术
# OpenCV的版本为4.4.0
import cv2 as cv
import matplotlib.pyplot as plt
import sys
if __name__ == '__main__':
# 读取图像并判断是否读取成功
img = cv.imread('E:/material/images/2022/2022-12/view1.jpg', 0)
if img is None:
print('Failed to read img.')
sys.exit()
cv.imshow('img', img)
hist1 = cv.calcHist([img], [0], None, [256], [0, 256])
plt.plot(hist1)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果如下:
从上面的直方图中,我们可以清晰的看出,图像的灰度数据值主要集中在40-70的范围内,所以整幅图像是偏暗的。
虽然C++中也有专门绘制统计图的库,但显然没有Python导入扩展库那么简单,并且在使用上数据的引用传递也是个麻烦事,所以在C++中,我们就用OpenCV自带的线段绘制函数line()进行图像直方图的绘制了。示例代码如下:
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术
//OpenCV版本 OpenCV3.0
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
// 图像获取及判断
cv::Mat Image, ImageGray;
Image = cv::imread("E:/material/images/2022/2022-12/view1.jpg");
if(Image.empty())
return -1;
cv::imshow("Image",Image);
// 转换为灰度图像
cv::cvtColor(Image,ImageGray,CV_BGR2GRAY);
// 定义直方图参数
const int channels[1]=0;
const int histSize[1]=256;
float pranges[2]=0,256;
const float* ranges[1]=pranges;
cv::MatND hist;
// 计算直方图
cv::calcHist(&ImageGray,1,channels,cv::Mat(),hist,1,
histSize,ranges);
// 初始化画布参数
int hist_w = 500;
int hist_h = 500;
int nHistSize = 255;
// 区间
int bin_w = cvRound( (double) hist_w / nHistSize );
cv::Mat histImage( hist_w, hist_h,
CV_8UC3, cv::Scalar( 0,0,0) );
// 将直方图归一化到范围 [ 0, histImage.rows ]
normalize(hist, hist, 0, histImage.rows,
cv::NORM_MINMAX, -1, cv::Mat() );
// 在直方图画布上画出直方图
for( int i = 1; i < nHistSize; i++ )
line( histImage, cv::Point(bin_w*(i-1),
hist_h-cvRound(hist.at<float>(i-1)) ) ,
cv::Point( bin_w*(i),
hist_h - cvRound(hist.at<float>(i)) ),
cv::Scalar( 0, 0, 255), 2, 8, 0 );
// 显示直方图
cv::imshow("histImage", histImage);
cv::waitKey();
return 0;
运行结果如下图所示:
把Python代码的运行结果和C++代码的运行结果放在一起对比如下:
从上图可以看出,二者其实是相同的,只是因为Python的Matplotlib库是专业的统计绘图库,所以显然要专业的多。
以上是关于如何用ENVI和ARCGIS切割出图像的制定区域的主要内容,如果未能解决你的问题,请参考以下文章
利用OpenCV的函数calcHist()计算出图像的直方图数据后绘制图像的直方图