2020-01-03 16:37:36 OOFFrankDura 阅读数 55
  • ArcGIS之数字高程模型(DEM)分析下篇视频课程(GIS...

    课程采用ArcGIS10.3.1进行录制,适用于10.0、10.1、10.2、10.4系列。使得学习者对于坡面地形因子的提取、地形特征点的提取、水文分析、可视性分析都有个深度的掌握。特别是在运用空间分析工具:栅格计算器的不同种运用、邻域分析、区域分析、水文分析、可见性分析、条件分析等等工具与实际项目的运用更加得心应手

    3590 人正在学习 去看看 黄晓军

综述

2019六个大题
满足复习提纲覆盖:

  • 图像表示及存储格式(交叉、顺序存贮)
  • 基本的图像处理 ( 对比度增强 、 插值 、 邻域 )
  • 直方图(图像均匀化,归一化)
  • 图像滤波、图像梯度(Sobel,Laplacian)
  • 频域图像处理、傅里叶变换等
  • 形态学图像处理(膨胀和腐蚀,开闭操作等)
  • 卷积神经网络

关于知识点的索引,可以参考:
DIP数字图像处理-知识提纲

2019 CS 期末

第一题

交叉存储的图像8位3通道,其中每行字节为step。

  • 若原点(0,0)存储位置是p,问(x,y)处的存储位置是?
  • 若当前点(x,y)存储位置为p,问他的八邻域的存储位置?

第二题

给你一幅像素图像:

  • 请你画出他的直方图
  • 对其进行均衡化,并给出最后结果(均衡后的图像)

第三题

  • 请你写出Sobel算子
  • 请你推到拉普拉斯算子的计算过程,以及其离散化表示形式。
  • Sobel和拉普拉斯算子的相同、不同之处

第四题

  • 写出一维连续傅里叶变换公式,并给出每个部分的物理意义
  • 写出一维离散傅里叶变换公式,并给出每个部分的物理意义
  • 频率域滤波相比较空间域滤波,他的计算效率、适用条件?

第五题

  • 描述什么是开操作闭操作?
  • 给你一个图,让你给出开操作和闭操作的结果(建议带铅笔;此外,你会画很久,请留够时间)。

第六题

  • 请写出Batch normalization的过程
  • Batch normalization解决了什么问题,有什么优势?
  • 请写出SGD的过程
  • 请写出Adam的过程,他比SGD有什么优势?

2019 SE:数媒 期末

https://blog.csdn.net/weixin_42039835/article/details/103522759

2019-12-26 21:36:58 OOFFrankDura 阅读数 186
  • ArcGIS之数字高程模型(DEM)分析下篇视频课程(GIS...

    课程采用ArcGIS10.3.1进行录制,适用于10.0、10.1、10.2、10.4系列。使得学习者对于坡面地形因子的提取、地形特征点的提取、水文分析、可视性分析都有个深度的掌握。特别是在运用空间分析工具:栅格计算器的不同种运用、邻域分析、区域分析、水文分析、可见性分析、条件分析等等工具与实际项目的运用更加得心应手

    3590 人正在学习 去看看 黄晓军

修正补充说明: PPT上的傅里叶变换部分为主要修完善部分(我们补充了正确的答案)。因为原来的PPT有较多的数字错误和解题错误。 together with Liangxu Zhang

文章目录

综述

这是数字图像处理的课程知识点梳理。侵删。

课程讯息:
山东大学计算机学院2019年数字图像处理sd01331160。
联络:
sdudzy@163.com
All comments and supplements are well welcomed!

知识体系

  • 图像表示及存储格式(交叉、顺序存贮)
  • 基本的图像处理 ( 对比度增强 、 插值 、 邻域 )
  • 直方图(图像均匀化,归一化)
  • 图像滤波、图像梯度(Sobel,Laplacian)
  • 频域图像处理、傅里叶变换等
  • 形态学图像处理(膨胀和腐蚀,开闭操作等)
  • 卷积神经网络

2019试题:CS and SE

2019 CS and SE 期末

All questions

PPT1
  • 解释图像获取过程中的采样与量化
  • JPG, PNG, GIF, BMP这几种图像格式中,哪些是无损压缩?哪些可以存贮动画?哪些可以存贮透明图?
  • 对一个32位浮点型3通道图像(CV_32FC3),行宽为step, 如果一个像素地址为p,写出其上、下、左、右像素的地址。
PPT2
  • 简述图像几何变换两种方式:正向投射和逆向查找的过程,并说明两种方式分别需要解决的关键问题。

  • 三次插值和双线性插值相比,抗锯齿和马赛克的效果更好,请说明为什么。

  • 已知两幅图像中的N个点对(pi,pj)(p_i, p_j),i=1,…,N, N>3, 请简述求两幅图像之间符合这N个点对约束的仿射变换A的方法。

PPT3
PPT4
  • 设计5*5的Sobel梯度算子

  • 根据Laplacian函数的定义,推导如下标准的Laplacian算子
    在这里插入图片描述

  • 图像的线性滤波是否是对图像的线性变换?可否表示成对图像的矩阵变换的形式?

PPT5

图像表示及存储格式

基本知识

什么是图像:
在这里插入图片描述

  • Digital Image
    x,y,f(x,y)x, y, f(x, y) take only discrete values
    Formed with finite elements

  • Sampler and Quantizer

所谓采样,就是把一幅连续图像在空间上分割成M×N个网格,每个网格用一亮度值来表示。一个网格称为一个像素。M×N的取值满足采样定理。

量化就是把采样点上对应的亮度连续变化区间转换为单个特定数码的过程。量化后,图像就被表示成一个数字矩阵。每个像素具有两个属性:位置和灰度。
在这里插入图片描述

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

图像表示

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

  • 具体例子:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

图像的存储

在这里插入图片描述

在这里插入图片描述

什么是通道channel
一个三通道的400300的图,本质是一个4003003的一个矩阵 P[400,300,3]P[ 400, 300, 3] 。说明这个图像有400列,300行,以及在色彩上有三个分量。每个分量单独拿出来都是一个400300(*1)的矩阵如你所见,它们并不是彩色的,而是一幅灰度图像对于一副8bit的图像来说,矩阵元素的取值范围是从0-255(0 - 2^8-1)矩阵中的元素对应我们所说的像素(pixel),其值即该像素的灰度值,数值越大,像素的颜色越‘白/浅’;数值越小,像素的颜色越’黑/深‘对于图像每个分量来说,它只是灰度,谈论色彩没有意义,它是“黑白”的!(用黑白来描述灰度图像并不准确,用深浅可能更准确一些,但也不严谨。所以我加上了引号。你要愿意把通道设成红色绿色紫色黄色都行)**在图像显示时,我们把图像的R分量放进红色通道里,B分量放进蓝色通道里,G分量放进绿色通道里。**经过一系列处理,显示在屏幕上的就是我们所看到的彩色图像了。

定义图像 [code]

在这里插入图片描述
step就是每行所占用的字节 = 8bit数。

获取像素 [code]

在这里插入图片描述
如果是 n位带符号,m通道数据就是

return (int*)( (char*)img.data+y*img.step+x*m*(n/8) );

ROI为:representing sub-region (ROI)。

遍历像素 [code]

在这里插入图片描述

遍历ROI的pixel [code]

在这里插入图片描述
注意这里需要用到两个function:scanpixel \ getpixel。

基本的图像处理

How to describe a pixel?

  • Spatial coordinate (x, y)
  • Pixel color(RGB, YUV, …)
  • (x, y, R, G, B)

对于(x,y)而言我们是:Geometric processing。
对于pixel color(RGB, YUV, …)我们是:Algebraic processing。

Gray level transformation(灰度变换)

在这里插入图片描述
Processing pixel-by-pixel, and do transform to the gray level of each pixel:

  • Intensity Adjustment (亮度调整)
  • Contrast Adjustment (对比度调整)
Gray_transform灰度变换 [code]

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

Intensity Adjustment

可以理解为对pixel的处理整体变亮或者变暗。
在这里插入图片描述
在这里插入图片描述
左边变亮;右边变暗
变换函数:
在这里插入图片描述
Power-law中 gama 的影响:
在这里插入图片描述

Contrast Adjustment

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

Highlighting specific Gray-Level

有两种方式可以完成:
在这里插入图片描述在这里插入图片描述
效果:
在这里插入图片描述

Bit-plane Slicing

在这里插入图片描述
解释一下:
通常Pixel都是8bit组成的,有256种变化。对每位bit他们的信息重要性是不一样的。高位的信息更重要。

代数运算

前提条件:

输入为多幅大小相同的图像
输出图像与输入图像大小相同
基于对应像素进行计算

  • 基本操作:and or xor 等
    注意这里都是基于0-1的二值图像。
    在这里插入图片描述
  • Alpha blending
    在这里插入图片描述
    在这里插入图片描述
    每个像素中有红R、绿G、蓝B三组数值。若环境中允许像素能拥有一组α值,我们就称它拥有一个α通道。α值的内容,是记载像素的透明度。这样一来使得每一个物件都可以拥有不同的透明程度。

例如一个 alpha = 0.2 的颜色,就可以将其想像为透光率为 80% 的彩色玻璃。我们透过这块玻璃看去,由于 80% 的光都透过了,因此留下来的颜色只剩 20%,即所谓 0.2 的 alpha。

所谓 Alpha-Blending,其实就是按照“Alpha”混合向量的值来混合源像素和目标像素。
设B图象的透明度为alpha(取值为0-1,1为完全透明,0为完全不透明).
Alpha混合公式如下:
R(C)=(1alpha)R(B)+alphaR(A)G(C)=(1alpha)G(B)+alphaG(A)B(C)=(1alpha)B(B)+alphaB(A) R(C)=(1-alpha)*R(B) + alpha*R(A) \\ G(C)=(1-alpha)*G(B) + alpha*G(A)\\ B(C)=(1-alpha)*B(B) + alpha*B(A)\\

R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。一般来说A为前景,B为背景

  • Image Matting
    在这里插入图片描述
    左边是合成图像位置 i 的 RGB 值,右边是前景和背景RGB的线性组合。alpha 是未知的。对于每个像素,有3个已知量(C的RGB),7个未知量(A、B的RGB以及alpha),所以这个一个 underconstrained 问题,即变量个数大于方程个数。

  • 背景相减

在这里插入图片描述
在这里插入图片描述
根据阈值不同:
在这里插入图片描述

基本几何处理

水平&垂直翻转 (flip)
缩放 ( resize / zoom in /zoom out /scale)
旋转 (rotation)
……
仿射变换 (Affine Transform)
透视变换 (Perspective Transform)
……
图像变形 (Image Warping)

水平&垂直翻转 (flip)

在这里插入图片描述

Vertical flip [code]

在这里插入图片描述

Horizontal flip [code]

在这里插入图片描述

Resizing(插值)

基于邻近像素的值,计算非整数位置上的颜色值
1.最近邻 (Nearest Neighbor)
2.双线性插值 (Bilinear Interpolation)
3.双三次插值 (Bicubic Interpolation)

最近邻 (Nearest Neighbor)

在这里插入图片描述

双线性插值 (Bilinear Interpolation) [code]

在这里插入图片描述
首先白色点、然后蓝色点。

一次双线性插值最少需多少次乘法运算?
看似6次
实际3次

float bilinear(float a, float b, float c, float d, float dx, float dy)
{
       float  h1=a+dx*(b-a);           // = (1-dx)*a + dx*b
       float  h2=c+dx*(d-c);
       return h1+dy*(h2-h1);
}
双三次插值 (Bicubic Interpolation)

在这里插入图片描述
双三次插值:有问题的。
如何识别abcd。

错误的做法:
在这里插入图片描述
正确的做法:
在这里插入图片描述
如何计算导数:
在这里插入图片描述
我们如果只看一次cubic插值。其实三次cubic插值是hermite插值的一种情况:
在这里插入图片描述

Rotation

在这里插入图片描述
在平面坐标上,任意点P(x1,y1),绕一个坐标点Q(x2,y2)旋转θ角度后,新的坐标设为(x, y)的计算公式:
x= (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) + x2 ;

y= (x1 **- x2**)\*sin(θ) + (y1 **- y2**)\*cos(θ) **+ y2**;

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

  • 对比
    刚性变换(Rigid Transformation)
    只包含平移和旋转
    保持物体的形状(保角)和尺寸
    相当于正交变换
    相似变换(Similar Transformation)
    只包含平移、旋转和等比缩放
    保持物体的形状
估计图像之间的仿射变换

在这里插入图片描述
how to solve the transformation?
至少三个不同线的平面点或者更多。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意这里是 θ=(1r)2 \theta=(1-r)^2
在这里插入图片描述

直方图与图像统计

在这里插入图片描述
数学化定义:简而言之:一幅图像其实是一个二维的matrix,那么这个matrix每个位置[i,j]必定对应一个[0,255]的灰度值(灰度值扔到不同颜色的通道里就可以得到色彩)。假设这个时候图像对应的灰度级为[0,L-1],那么直方图其实就是这样的一个函数:
在这里插入图片描述
在这里插入图片描述
获得直方图的实现代码:

直方图的实现代码 [code]

在这里插入图片描述
实际效果:
在这里插入图片描述

  • 在较暗的图中,直方图的组成成分集中在灰度级低的一侧
  • 在比较亮的图中,直方图的组成成分集中在了灰度级高的一侧
  • 在低对比度的图中,直方图窄而且集中在中间的区域
  • 在高对比度的图中,直方图覆盖了灰度级很宽的范围,而且像素的分布没有太不均匀

在这里插入图片描述

Histogram Equalization 直方图均衡化

“如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。”
在这里插入图片描述
如何实现?
首先我们将原图像直方图标准化以得到原图像的PDF(概率分布函数):P(f)。
在这里插入图片描述

简单的来看, P(rk)P(r_k)其实表达了某种概率的形式,那么结合等号后面的内容,我们看得出来,他表示的是灰度级为rkr_k的像素占总的像素个数的比例。

个人认为之所以不是直接用k而是用r_k是因为,我们从0~k-1级的灰度值可能并不是连续的离散数值。比如k=0,1,2 rk=10,20,30k =0,1,2 ~ r_k =10,20,30

此时我们有
在这里插入图片描述
在这里插入图片描述
上面的意思其实就是我们期待对rkr_k有这样一个变换使得:
假设现在有一个变量r,表示原始图像的灰度级,并且已经被归一化到了[0,1]的区间。
有一个如下的变换函数:sk=T(r)=j=0kpr(rj)s_k = T(r) = \sum^k_{j=0}p_r(r_j)(注意这是离散版本的积分)
在这里插入图片描述
s表示变换后的灰度值
T(r)T(r)应满足如下两个条件:
在区间[0,1]上单值且单调递增
在[0,1]的区间内,T(r)[0,1]T(r) \in [0,1]

  • 在[0,1]上单值,其实是为了在做图像复原的时候,保证反变换存在在这里插入图片描述
  • 单调递增是为了使得变换后的图像和原图像之间具有保序性,防止输出的图像黑白颠倒
  • 让其值都定在[0,1]之间是为了,让输入和输出都在同一个范围内变换,方便比较

下面是具体推导:
在这里插入图片描述
在这里插入图片描述
观察此时ps(s)p_s(s): 一个随机变量的概率密度函数满足在某个有限区间内为常数,而在这个区间以外为0,那么就说这个随机变量满足均匀分布。
在这里插入图片描述
[reference url is added to REF section]
在这里插入图片描述
具体的推导:
在这里插入图片描述
在这里插入图片描述
所以简单来说就是我们得到了归一化直方图的概率积分函数。
下面是一个例子:
在这里插入图片描述

Histogram matching (or histogram specification)

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

Local Enhancement

之前的变换都是基于全局性(基于整个图像)的,我们这里基于部分区域(邻域)的。但是注意我们依然是对整个图像进行处理,这个思想有点像卷积。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
是不是和卷积示意图有点像?
在这里插入图片描述

Enhancement Using Histogram Statistics

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

直方图 More Operations

在这里插入图片描述

图像几何结构

  • 像素邻域
    在这里插入图片描述
区域增长与快速连通域算法

在这里插入图片描述
代码实现:
在这里插入图片描述
在这里插入图片描述

Two-Pass(两遍扫描法)
[ref can be found in REF section]

两遍扫描法,正如其名,指的就是通过扫描两遍图像,就可以将图像中存在的所有连通区域找出并标记。思路:第一遍扫描时赋予每个像素位置一个label,扫描过程中同一个连通区域内的像素集合中可能会被赋予一个或多个不同label,因此需要将这些属于同一个连通区域但具有不同值的label合并,也就是记录它们之间的相等关系;第二遍扫描就是将具有相等关系的equal_labels所标记的像素归为一个连通区域并赋予一个相同的label(通常这个label是equal_labels中的最小值)。

下面给出Two-Pass算法的简单步骤:

(1)第一次扫描:

访问当前像素B(x,y),如果B(x,y) == 1:

a、如果B(x,y)的领域中像素值都为0,则赋予B(x,y)一个新的label:

label += 1, B(x,y) = label;

b、如果B(x,y)的领域中有像素值 > 1的像素Neighbors:

1)将Neighbors中的最小值赋予给B(x,y):

B(x,y) = min{Neighbors}

2)记录Neighbors中各个值(label)之间的相等关系,即这些值(label)同属同一个连通区域;

