2016-08-14 17:21:24 taoyanqi8932 阅读数 25993
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4434 人正在学习 去看看 贾志刚

Opencv图像处理基本操作

1基本数据类型

图像有若干个通道,灰度图像只有一个通道,而彩色具有红,绿,蓝组成,但是OpenCv以逆序的方式来存储三个分量,还可以使用第四个透明度(alpha),可以使用img.channels()获取图像通道个数。

使用若干个位存储一副图像的每个像素,这被称为图像的深度,灰度图像为8位,即0-255个灰度级,可以用img.depth()获得图像的深度,其返回值为:

CV_8U - 8-bit unsigned integers ( 0..255 )
CV_8S - 8-bit signed integers ( -128..127 )
CV_16U - 16-bit unsigned integers ( 0..65535 )
CV_16S - 16-bit signed integers ( -32768..32767 )
CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )

对于灰度图像和彩色图像,最常见的是CV_8U.

Mat img=imread("lena.png",IMREAD_GRAYSCALE);
Mat fp;
img.convertTo(fp,CV_32F);//改变图像的深度

2 像素级访问

1. 第一种方法:模板函数at<>

uchar pixel=img.at<uchar>(0,0);  //获得灰度图像0,0点像素
Vec3b pixel=img.at<Vec3B>(0,0);  //获得3波段图像的第一个波段(0,0)像素。

第一种方法,效率不高,必须定位到他所在的位置

2. 第二种方法:函数ptr

他返回图像特定行的指针。因此可以得到每一行的数据,时间复杂度降低,
如下代码获取一副彩色图像的每个像素值。

//时间复杂度大大降低!!!
uchar R,G,B;
for (int i=0;i<img.rows;i++)    //遍历行
    Vec3b pixRow=img.ptr<Vec3b>(i);
for (int j=0;j<img.cols;j++) {   //遍历**列**
    B=pixRow[j][0];
    G=pixRow[j][1];
    R=pixRow[j][2];
}

测量程序用时可用函数:

double to=(double)getTickCount();
elapsed=((double)getTickCount()-to)/getTickFrenquency()

图像位运算

可以用掩码对一个图像进行处理,位元算有:

void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())
其中src1是原始的图像,src2是掩码,dst为输出

一个例子:

#include<opencv2\opencv.hpp>
#include <iostream>  
using namespace cv;
using namespace std;
int main() {
    Mat img = imread("cute.jpg", 1);
    if (img.empty())
        cout << "cannot load image" << endl;
    imshow("Origin", img);
    Mat mask(img.rows, img.cols,CV_8UC3, Scalar(0, 0,0 ));
    circle(mask, Point(img.rows / 2, img.cols / 2-35), 220,Scalar(255,255,255),-1);  //画一个圆
    imshow("Mask", mask);   
    //执行位操作
    Mat r;
    bitwise_and(img, mask, r);
    imshow("Bit_and", r);
    waitKey(0);
    return 0;
}

如下所示的图像处理过程:
分别为原始图像,掩模,计算后的图像
这里写图片描述
这里写图片描述
这里写图片描述

1. Adding (blending) two images using OpenCV

将两张图像以线性组合的方式合并成一张图像,注意的是,两张图像的大小应该相同。
g(x) = (1 -a )*f0(x) + a*f1(x)g(x)为生成的矩阵,f0(x),f1(x)为要合并的两个矩阵。a为尺度。
用到的函数原型:
C++:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
        double alpha = 0.5; double beta; double input;
        Mat src1, src2, dst;
        /// Ask the user enter alpha
        std::cout << " Simple Linear Blender " << std::endl;
        std::cout << "-----------------------" << std::endl;
        std::cout << "* Enter alpha [0-1]: ";
        std::cin >> input;
        /// We use the alpha provided by the user if it is between 0 and 1
        if (input >= 0.0 && input <= 1.0)
            alpha = input;
        /// Read image ( same size, same type )
        src1 = imread("LinuxLogo.jpg");
        src2 = imread("WindowsLogo.jpg");
        if (!src1.data) { printf("Error loading src1 \n"); return -1; }
        if (!src2.data) { printf("Error loading src2 \n"); return -1; }
        /// Create Windows
        namedWindow("Linear Blend", 1);
        beta = (1.0 - alpha);
        addWeighted(src1, alpha, src2, beta, 0.0, dst);
        imshow("Linear Blend", dst);
        waitKey(0);
        return 0;
}

