05tue

wps36

乘以1.0使得int*int!=0

today:缩放 和计算机图形学关联

已知:currentdataset

ask for:两个方向的缩放比例、保存路径、重采样方法(necessary)以输出图像为基准去循环(反算)去取原像素的方法

把参数传到类里里面:通过类的构造函数(需要接受)/定义一个静态全局变量(用之前赋值、声明)

变换在buffer中进行、rasterband readraster

dataset in→dataset out(计算输出)→三层循环(波段循环别忘了)

provider里已有两个bmp和旋转

05thu

裁剪

“橡皮条技术”(截图一样),动态效果单纯裁剪只需改readraster和writeraster的参数,简单的

1.空间范围;

2.band

规则裁和不规则裁的区别,不规则图像的裁剪先找最小矩形,用shape裁,我们是用像素裁的,(实现用shape矢量数据裁?)

需求:从空间和波段裁剪所需数据

已知:currentdataset

未知:裁剪要求(矩形坐标(大小、位置判断弹出messagebox)、传一维数组确定裁剪波段、(鼠标交互获取、缩略图))、保存路径七个参数

设计界面→

四个构造函数、三个鼠标事件函数(橡皮条),

temp缩略图准备好、current框里的图,用于替换,mouse move 一动就触发,temp画布g上画一个红框,判断谁大谁小(反了),把带红框的temp贴到,重新恢复为不带红框的底图,or效果见imagery

在类里面添加函数

窗口依旧是个类,特殊的类

基于组件、控件的二次开发

构造函数

05tue

妈的不记得上节课干了啥,花一半时间赶进度是什么鬼???

差一个image,自己补上,

直方图统计,直观反映图像偏暗或偏亮,处理直方图改进可视化,(均衡化变换)这个图不是显示,联动着还能改图像,envi直方图拉伸,在一个画布上,以出现频率max那条线作为y轴位置,

直方图均衡化:统计像素个数→计算灰度值累计分布0-1(乘以255(拉伸))→(就是以255为量纲形成新的像素值)

真他妈神奇,因为灰度0-255本身,每种像素值所占比例其实就是,就是突出主要像素值,赋予新的像素值之后来显示,有对比,道理应该是这么回事,原理你爱理不理

06thu

        public static bool Balance

            (Bitmap srcBmp, out Bitmap dstBmp)

        {

            if (srcBmp == null)

            {

                dstBmp = null;

                return false;

            }

            int[] histogramArrayR = new int[256];//各个灰度级的像素数R

            int[] histogramArrayG = new int[256];//各个灰度级的像素数G

            int[] histogramArrayB = new int[256];//各个灰度级的像素数B

            int[] tempArrayR = new int[256];

            int[] tempArrayG = new int[256];

            int[] tempArrayB = new int[256];

            byte[] pixelMapR = new byte[256];

            byte[] pixelMapG = new byte[256];

            byte[] pixelMapB = new byte[256];

            dstBmp = new Bitmap(srcBmp);

            Rectangle rt = new Rectangle(0, 0, srcBmp.Width, srcBmp.Height);

            BitmapData bmpData = dstBmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            unsafe

            {

                //统计各个灰度级的像素个数

                for (int i = 0; i < bmpData.Height; i++)

                {

                    byte* ptr = (byte*)bmpData.Scan0 +

                        i * bmpData.Stride;

                    for (int j = 0; j < bmpData.Width; j++)

                    {

                        histogramArrayB[*(ptr + j * 3)]++;

                        histogramArrayG[*(ptr + j * 3 + 1)]++;

                        histogramArrayR[*(ptr + j * 3 + 2)]++;

                    }

                }

                //计算各个灰度级的累计分布函数

                for (int i = 0; i < 256; i++)

                {

                    if (i != 0)

                    {

                        tempArrayB[i] = tempArrayB[i - 1] +

                            histogramArrayB[i];

                        tempArrayG[i] = tempArrayG[i - 1] +

                            histogramArrayG[i];

                        tempArrayR[i] = tempArrayR[i - 1] +

                            histogramArrayR[i];

                    }

                    else

                    {

                        tempArrayB[0] = histogramArrayB[0];

                        tempArrayG[0] = histogramArrayG[0];

                        tempArrayR[0] = histogramArrayR[0];

                    }

                    //计算累计概率函数,并将值放缩至0~255范围内

                    pixelMapB[i] = (byte)(255.0 * tempArrayB[i]

                        / (bmpData.Width * bmpData.Height) + 0.5);//加0.5为了四舍五入取整

                    pixelMapG[i] = (byte)(255.0 * tempArrayG[i]

                        / (bmpData.Width * bmpData.Height) + 0.5);

                    pixelMapR[i] = (byte)(255.0 * tempArrayR[i]

                        / (bmpData.Width * bmpData.Height) + 0.5);

                }

                //映射转换

                for (int i = 0; i < bmpData.Height; i++)

                {

                    byte* ptr = (byte*)bmpData.Scan0 +

                        i * bmpData.Stride;

                    for (int j = 0; j < bmpData.Width; j++)

                    {

                        *(ptr + j * 3) = pixelMapB[*(ptr + j * 3)];

                        *(ptr + j * 3 + 1) = pixelMapG[*(ptr + j * 3 + 1)];

                        *(ptr + j * 3 + 2) = pixelMapR[*(ptr + j * 3 + 2)];

                    }

                }

            }

            dstBmp.UnlockBits(bmpData);

            return true;

        }