labelSet[i] = { label_m, …, label_n },labelSet[i]中的所有label都属于同一个连通区域(注:这里可以有多种实现方式,只要能够记录这些具有相等关系的label之间的关系即可)

(2)第二次扫描:

访问当前像素B(x,y),如果B(x,y) > 1:

a、找到与label = B(x,y)同属相等关系的一个最小label值,赋予给B(x,y);

完成扫描后,图像中具有相同label值的像素就组成了同一个连通区域。
在这里插入图片描述

滤波操作(空间域滤波)

低通滤波有:线性的均值滤波器、高斯滤波器,非线性的双边滤波器、中值滤波器;
高通滤波有基于Canny,Sobel等各种边缘滤波。

低通滤波和高通滤波其实是相互矛盾的,但很多时候在做边缘检测前我们又需要进行低通滤波来降噪,这里就需要调节参数在保证高频的边缘不丢失的前提下尽可能的多去除图片的噪点。
在这里插入图片描述

线性滤波

空间域滤波器分为线性的和非线性的。我们首先介绍线性的:
在这里插入图片描述

Smoothing filter

在这里插入图片描述
所以其实low-pass filter做的就是 模糊或者平滑光顺的操作。

Some examples:
在这里插入图片描述
在这里插入图片描述
所以这里其实-a到a,-b到b刻画了一个滤波核