当a=0时,此时只有window的logo

这里写图片描述

a=0.5时如图所示:
这里写图片描述

2. Changing the contrast and brightness of an image

改变图像的对比度和亮度
基础的公式为:
g(i; j) = a*f(i,j) + b
where i and j indicates that the pixel is located in the i-th row and j-th column.
获得一个图片的像素我们用image.at<Vec3b>(y,x)[c] 这里的y为行,x为列,c代表R, G or B (0, 1 or 2)

int main(int argc, char** argv)
{
        double alpha; /**< Simple contrast control */
        int beta; /**< Simple brightness control */
        /// Read image given by user
        Mat image = imread("cute.jpg");
        Mat new_image = Mat::zeros(image.size(), image.type());  //copy the origin picture size,and type
        /// Initialize values
        std::cout << " Basic Linear Transforms " << std::endl;
        std::cout << "-------------------------" << std::endl;
        std::cout << "* Enter the alpha value [1.0-3.0]: "; std::cin >> alpha;
        std::cout << "* Enter the beta value [0-100]: "; std::cin >> beta;
        /// Do the operation new_image(i,j) = alpha*image(i,j) + beta
        for (int y = 0; y < image.rows; y++){
            for (int x = 0; x < image.cols; x++){
                for (int c = 0; c < 3; c++){
                    new_image.at<Vec3b>(y, x)[c] =
                        saturate_cast<uchar>(alpha*(image.at<Vec3b>(y, x)[c]) + beta);//saturate_cast to make sure the values are valid.
                }
            }
        }
        namedWindow("Original Image", 1);
        namedWindow("New Image", 1);
        imshow("Original Image", image);
        imshow("New Image", new_image);
        waitKey();
        return 0;
}

示例如下:可以看到改变的图片的对比度和亮度。
这里写图片描述

这里可以用函数image.convertTo(new_image, -1, alpha, beta);来代替for循环,它会更有效率。

Basic Drawing

1. 定义一个点 2D

Point pt;
pt.x = 10;
pt.y = 8;
Point pt = Point(10, 8);

2. 画椭圆ellipse原型
void ellipse(InputOutputArray img, Point center, Size axes,
double angle, double startAngle, double endAngle,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);

后面三个为默认的参数,可以不写。

//自己写的函数,指定img,和角度
void MyEllipse(Mat img, double angle)
{
    int thickness = 2;
    int lineType = 8;
    ellipse(img,
        Point(w / 2, w / 2),
        Size(w / 4, w / 16),
        angle,
        0,
        360,
        Scalar(255, 0, 0),  //为颜色
        thickness,
        lineType);
}
//**调用方法:**
MyLine(rook_image, Point(0, 15 * w / 16), Point(w, 15 * w / 16));

3. 画线段

函数原型
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
int thickness = 1, int lineType = LINE_8, int shift = 0);

Random generator and text with OpenCV

随机数产生类Random Number generator class (RNG)

RNG rng( 0xFFFFFFFF );//创建一个RNG类,并对其进行初始化
//在[a,b)中随机产生一个数
C++: int RNG::uniform(int a, int b)
C++: float RNG::uniform(float a, float b)
C++: double RNG::uniform(double a, double b)
//a – lower inclusive boundary of the returned random numbers.
//b – upper non-inclusive boundary of the returned random numbers.
RNG rng;

// always produces 0
double a = rng.uniform(0, 1);

// produces double from [0, 1)
double a1 = rng.uniform((double)0, (double)1);

// produces float from [0, 1)
double b = rng.uniform(0.f, 1.f);

// produces double from [0, 1)
double c = rng.uniform(0., 1.);

// may cause compiler error because of ambiguity:
//  RNG::uniform(0, (int)0.999999)? or RNG::uniform((double)0, 0.99999)?
double d = rng.uniform(0, 0.999999);

Random color

一副彩色图像由R,G,B组成,可用RNG产生随机的颜色。

static Scalar randomColor( RNG& rng )
{
int icolor = (unsigned) rng;
return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
}

Put out the text

获得一个字符串的宽度和高度:
C++: Size getTextSize(const string& text, int fontFace, double fontScale, int thickness, int* baseLine)
例如:
Size textsize = getTextSize("OpenCV forever!", CV_FONT_HERSHEY_COMPLEX, 3, 5, 0);
将其输出:
C++: void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )

2018-07-06 18:31:04 JonyHwang 阅读数 11541
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4434 人正在学习 去看看 贾志刚

作者:离散梦

欢迎大家给出宝贵的建议!

 

图像处理基本操作和添加噪音(Matlab)

 

图像处理基本操作:

读取图像:

>>imread(' filename ')    

显示图像:

>>imshow( f )

示例:

同时显示另一幅图:

>>figure,imshow( g )

保存图像:

>>imwrite( f, 'filename')

 

添加噪音:

采用函数imnoise来使用噪声污染一幅图像。该函数的基本语法为

g=imnoise( f , type , parameters )

其中,f是输入图像,type是噪声的类型,parameters是参数设置大小

 

g=imnoise( f , 'gaussian' , m , var )将均值为m、方差为var的高斯噪声加到图像f上。默认值为均值是0、方差是0.01的噪声。

示例:

g=imnoise( f , 'localvar' , V )将均值为0、局部方差为V的高斯噪声加到图像f上。其中V是与f大小相同的一个数组,它包含了每个点的理想方差值。【这个函数和下面这个函数我暂时没实现,需要找下问题,请大牛指点】

g=imnoise( f , 'localvar' , image_intensity , var )将均值为0的高斯噪声添加到图像f上,其中噪声的局部方差var是图像f的亮度值的函数。参量image_intensity和var是大小相同的向量,plot(image_intensity , var)绘制出噪声方差和图像亮度的函数关系。向量image_intensity必须包含范围在【0,1】内的归一化亮度值。

示例:

g=imnoise( f , 'salt & pepper' , d )用椒盐噪声污染图像f,其中d是噪声密度(即包含噪声值的图像区域的百分比)。因此,大约有d*numel(f)个像素收到了影响。默认噪声密度为0.05。

示例:

用方程g=f+n*f将乘性噪声添加到图像f上,其中n是均值为0、方差为var的均匀分布的随机噪声。var的默认值为0.04。

示例:

g=imnoise( f , 'poisson' )从数据中生成泊松噪声。

示例:

2019-11-30 14:25:50 Daisy_jf 阅读数 969
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4434 人正在学习 去看看 贾志刚

引入

    此次的内容是遥感图像镶嵌。
    在遥感图像处理中,我们有时为了获取更大范围的地面图像,通常需要将多幅遥感图像拼成一幅图像,这就需要使用图像镶嵌对遥感影像进行拼接操作。
    我们需要进行图像镶嵌的遥感卫星影像数据有两种情况,南北方向和东西方方向的,所以我们在选择数据时尽量选择成像条件相似(同一轨道、同一时间)的图像。
    通过使用PCI软件图像镶嵌模块手动对长沙地区影像(南北方向)进行拼接和使用ENVI软件图像镶嵌模块自动对遥感图像进行拼接操作,这里PCI手动选择控制进行图像镶嵌适用范围更广,所以一定需要掌握。
    另外我们指导两幅图像灰度上的细微差别都会导致明显的拼接缝,而在实际的成像过程中,被拼接的图像在拼接边界附近灰度的细微差别几乎时不可避免的,地面环境的微小变化、成像 角度的不同等因素都可能造成这种灰度上的差异。
    因此, 在图像镶嵌过程中,修正镶嵌图像在拼接缝附近的灰度,使之在拼接缝处的灰度有一个光滑的过渡,不产生突变效应,这里我们可以设置柔和宽度,进行颜色匹配等操作。


一、 实验目的

(1) 了解遥感图像镶嵌的目的。
(2) 掌握遥感图像镶嵌的原理与方法。
(3) 熟悉PCI软件和ENVI软件图像镶嵌的操作

二、 实验准备

(1) 实验软件:PCI、ENVI
(2) 实验数据:长沙环境小卫星两个传感器的数据
a) 数据特点:同一轨道,同一时间段,南北方向

三、 实验内容

(1) 熟悉图像镶嵌基本原理;
(2) 学习使用PCI图像镶嵌具体操作;
(3) 学习使用ENVI图像镶嵌具体操作;

四、 实验步骤

  1. 生成空间:生成空间有两种方式,一是生成空图像文件;二是在原始文件中,以其中的一幅影像作为标准将其边界扩大。这里我们选择使用第二种方式。
    (1)加载影像:使用【ImageWorks】模块,加载北边影像,如图所示:

在这里插入图片描述

(2)单击 在这里插入图片描述 工具,打开【File Utility】对话框,选择菜单栏中的【Tools】下的【reproject】,打开重新投影对话框,源文件选择“20091124A”,目标文件选择“20191124AB”。在投影边界栏下,首先选择“Use bounds and resolution”,根据图像的边界和大小修改Upper Left 和Lower Right,这里我们将Upper Left减小50公里,Lower 减小200公里,然后修改Pixel Size 为30,这里是对分辨率进行粗调,如下图所示:

在这里插入图片描述

然后我们选择“Use pixels/lines and resolution”,对分辨率进行精调,修改为30。最后选择select all按钮,再点击“add”按钮,将下侧左栏内容全部添加到右栏中,如下图所示:

在这里插入图片描述

最后点击“Reproject”,等待投影生成完成。
2. PCI图像镶嵌:使用GCPWorks模块进行图像镶嵌。
(1)加载镶嵌模块,全部保持默认设置,选择“Accept”,打开图像镶嵌对话框,如下图所示:
在这里插入图片描述
(2)加载图像:依次选择未校正图像和地理参考数据,这里在加载图像的时候要注意图像通道的选择,二者要保持一致,而且因为PCI一次性最多只能处理三个波段,所以这里我们都选择1、2、3通道,依次在对话框中点击1、2、3,然后选择“Load &Close”,如下图所示:

在这里插入图片描述

加载后的数据如下图所示:
在这里插入图片描述

(3)选择控制点:选择控制点的方法是使用鼠标在两张图像中分别选择相同位置的点作为控制点,控制点的选择要求至少4个,而且控制点不能在一条直线上,最后控制点的残差需小于一个像元。这里我们选择5个控制点,选择好的控制点和残差结果如下图所示:

在这里插入图片描述

(4)选择镶嵌区域:点击“Select Mosaic Area“,打开选择镶嵌区域对话框,添加Add按钮,在未校正的图像中点击。这里注意在选择的时候尽量走曲线路线,而且选择的区域最后要闭合,如下图所示:

在这里插入图片描述

(5)颜色匹配:选择“Color Matching”,打开颜色匹配对话框,在未校正和地理参考图像中选择分别选择边界区域,然后点解匹配。

在这里插入图片描述

(6)预览图像镶嵌结果:打开预览对话框,重采样方式选择Cubic,柔和宽度设置为10,然后点击Registration Overview按钮,过程及预览结果如下图所示:
在这里插入图片描述

(7)图像输出:选择“Perform Registration to Disk”按钮,在弹出的对话框中,依次按顺序点击待校正图像通道和输出图像通道进行一一匹配,然后修改内存为500M,最后点击“Perform Registration”按钮,如下图所示:

在这里插入图片描述

输出图像如下图所示:
在这里插入图片描述
3. ENVI图像镶嵌:ENVI图像镶嵌不需要手动进行选择控制点,其自动匹配,具体过程如下所示:
(1)加载图像:运行ENVI软件,选择【File】|【Open Image Files】,依次将两幅需要镶嵌的图像A、B加载进来,如下图所示:
在这里插入图片描述

(2)加载图像镶嵌模块:依次点击【Basic Tools】|【Mosaicing】|【Georeferenced】,在弹出的对话框中选择import,导入上一步中加载的图像,如下图所示:

在这里插入图片描述

从导入的结果中我们可以看到两幅遥感影像已经进行了自动镶嵌,但是这里存在压盖问题,镶嵌的并不自然,这时候我们分别在两幅图像中右击,选择“Edit Entry”工具,在弹出的对话框中,“Data Value to Ignore”设置为0,“Color Balanced”选择“No”,然后点击OK。

在这里插入图片描述
在这里插入图片描述

(3)输出预览:选择【File】|【Apply】,在弹出的对话框中重采样选择最近邻,结果选择输出到内存,然后预览输出效果,效果好在输出到硬盘,然后点击OK,如下图所示:

在这里插入图片描述

从上图中我们可以看到输出内存是分为两步进行的,预览效果如下图的右图所示:

在这里插入图片描述

从上图中我们可以看到镶嵌的结果较为满意。最后我们选择输出图像,格式为ENVI的标准格式.dat,如下图所示:

在这里插入图片描述

这里我们需注意一个问题,在ENVI中进行图像镶嵌的时候容易出现的一个问题是图像镶嵌边界线的问题,如果我们在前面Edit Entry步中选择Fixed选项,那么结果就会出现明显的镶嵌线,如下图所示:

在这里插入图片描述

如果存在图像镶嵌线,那么这幅遥感影像就是不可用的,我们需要想办法去除镶嵌线。

2019-11-30 14:16:27 Daisy_jf 阅读数 451
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4434 人正在学习 去看看 贾志刚

引入

此次内容是遥感影像的几何校正,我们知道在遥感成像的过程其,传感器生成的图像像元相对于地面目标物的实际位置会发生挤压、拉伸、扭曲和偏移等几何畸变问题,而这些几何畸变问题会给基于遥感图像的定量分析、变化检测,图像融合、地图测量或更新等处理带来误差,所以我们有必要对遥感图像进行几何校正,而在校正过程中的关键问题就是控制点的采集,控制点的采集常用的有三种方式,这三种方式中又常用的通过读取地形图的坐标信息对遥感影像进行校正,但是有时候控制点坐标的读取不是总是容易的,所以我们可以使用已经校正过的地形图对未校正的影像进行几何校正,这样可以不用人工输入控制点坐标。

一、 实验目的

(1) 掌握遥感图像处理几何校正的原理与方法。
(2) 了解遥感图像几何校正的目的和意义
(3) 熟练操作遥感图像处理的专业软件进行基础图像处理,包括图像几校正、镶嵌等的操作。
(4) 提高对遥感图像深一步的认识。

二、 实验准备

(1) 几何校正的几个概念:

a) 定义:指通过一系列的数学模型来改正和消除遥感影像成像时因摄影材料变形、物镜畸变、大气折光、地球曲率、地球自转、地形起伏等因素导致的原始图像上各地物的几何位置、形状、尺寸、方位等特征与在参照系统中的表达要求不一致时产生的变形。
b) 目的:消除或改正遥感影像几何误差
c) 原理:相对于地图投影坐标系统进行配准校正,即要找到遥感影像与地图投影坐标系统之间的数学函数关系,通过这种函数关系可计算出原遥感影像中每个像元在地图投影坐标系统上的位置从而得到校正后的图像。
d) 前提:采集控制点
e) 控制点的来源:
      i. 野外实测,如使用全站仪,然后将测的点导入系统。
      ii. 使用一个地区的地形区,从图中找到一些控制点,读出坐标。
      iii. 使用已经校正过的遥感影像校正我们未校正的遥感影像(在未能拿到地形图的情况下)

三、 实验步骤

  1. 加载几何校正模块:运行PCI软件,使用GCPWorks模块,弹出GCPWorks SetUp对话框,在Sources of GCPs 下选择User Entered Coordinates(用户输入投影坐标系统)。点解“Accept”,弹出几何校正模块,如下图所示:

在这里插入图片描述
2. 加载数据:点击“Select Uncorrected Image”按钮,弹出选择数据对话框,这里我们选择实验一处理过的含有多个波段的格式位pix的数据,加载后的数据包含一个原图像的大窗口和一个放大的窗口,如下图所示:
在这里插入图片描述
2. 定义地理参考:单击“Define Georeferencing Units”按钮,弹出定义地理参考对话框,选在other确定投影坐标系,在弹出的对话框中旋选择TM,横轴墨卡托投影,选择“Accept”,在弹出的投影定义对话框中,经度输入111°(因为我们校正的是地区是长沙,根据分带计算出其中央经线坐标为111°),然后在False选择Easting下输入500000,代表坐标系向西平移500公里,目的是保证坐标全是正数),具体如下图所示:
在这里插入图片描述
然后点击Earth Model 确定地球模型,这里选择E015,点击“Accept”,可以看到设置好的投影坐标参考,如下图所示;
在这里插入图片描述
3. 采集地面控制点:单击“Collect GCPs”按钮,弹出采集地面控制点对话框。这里的Georef是我们采集的控制点的坐标,Uncorr是未校正的图像的坐标,如下图所示:
在这里插入图片描述
控制点坐标获取:我们可以使用PS打开长沙市地质图,放大地质图进行观察,我们可以发现此地图是根据经纬度分带的6°带,公里格网是2公里,我们使用量测工具加地质图中的公里格网线上的坐标信息可以计算出任意点的坐标。然后在PCI中选择相同位置的控制点,在采集控制点对话框输入我们采集的控制点的坐标数据。
一般我们最少选择4个控制点,如下图所示,我们采集了四个控制点。
在这里插入图片描述
确定第四个控制点后,我们可以看到数据的残差,如下图所示,残差均较小,所以采集的控制点是比较好的(注:前三个点不显示误差,第四个点才开始显示)

