05tue
乘以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窗口滑动;
构造函数是为了获取
对显示出来的图像进行分类,而不是对所有的七个波段进行分类
频率域滤波中的频率方位滤波
c#垃圾回收机制,指针没被销毁没被释放,内存被占用,要么访问冲突要么内存泄漏,
被占用的其情况下,给内存定义一个周期,定期释放,提高代码稳定性,缺点是
指针的灵活带来不稳定性
dispose()
flushcashe()这个不能删,
过关所需技能点:
能新建项目、能正确引用gdal库、能分析题目,拆分成常规处理步骤、将处理步骤转化为代码、调试
app.config 编译链接生成之后
配置文件,
dll 动态链接库
Java:jr包jdk /jre 开发包/运行环境 跨平台
API接口
跨平台,标准C
gdal 路径跟着exe走
类和对象
一个类包含成员属性和成员函数
hey man
你的图像增强、图像变换、图像分类都有问题,work out all bugs
研究主题到底是什么??是地表温度和植被覆盖度的关系研究,什么关系呢??也不是定量,
B yourself
B YOUESELF
YES THATS RIGHT DEFINITALLY RIGHT