注意: Mask size增加你的 blurring效果增加。
在这里插入图片描述

对于边界的处理,其实在DNN中,可能直接就补0 padding了。
在这里插入图片描述

积分图
基础版的积分图

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

进阶版积分图

在这里插入图片描述

因此,对一张WH的图像直接求取积分图,只需要:
(W-1)+(H-1)+2
(W-1)*(H-1)

积分图代码实现 [code]

在这里插入图片描述

在这里插入图片描述

  • 高斯滤波
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
sharping filter

锐化滤波器其实多种实现方式: 对于一般的其实就是高通滤波器。当然如果是低通滤波器其实做的工作是平滑。
在这里插入图片描述

高通滤波器

所以其实 high-pass filter是用于检测尖锐部分的。
在这里插入图片描述
注意对于5*5的滤波核,里面的一圈是正1,外面的一圈是-1。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Derivative Filters

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这三种常见的算子还是要掌握的。
在这里插入图片描述
在这里插入图片描述
前面这个是 row fraction, 后面是Column fraction。
在这里插入图片描述

  • 二阶
    在这里插入图片描述
    注意他其实是二阶导数和的形式:
    在这里插入图片描述
    我们下面将上面的算式写作算子:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    拉普拉斯的问题在于:在你检测边缘的时候容易受到噪声的干扰。所以检测出来的边缘其实噪声也被放大了。
    在这里插入图片描述