在这里插入图片描述
一般我们认为残差大小小于1个像元为有效的控制点,大于1个像元的控制点需要重新采集,但是为了防止删除正确的控制点,我们可以保存已经采集的控制点数据,使用【File】|【Save GCPs】,弹出保存控制点对话框,输入名称,点击“Save”如下图所示。
在这里插入图片描述

我们可以使用【File】|【Load GCPs】加载我们保存的控制点,如下图所示
在这里插入图片描述
采集控制点完毕,点击Close关闭GCPs编辑窗口,第四项是遥感图像镶嵌,默认则对整个遥感影像进行校正,若是选择该项,我们可以选择一定的区域进行校正,打开对话框,选择“Add”,然后使用鼠标工具在遥感影像中框选出我们需要校正的区域,如下图所示:

在这里插入图片描述

  1. 执行几何校正:单击第五项按钮,在弹出的对话框中选择“New Output File”,输入校正后的图像名称,选择输出图像格式,默认为.pix,如下图所示:
    在这里插入图片描述

点击OK,在弹出的对话框中输入通道数为4。在Geo-Referencing Information选项卡下,选择“Use bounds and resolution”(使用边界和分辨率)。

在这里插入图片描述
我们知道原始遥感影像的分辨率为28.5,所以我们修改像元大小X,Y均为28.5,弹出确定对话框,点击“Change Resolution”,如下图所示;

在这里插入图片描述

我们可以看到行列数和分辨率发生改变,但是这里的分辨率并未达到我们要求的28.5,因为这只是粗略调整,下一步我们将进行精确调整,如下图所示:

在这里插入图片描述

这里共有三个选项,上面是选择使用边界和分辨率,另外两个分别是使用行列数和分辨率与使用边界与分辨率,下图为我们展示了使用行列数和分辨率的情况,这样我们客户以将分辨率精确的确定为28.5,只是地理范围稍微发生改变,如下图所示;

在这里插入图片描述

然后点击Create,在弹出的告诉我们生成多大的内存空间对话框中点击Yes,如下图所示;
在这里插入图片描述

回到图像校正窗口,建立原图像与校正后图像各通道的对应关系,设置重采样方式为Bilinear,
内存大小为500M,点击Perform Registration执行校正,如下图所示:

在这里插入图片描述

然后我们使用Image Works工具,调出几何校正后的图像,如下图所示:

在这里插入图片描述

然后我们查看几何校正后的遥感影像的信息,如下图所示:

在这里插入图片描述

  1. 使用已经校正好地形图校正未校正的遥感影像图。
    由于上面选择控制点时在计算控制点坐标时较为麻烦,因此我们可以选择先校正控制点坐标易找的地质图,然后使用校正好的地质图来校正未校正的遥感影像,下面是校正的大致过程。
    (1) 校正地质图:校正的方法和上面一样,下图是选择的四个控制点,以及将控制点进行保存的结果。

在这里插入图片描述

图20为我们展示了校正前后的地质图。
’’
在这里插入图片描述

(2) 使用校正好的地质图校正遥感影像图,方法和前面大致相同,不同的地方是第一步“Source of GCPs”选项下选择“Geocoded Image”而不是前面选择的“User Entered Coordinates”,其他和前面一致,如下图所示:

在这里插入图片描述

第三步选择GCPs,这里和前面不同,前面的是自己读取地质图中的相同位置点的坐标,这里因为第二步已经加载了地质图,所以控制点的选择是使用鼠标同时选择地质图和未校正的遥感影像图的相同位置,选择四个控制点,如下图所示:

在这里插入图片描述

图23和前面一样,选择裁剪区域。

在这里插入图片描述

另外,这里还多出一个选项,Colour Matching选项,点击打开如下图所示:

其他余下的步骤和前面一致,最后我们将得到校正后的结果。

没有更多推荐了,返回首页