专业程序设计part2
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
专业程序设计part2的更多相关文章
- 专业程序设计part1
7 专业程序设计 (有多少人在大学里学到了自己真正喜欢的专业??并在此专业上获得了升华??)i== 软件图标下载网址:easyicon 01thu 4邻域 8邻域 D邻域 是啥 像素间的连通性,是转为 ...
- 学习 Civil 3D二次开发从哪儿开始?
1.1 从哪儿开始 对于多数的工程设计人员,不完全具备上节所述的各种条件.对于Civil 3D的应用可能比较熟悉:但对于计算机语言,只限于上学时所学的一点基础知识,步入工作岗位后与计算机语言基本无缘: ...
- java和C和C++关系
java和C以及C++ 直接关联,java继承了C的语法,java的对象模型是从C++改编而来的.java和C以及C++关系之所以重要,下面几个就是原因: ①如果一个程序员熟悉C以及C++语法,那么他 ...
- 应用gis笔记
接口,开发包??我要做一个移动端的,完了之后和5G挂一下钩, web/桌面/移动 C#就是.NET.... 和专业程序设计课程的区别 a kind of boring hope it helpful, ...
- 2016-2017-2 《Java程序设计》预备作业2总结
2016-2017-2 <Java程序设计>预备作业2总结 古希腊学者普罗塔戈说过:「头脑不是一个要被填满的容器,而是一束需要被点燃的火把.」 在对计算机系的学生情况的调查中,我说: 最近 ...
- 2016-2017-2 《Java程序设计》预备作业1 总结
2016-2017-2 <Java程序设计>预备作业1 总结 预备作业01:你期望的师生关系是什么见https://edu.cnblogs.com/campus/besti/2016-20 ...
- 积极主动敲代码,使用Junit学习Java程序设计
积极主动敲代码,使用JUnit学习Java 早起看到周筠老师在知乎的回答软件专业成绩很好但是实际能力很差怎么办?,很有感触. 从读大学算起,我敲过不下100本程序设计图书的代码,我的学习经验带来我的程 ...
- 第一章-第五题(你所在的学校有计算机科学专业和软件工程专业么?相关专业的教学计划和毕业出路有什么不同?阅读有关软件工程和计算机科学的区别的文章,谈谈你的看法。)--By 侯伟婷
我所在的本科学校和研究生学校都有计算机科学专业和软件工程专业.具体的教学计划无从得到,所以此情况无从对比,但是我从本科教务处网站找到了计算机科学专业和软件工程专业有关专业方面的课程,现列表如下. 表格 ...
- C语言程序设计入门学习五步曲(转发)
笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...
随机推荐
- C++ 99表
#include<iostream> using namespace std; class Sumes { public: int sum; int i, j; }; int main() ...
- Hadoop组件详解(随缘摸虾)
1.1. Hadoop组成: Hadoop = hdfs(存储) + mapreduce(计算) + yarn(资源协调) + common(工具包) + ozone(对象存储) + submarin ...
- NumPy 数组切片
章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切 ...
- spring源码 ListableBeanFactory接口
ListableBeanFactory接口表示这些Bean是可列表的 /* * Copyright 2002-2016 the original author or authors. * * Lice ...
- spring监听器+定时任务
背景:在原SSM项目中,拟定在每晚的23:59:59执行一个批处理任务. 设计思路:用jdk自带的定时器触发任务执行,设置下次执行间隔为24小时.定时任务由spring的监听器去启动. jdk版本:1 ...
- laravel自动加载公共文件
1. 创建 functions.php 在 app/Common/(目录自己起名字)下新建一个文件 functions.php,在内部补充如下代码: <?php /** 数据返回 * 返回jso ...
- Vue 获取时间戳返回自定义时间格式
直接在Vue全局函数定义: Vue.prototype.padLeftZero = function(str) { return ('00' + str).substr(str.length); }; ...
- 20 ~ express ~ 前台内容分页展示
一,后台路由文件 /router/main.js var express = require('express') var router = express.Router() var Category ...
- 在Mac上使用docker+sql server+Navicat
1. 版本: 2. 安装Kubernetes(并不知道安装这个有什么用) git clone https://github.com/maguowei/k8s-docker-desktop-for-m ...
- 碎碎念(DP)
链接:https://ac.nowcoder.com/acm/contest/3006/F来源:牛客网 题目描述 在ACM比赛里,除了CE以外都是有效的提交.每一个提交都会有其评测的结果,或是AC,或 ...