High-Boost Filtering 高频补偿滤波器

这个可以表示为与A有关的控制参数,进而控制滤波效果。
在这里插入图片描述
一个推导过程:
在这里插入图片描述
如果是A=1就是一般的高频滤波。
在这里插入图片描述
如果A越大 图像越亮:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Summary:
在这里插入图片描述
空间域滤波器分为线性的和非线性的。下面是非线性的:

非线性滤波器

在这里插入图片描述

Order statistic filter

中值滤波:
在这里插入图片描述
这里的意思好像是在一个邻域内将中间的数值使用周围(这里定义为5)最大的替代。

Bilateral filter

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

Wiener filter

ppt没有介绍。

Least square filter

ppt没有介绍。

图像的频率方法分析

频率:s频率即信号进行周期性变化的速率。
图像的频率:图像亮度/颜色在水平/垂直方向上周期性变化的速率。

梯度和频率是不一样的:梯度是信号在空间(时间)域的变化率。频率是信号周期的变化率。梯度!=频率

实际信号一般都是多种频率信号的叠加,因此不能简单地说其“频率是多少”,而应是“某种频率的成分是多少”。
在这里插入图片描述
关于傅里叶变换这有一个粗糙的笔记:
在这里插入图片描述
在这里插入图片描述
全体公式:
在这里插入图片描述

离散傅里叶

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
傅里叶级数和变换不一样:

  • 傅立叶级数:一个周期函数可以表示为不同频率的正弦/余弦函数乘以不同系数的和(傅立叶级数)
  • 傅立叶变换:非周期函数也可以表示为一组正弦/余弦的积分乘以权函数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    实例:
    修正
    在这里插入图片描述
    在这里插入图片描述

复数的模:将复数的实部与虚部的平方和的正的平方根的值,记作∣z∣
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基本属性

在这里插入图片描述
二维傅立叶变换(2-D FT)的性质

  • 平移 Translation
  • 分配律与缩放 Distributivity and Scaling
  • 旋转 Rotation
  • 周期性与共轭对称性 Periodicity and Conjugate Symmetry
  • 可分离性 Separability
移中操作

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

平移操作

在这里插入图片描述
前述方程意味着:

  • f(x,y)乘以指数项,再进行傅立叶变换,则将频域原点移至 (u0,v0).
  • F(u,v)乘以指数项,再进行傅立叶逆变换,则将空域的原点移至 (x0,y0).
  • f(x,y) 的平移不影响傅立叶变换的幅度.
    结果对比:
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
运算律

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
some examples:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

快速傅里叶变换

需求原因

在这里插入图片描述
根据傅里叶变换的行列可分离性,二维傅里叶变换可由连续2次一维傅里叶变换得到——只需考虑一维的情况。
在这里插入图片描述

基本思想

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

推导过程

在这里插入图片描述
具体地,这里其实是折半引理:
在这里插入图片描述
在这里插入图片描述
注意这里其实是对原来的指数部分进行替换:
在这里插入图片描述
在这里插入图片描述
注意:
在这里插入图片描述
在这里插入图片描述
上面变化更加具体的说明:
在这里插入图片描述

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

基本算例

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

所以这里有:

频率域图像滤波

在这里插入图片描述

在这里插入图片描述