it seems that 没到靠一己之力写出我完整代码的程度,差多少,差很多,oh my god,,,,,

07tue

unsafe

c#抛弃指针的,

直方图均衡化的过程:

原理:基于灰度的累积分布的函数,再概率分布拉伸到0-255,

已知加载了一幅图像,数据结构冒泡排序法,二分查找法

通过构造函数传入

屏幕坐标和数学坐标反过来的,横轴开始画。

矢量图层里有feature,coordinate(x,y)把屏幕当成画布,根据屏幕像素坐标

画直线不仅仅是一条条画,而且是在Y轴上一点一点画上去或者是替换,for循环,比大小max替代

07thu图像滤波平滑&锐化(也算图像增强)

去雾霾的算法(》》)

去噪(图像滤波)高斯(every pixel,出现位置特定,噪声值随机 极值)和椒盐(黑白芝麻出现位置随机,值差不多)分乘型噪声和加性噪声,注意:滤波的算法是通用模板,

均值滤波原理:给待处理的像素定一个模板,有画面边框保留效果

距离:欧式距离,棋盘距离

噪声出现是在图像传输或是咋样咋样的时候产生的,

KNN少数服多数,边界处理k均值先球差,再排序插值,再取平均(插值只用于比较)

插值带下标

根据下标取周边像素边框宽度为啥三乘三是1,5乘五是2

唐渝鹏type def ,把下标和值存到一起

08tue

图像变换

傅里叶变换&PCA变换

空间域(灰度值)→频率域

傅里叶:任何连续周期信号可以由一组适当的正弦曲线(不同幅值、频率、相位)组合而成。一段完整的??nonono不可能,数学家很恐怖,拉普拉斯,拉格朗日。。。。。。。。。。。。。。。。正弦曲线无法组成带有棱角的曲线,时间域、空间域、频率域

以时间为参考,以另一种参考来观察,世界永恒不变,music,声音由震动产生随时间变动,乐谱不动,得出结论:在时间域是动态的,在频率域上是静止的,

贯穿整个空间域和

专业老师是网上大牛段子的搬运工

先在纸上画一个sin(x),不一定标准,意思差不多就行。不是很难吧。

好,接下去画一个sin(3x)+sin(5x)的图形。

别说标准不标准了,曲线什么时候上升什么时候下降你都不一定画的对吧?