Notch filter

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

Low-pass filter & High-pass filter

在这里插入图片描述

卷积理论

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述有空间
在这里插入图片描述
与空间域行为不同:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述理想低通滤波器平滑处理的边缘清晰,但在处理过程中会产生较严重的模糊和振铃现象,D0越小,这种现象越严重。

  • how to get cutoff-frequency?
    在这里插入图片描述
  • 理想低通滤波
    在这里插入图片描述
    在这里插入图片描述
  • 巴特沃斯滤波器
    在这里插入图片描述
    在这里插入图片描述
  • 高斯低通滤波器
    在这里插入图片描述
    D越小越模糊:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 拉普拉斯
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

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

图像修复

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

噪声模型

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

只存在噪声的空间域图像复原

在这里插入图片描述

只存在噪声的频率域图像复原

在这里插入图片描述
在这里插入图片描述
前面滤波器设计并没有考虑图像中的一点对于其他点的特 征有什么不同。

自适应、局部噪声消除滤波器

自适应滤波器,它们的行为变化基于由 矩形窗口定义的区域内图像的统计特征。

自适应滤波器要优于迄今为止讨论过的所有滤波器的性能。但自适应滤波器的复杂度提高了。
在这里插入图片描述
在这里插入图片描述- 自适应中值滤波
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
估计退化函数的三个准则

  • 观察
  • 实验
  • 数学建模

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

颜色

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
颜色空间
在这里插入图片描述
颜色恒常性是指当照射物体表面的颜色光发生变化时,人们对该物体表面颜色的知觉仍然保持不变的知觉特性。比如用红色照射白色的物体表面,我们看到的不是红色,而是在红光照射下的白色。
在这里插入图片描述

形态学图像处理

  • 用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具
  • 基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的
  • 形态学图像处理的数学基础和所用语言是集合论
  • 形态学图像处理的应用可以简化图像数据,保持它们基本的形状特性,并除去不相干的结构
  • 形态学图像处理的基本运算有4个:膨胀、腐蚀、开操作和闭操作

集合论基础

在这里插入图片描述

膨胀和腐蚀:产生滤波器作用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
腐蚀的时候只保留那些全部包含于原来形状的信息。
在这里插入图片描述
在这里插入图片描述

开操作和闭操作:产生滤波器作用

在这里插入图片描述
先用B进行腐蚀,然后再用B进行膨胀。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

形态学的主要应用

边界提取

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

图像分割

在这里插入图片描述
在这里插入图片描述
图像分割基本方法:
图像分割算法一般基于亮度值的两个基本特征之一

  • 不连续性:图像边缘
  • 相似性:阈值处理、区域生长、区域分离和聚合
    基于相似性的分割
  • 基于亮度/颜色分布的方法: 阈值分割、K-means (K-均值)、 Mean Shift (均值漂移)
  • 基于区域的分割: 区域生长、区域分离与合并 、分水岭、活动轮廓(Snake)与水平集(Level-Set)方法
  • 基于图的分割:Graph Cut (图切割)、Geodesic (测地距离)、 Random Walks (随机游走)

基于亮度/颜色分布的方法

  • 阈值分割

  • K-means (K-均值)

  • Mean Shift (均值漂移)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    基于聚类的方法:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    基于区域的分割方法

  • 区域生长
    在这里插入图片描述

  • 区域分离与合并
    在这里插入图片描述

  • 分水岭
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    终止条件:n = max+1
    在这里插入图片描述
    改进:

  • 对图片进行预处理

  • 分割时添加约束

  • 分割后对图像进行再处理

  • 主动轮廓(Active Contour, Snake)与水平集(Level-Set)方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    水平集(Level-Set)方法

基于图的分割方法

  • 图切割 (Graph Cut)
    在这里插入图片描述

  • 随机游走(Random Walks)

  • 测地距离(Geodesic Distance)
    在这里插入图片描述

在这里插入图片描述

DL

SGD:由于批梯度下降每跟新一个参数的时候,要用到所有的样本数,所以训练速度会随着样本数量的增加而变得非常缓慢。随机梯度下降正是为了解决这个办法而提出的。它是利用每个样本的损失函数对θ求偏导得到对应的梯度,来更新θ。

例如一般的梯度下降:
在这里插入图片描述
在这里插入图片描述
随机梯度下降:在每次更新时用1个样本,可以看到多了随机两个字,随机也就是说我们用样本中的一个例子来近似我所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,对于最优化问题,凸问题,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。但是相比于批量梯度,这样的方法更快,更快收敛,虽然不是全局最优,但很多时候是我们可以接受的,所以这个方法用的也比上面的多。下图是其更新公式:
在这里插入图片描述
在这里插入图片描述

pls just refer to the PDF.

Ref

  • https://blog.csdn.net/aa93226aa/article/details/54600265
  • https://blog.csdn.net/xhhjin/article/details/6445460
  • https://www.zhihu.com/question/21849710/answer/19529410
  • https://blog.csdn.net/guyuealian/article/details/78288131
  • https://blog.csdn.net/jia20003/article/details/52710751
  • https://blog.csdn.net/qq_38131594/article/details/80722928
  • https://blog.csdn.net/liangchunjiang/article/details/79431339
  • https://blog.csdn.net/bitcarmanlee/article/details/79147113
  • https://www.zhihu.com/question/264189719/answer/291167114
2019-03-21 10:26:44 qq_36383623 阅读数 549
  • ArcGIS之数字高程模型(DEM)分析下篇视频课程(GIS...

    课程采用ArcGIS10.3.1进行录制,适用于10.0、10.1、10.2、10.4系列。使得学习者对于坡面地形因子的提取、地形特征点的提取、水文分析、可视性分析都有个深度的掌握。特别是在运用空间分析工具:栅格计算器的不同种运用、邻域分析、区域分析、水文分析、可见性分析、条件分析等等工具与实际项目的运用更加得心应手

    3590 人正在学习 去看看 黄晓军

前言:

常用的形态学处理的方法包括腐蚀,膨胀,开运算,闭运算,顶帽运算,底帽运算。腐蚀和膨胀是最基本的处理方法,其它方法都是腐蚀和膨胀方法相互组合产生的。

一、腐蚀和膨胀

1.腐蚀

图像的腐蚀操作类似于中值平滑,首先要取每个位置的一个邻域内的最小值(中值平滑是取中间值),将其作为该位置的输出像素值。这里的邻域不局限于矩形结构,还包括椭圆形结构和十字交叉形结构。它的具体定义为结构元,作用类似于平滑操作中的卷积核。

腐蚀的处理特点:因为取每个位置邻域内的最小值,所以腐蚀后的图像整体会变暗,图像中比较亮的区域的面积会变小甚至消失,而比较暗的区域会增大一些。图像元I和结构元S的腐蚀操作记为:E=I\ominus S

代码实现:结构元的定义,OpenCV提供了函数getStructureElement();

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

 分别为结构元的形状,结构元的大小,以及锚点位置。

而腐蚀操作,OpenCV也提供了erode函数(),

void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );

第三个参数即为结构元,第四个参数为锚点,第五个参数为腐蚀操作的迭代次数,后两个分别为边界的扩充类型与边界扩充值。

	Mat img = imread("Res/duck.jpg",CV_LOAD_IMAGE_GRAYSCALE);
	imshow("img",img);
	
	Mat s = getStructuringElement(MORPH_RECT,Size(3,3));
	Mat imgO;
	erode(img,imgO,s,Point(0,0),2);
	imshow("imgO", imgO);
	waitKey(0);
	return 0;

 效果图如下:

2.膨胀

膨胀和腐蚀操作原理相似,膨胀是选取每个位置邻域内的最大值作为输出灰度值。膨胀后的图像的整体亮度会有提高,图形中较亮物体的尺寸变大,而较暗物体的尺寸会减小甚至消失。图像I和结构元的膨胀操作记为:D=I\oplus S

代码实现与腐蚀操作类似,只不过膨胀操作的函数为dilate()。

二、开运算和闭运算

1.先腐蚀后膨胀的运算称为开运算,如下:

I\circ S=(I\ominus S)\oplus S

功能特点:它具有消除亮度较高的细小区域,在纤细点分离物体,对于较大物体,可以在不明显改变其面积的情况下平滑其边界等作用。

2.先膨胀后腐蚀的运算称为闭运算,如下:

I\bullet S=(I\oplus S)\ominus S

功能特点:它具有填充白色物体内细小黑色区域、连接临近物体的作用,也可以在不明显改变其面积的情况下平滑边界。

代码实现:由于开运算和闭运算是腐蚀和膨胀的组合,所以完全可以利用函数erode和dilate的组合来实现,而OpenCV则提供了函数morphologyEx(),

void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor = Point(-1,-1), int iterations = 1,
                                int borderType = BORDER_CONSTANT,
                                const Scalar& borderValue = morphologyDefaultBorderValue() );

enum MorphTypes{
    MORPH_ERODE    = 0, MORPH_DILATE  = 1,MORPH_OPEN  = 2, MORPH_CLOSE  = 3,
    MORPH_GRADIENT = 4, MORPH_TOPHAT   = 5,MORPH_BLACKHAT = 6
};

其中第三个参数,代表处理操作的类型,除了已经介绍到的腐蚀,膨胀,开运算和闭运算,还有顶帽运算,底帽运算以及形态梯度,其余参数均可参照erode和dilate函数的参数即可。

开闭运算相比较腐蚀和膨胀,它能够在不明显改变物体的形态大小的情况下进行腐蚀和膨胀操作。

三、顶帽运算和底帽运算以及形态学梯度

顶帽运算和底帽运算分别以开运算和闭运算为基础。

1.顶帽运算的定义是图像减去开运算结果:T_{hat}(I)=I-I\circ S

开运算可以消除暗背景下的较亮区域,所以用原图减去开运算结果就可以得到原图中灰度较亮的区域,原图中暗背景下的较亮区域处理后被消除,相减之后可以得到这部分被消除的亮色。所以又称白顶帽变换,它还有一个重要作用就是校正不均匀光照。

2.底帽运算定义为闭运算结果减去原图像:B_{hat}(I)=I\bullet S-I

闭运算可以填充亮度较高背景下的较暗区域,原来的较亮背景中的较暗区域会被填充为亮色,如果用闭运算的结果减去原图,得到的就是原图中灰度较暗的区域。

3.形态学梯度

定义:G=I\oplus S-I\ominus S

即膨胀结果减去腐蚀结果,因为膨胀是取邻域内的最大值,从而增大亮度高的区域的面积。而腐蚀是取邻域内的最小值,从而增加较暗区域的面积,所以两者相减得到的就是图像中物体的边界。

具体地代码实现就是使用上面已经介绍过的函数即可。

 