好,画不出来不要紧,我把sin(3x)+sin(5x)的曲线给你,但是前提是你不知道这个曲线的方程式,现在需要你把sin(5x)给我从图里拿出去,看看剩下的是什么。这基本是不可能做到的。

但是在频域呢?则简单的很,无非就是几条竖线而已。

所以很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。

再说一个更重要,但是稍微复杂一点的用途——求解微分方程。(这段有点难度,看不懂的可以直接跳过这段)微分方程的重要性不用我过多介绍了。各行各业都用的到。但是求解微分方程却是一件相当麻烦的事情。因为除了要计算加减乘除,还要计算微分积分。而傅里叶变换则可以让微分和积分在频域中变为乘法和除法,大学数学瞬间变小学算术有没有。

傅里叶分析当然还有其他更重要的用途,我们随着讲随着提。

08thu

laoshishuodishizhoule

datasetin 获取波段先

把波段读到一个byte[]里,

用这个byte[]参数进行二维傅里叶变换

再生成相位、幅度、

生成bmp贴进去

        /// <summary>

        /// 根据图像的波段,获取二维傅里叶变换后的幅度图像

        /// </summary>

        /// <param name="ds">输入图像</param>

        /// <param name="bandIndex">波段序号</param>

        /// <returns>该波段在频率域的幅度图像</returns>

        private Bitmap getAmplitudeBitmap(Dataset ds, int bandIndex)

        {

            //声明图像数据缓冲区,大小为图像 width * height

            //调用GetRasterBand获取第bandIndex波段

            //读取波段数据到缓冲区

            //声明FT_Complex类型的虚数数组,大小为图像 width * height

            //调用二维快速傅里叶变换,需要进行坐标位移。传入图像缓冲区,返回傅里叶变换后的虚数数组

            //声明临时数组

            //对虚数数组进行变量变换,并取幅度系数,赋值给临时数组

            //对临时数组进行灰度级拉伸

            //找到最大值和最小值

            //得到比例系数,将临时数组拉伸到0-255

            //创建Bitmap,大小为图像 width * height,将拉伸后的值填入Pixel

            //返回创建Bitmap

        }

11tue

主成分滤波(PCA)

掩码图像如何获得??????????????

11thu

遥感图像分类

监督分类/非监督分类/分类后处理/

监督分类步骤:

1.训练样本的选择;

2.选择合适的分类算法;

计算像元与类中心的距离,

3.分类评判;(碎斑合并,膨胀腐蚀)

界面设计:有图,缺样本(交互)、阈值

监督分类算法:最小距离判别/概率判别函数/平行六边体判别法(先比先得)/最大似然法/

优缺点:可以自行决定分类的类别、控制样本的选择、但具有主观性,与分类精度挂钩,

在picturebox下贴一个panel,设置属性autoscroll,picturebox属性设为autosize,这样能实现图片窗口大小随实际图片大小变化,并且能自动出现滚条,在panel窗口滑动;

wps37

构造函数是为了获取

对显示出来的图像进行分类,而不是对所有的七个波段进行分类

频率域滤波中的频率方位滤波

c#垃圾回收机制,指针没被销毁没被释放,内存被占用,要么访问冲突要么内存泄漏,

被占用的其情况下,给内存定义一个周期,定期释放,提高代码稳定性,缺点是

指针的灵活带来不稳定性

dispose()

flushcashe()这个不能删,

过关所需技能点:

能新建项目、能正确引用gdal库、能分析题目,拆分成常规处理步骤、将处理步骤转化为代码、调试

app.config 编译链接生成之后

配置文件,

dll 动态链接库

Java:jr包jdk /jre 开发包/运行环境 跨平台

API接口

跨平台,标准C

gdal 路径跟着exe走

wps38

类和对象

一个类包含成员属性和成员函数

hey man

你的图像增强、图像变换、图像分类都有问题,work out all bugs

研究主题到底是什么??是地表温度和植被覆盖度的关系研究,什么关系呢??也不是定量,

B yourself

B YOUESELF

YES THATS RIGHT DEFINITALLY RIGHT