2012-10-31 21:05:05 guoyk1990 阅读数 20517
  • ArcGIS之数字高程模型(DEM)分析下篇视频课程(GIS...

    课程采用ArcGIS10.3.1进行录制,适用于10.0、10.1、10.2、10.4系列。使得学习者对于坡面地形因子的提取、地形特征点的提取、水文分析、可视性分析都有个深度的掌握。特别是在运用空间分析工具:栅格计算器的不同种运用、邻域分析、区域分析、水文分析、可见性分析、条件分析等等工具与实际项目的运用更加得心应手

    3590 人正在学习 去看看 黄晓军

灰度图像的腐蚀运算的数学定义为:


其中,g(x,y)为腐蚀后的灰度图像,f(x,y)为原灰度图像,B为结构元素。

用自然语言描述即:

          腐蚀运算是由结构元素确定的邻域块中选取图像值与结构元素值的差的最小值。

灰度图像的膨胀运算的数学定义为:


用自然语言描述即:

          膨胀运算是由结构元素确定的邻域块中选取图像值与结构元素值的和的最大值

在灰度形态学中,一般选择平坦的结构元素。所谓“平坦”,就是指结构元素的高度为零。因此这样的结构元素,B的值在D­b ­­的定义域内的所有坐标均处均为0,则上面两个公式可以重写为:


我在这对RGB三个通道都进行了处理使得灰度膨胀和腐蚀运算对彩色图像同样有效。但目前对彩色图像的腐蚀和膨胀没有统一的定义,此方法仅作参考。

以下是算法实现(选择的模板为3*3):

  /// <summary>
    /// 腐蚀运算
    /// </summary>
    /// <param name="srcBmp">原始图像</param>
    /// <param name="dstBmp">目标图像</param>
    /// <returns>处理成功 true 失败 false</returns>
    public static bool Erode(Bitmap srcBmp, out Bitmap dstBmp) {
        if (srcBmp == null) {
            dstBmp = null;
            return false;
        }
        Bitmap grayBmp = null;
        dstBmp = new Bitmap(srcBmp);
        BitmapData bmpDataGray = null;
        ToGray(srcBmp, out grayBmp);
        bmpDataGray = grayBmp.LockBits(new Rectangle(0, 0, grayBmp.Width, grayBmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
        BitmapData bmpDataSrc = srcBmp.LockBits(new Rectangle(0, 0, srcBmp.Width, srcBmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
        BitmapData bmpDataDst = dstBmp.LockBits(new Rectangle(0, 0, dstBmp.Width, dstBmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
        unsafe {
            int[] grayValueArray = new int[25];
            long[] index = new long[25];
            for (int i = 0; i < 25; i++) {
                grayValueArray[i] = 255;
            }
            byte* ptrSrc = (byte*)bmpDataSrc.Scan0;
            byte* ptrDst = (byte*)bmpDataDst.Scan0;
            byte* ptrGray = null;           
            ptrGray = (byte*)bmpDataGray.Scan0;              
                    for (int i = 0; i < bmpDataSrc.Height; i++) {//循环延拓,解决图像四周不能处理的问题
                        for (int j = 0; j < bmpDataSrc.Width; j++) {
                                grayValueArray[0] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3];
                                grayValueArray[1] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3];
                                grayValueArray[2] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3];
                                grayValueArray[3] = ptrGray[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3];
                                grayValueArray[4] = ptrGray[i * bmpDataSrc.Stride + j * 3];
                                grayValueArray[5] = ptrGray[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3];
                                grayValueArray[6] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3];
                                grayValueArray[7] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3];
                                grayValueArray[8] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3];
                                index[0] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3;
                                index[1] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3;
                                index[2] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3;
                                index[3] = i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3;
                                index[4] = i * bmpDataSrc.Stride + j * 3;
                                index[5] = i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3;
                                index[6] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3;
                                index[7] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3;
                                index[8] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3;
                                Array.Sort(grayValueArray, index);
                                ptrDst[i * bmpDataDst.Stride + j * 3] = ptrSrc[index[0]];
                                ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = ptrSrc[index[0] + 1];
                                ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = ptrSrc[index[0] + 2];
                        }
                    }
            srcBmp.UnlockBits(bmpDataSrc);
            dstBmp.UnlockBits(bmpDataDst);
        }
        return true;
    }
 /// <summary>
    /// 膨胀运算
    /// </summary>
    /// <param name="srcBmp">原始图像</param>
    /// <param name="dstBmp">目标图像</param>
    /// <returns>处理成功 true 失败 false</returns>
    public static bool Erode(Bitmap srcBmp, out Bitmap dstBmp) {
        if (srcBmp == null) {
            dstBmp = null;
            return false;
        }
        Bitmap grayBmp = null;
        dstBmp = new Bitmap(srcBmp);
        BitmapData bmpDataGray = null;
		ToGray(srcBmp, out grayBmp);
        bmpDataGray = grayBmp.LockBits(new Rectangle(0, 0, grayBmp.Width, grayBmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
        BitmapData bmpDataSrc = srcBmp.LockBits(new Rectangle(0, 0, srcBmp.Width, srcBmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
        BitmapData bmpDataDst = dstBmp.LockBits(new Rectangle(0, 0, dstBmp.Width, dstBmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
        unsafe {
            int[] grayValueArray = new int[25];
            long[] index = new long[25];
            for (int i = 0; i < 25; i++) {
                grayValueArray[i] = 255;
            }
            byte* ptrSrc = (byte*)bmpDataSrc.Scan0;
            byte* ptrDst = (byte*)bmpDataDst.Scan0;
            byte* ptrGray = null;           
            ptrGray = (byte*)bmpDataGray.Scan0;              
                    for (int i = 0; i < bmpDataSrc.Height; i++) {
                        for (int j = 0; j < bmpDataSrc.Width; j++) {//循环延拓,解决图像四周不能处理的问题
                                grayValueArray[0] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3];
                                grayValueArray[1] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3];
                                grayValueArray[2] = ptrGray[Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3];
                                grayValueArray[3] = ptrGray[i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3];
                                grayValueArray[4] = ptrGray[i * bmpDataSrc.Stride + j * 3];
                                grayValueArray[5] = ptrGray[i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3];
                                grayValueArray[6] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3];
                                grayValueArray[7] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3];
                                grayValueArray[8] = ptrGray[(i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3];
                                index[0] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3;
                                index[1] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3;
                                index[2] = Math.Abs(i - 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3;
                                index[3] = i * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3;
                                index[4] = i * bmpDataSrc.Stride + j * 3;
                                index[5] = i * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3;
                                index[6] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + Math.Abs(j - 1) % bmpDataSrc.Width * 3;
                                index[7] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + j * 3;
                                index[8] = (i + 1) % bmpDataSrc.Height * bmpDataSrc.Stride + (j + 1) % bmpDataSrc.Width * 3;
                                Array.Sort(grayValueArray, index);
                                ptrDst[i * bmpDataDst.Stride + j * 3] = ptrSrc[index[8]];
                                ptrDst[i * bmpDataDst.Stride + j * 3 + 1] = ptrSrc[index[8] + 1];
                                ptrDst[i * bmpDataDst.Stride + j * 3 + 2] = ptrSrc[index[8] + 2];
                        }
                    }
            srcBmp.UnlockBits(bmpDataSrc);
            dstBmp.UnlockBits(bmpDataDst);
        }
        return true;
    }
    /// <summary>
    /// 图像灰度化处理
    /// </summary>
    /// <param name="srcImg">原始图像</param>
    /// <param name="dstImg">处理后图像</param>
    /// <returns>处理成功 true 失败 false</returns>
    public static bool ToGray(Bitmap srcImg, out Bitmap dstImg) {
        if (srcImg == null) {
            dstImg = null;
            return false;
        }
        dstImg = new Bitmap(srcImg);
        Rectangle ret = new Rectangle(0, 0, dstImg.Width, dstImg.Height);//划定要处理的像素区域            
        BitmapData dstbmpData = dstImg.LockBits(ret, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);//获取像素数据  
        unsafe {
            byte temp = 0;
            byte* dsttempPtr = (byte*)dstbmpData.Scan0;
            for (int i = 0; i < dstbmpData.Height; i++) {
                dsttempPtr = (byte*)dstbmpData.Scan0 + i * dstbmpData.Stride;
                for (int j = 0; j < dstbmpData.Width; j++) {//在内存中的数据顺序是BGR
                    temp = (byte)(0.299 * dsttempPtr[j * 3 + 2] + 0.587 * dsttempPtr[j * 3 + 1] + 0.114 * dsttempPtr[j * 3]);
                    dsttempPtr[j * 3 + 2] = dsttempPtr[j * 3 + 1] = dsttempPtr[j * 3] = temp;
                }
            }
        }
        dstImg.UnlockBits(dstbmpData);//解锁
        return true;
    }
效果图




 


2012-07-28 13:39:31 caiye917015406 阅读数 5165
  • ArcGIS之数字高程模型(DEM)分析下篇视频课程(GIS...

    课程采用ArcGIS10.3.1进行录制,适用于10.0、10.1、10.2、10.4系列。使得学习者对于坡面地形因子的提取、地形特征点的提取、水文分析、可视性分析都有个深度的掌握。特别是在运用空间分析工具:栅格计算器的不同种运用、邻域分析、区域分析、水文分析、可见性分析、条件分析等等工具与实际项目的运用更加得心应手

    3590 人正在学习 去看看 黄晓军

一  形态学基本概念

    是一门建立在格论拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。

    在很多邻域中,如预处理、基于物体形状分割、物体量化等,与其他标准算法相比,形态学方法都有更好的结果和更快的速度。

    形态学运算的主要目的:

     (1)图像预处理(去噪声、简化形状)

     (2)增强物体结构(抽取骨骼、细化、粗化、凸包、物体标记)

     (3)从背景中分割物体

     (4)物体量化描述(面积、周长、投影、Euler-Poincare)

  二 二值膨胀和腐蚀

     2.1 膨胀

           2.1.1基本描述

            考虑两幅二值图像A,B。它们的前景用黑色,背景用白色。另fA和fB表示各自前景点的集合。定义膨胀运算为:

            dilation(A,B) = {a+b| a∈A,b∈B}。

            比如: A = {(2,8),(3,6),(4,4),(5,6),(6,4),(7,6),(8,8)}

                        B = {(0,0),(0,1)}

                        dilation(A,B) = {(2,8),(2,9),(3,6),(3,7),(4,4),(4,5),(5,6),(5,7),(6,4),(6,5),(7,6),(7,7),(8,8),(8,9)}

            即膨胀运算是两个集合中所有向量之和的集合

            2.1.2基本性质

           膨胀是一种各向同性的扩张,这种操作有时还被称为填充或生长。采用各向同性结构元素的膨胀运算可以描述为一个将所有与物体邻近的背景像素变为物体像素的变换。他可以用来填补物体中小的空洞和狭窄的细缝。   同时,它具有一些有趣的性质。

       (1)满足交换律 (2)满足结合律 (3)可以表示为平移点集的并 (4)膨胀对平移不变

    2.2腐蚀

       2.2.1基本描述

          腐蚀是对集合元素采用向量减法,将两个集合合并,腐蚀是膨胀的对偶运算。定义腐蚀运算为:

                      erosion(A,B) = {p|(p+b)∈A, a∈A,b∈B}.

         比如:  A={(1,0),(1,1), (1,2), (0,3),(1,3), (2,3),(3,3), (1,4)}

                      B={(0,0),(1,0)}

                      erosion(A,B)={(0,3), (1,3), (2,3)}

        即对于B中的任意元素与一元素相加属于A元素,即这一元素为膨胀元素

     2.2.2 基本性质

         对于腐蚀运算可以实现在图像中寻找物体轮廓,而且速度很快。具体的实现方法是计算原始图像和腐蚀后的图像差。同时,腐蚀还可以用来简化物体的结构,那些只有一个像素宽度的物体或物体的部分将被去掉,这   样复杂的物体可以分解为几个简单的部分。

        另外,腐蚀也如同膨胀一样具有几个性质

       (1)反向扩张变换 (2)平移不变 (3)递增变换

  2.3开运算和闭运算

      开运算:先腐蚀再膨胀

      闭运算:先膨胀再腐蚀

      结构元素各向同性的开运算用于消除图像中小于结构元素的细节部分,即物体的局部形状保持不变。而闭运算用来连接邻近的物体,填补小空洞,填平窄缝隙使得物体边缘更平滑。然而与腐蚀和膨胀不同,开运算和闭运算对于结构元素的平移不具有不变性。

                          

                        

 

                 

 

 

 

 

 

 

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