图像处理基础问题

2017-06-02 16:13:21 Carol__Deng 阅读数 7156

图像获取:对图像预处理

图像增强:以对问题的主观判断,对图像进行操作,使得图片比原始图像更适合处理

图像复原:改进图像外观,与图像增强相比,图像复原指的是客观处理图像

小波:以不同的分辨率来描述图像

分割:将一幅图像划分为他的组成部分或目标

参考自Gonzalez的《数字图像处理》

2017-05-18 17:49:18 u013828589 阅读数 12467

图像处理基础知识总结(1)

前言:从接触图像处理、生物特征识别、视频编解码、机器学习已两年有余,还没有系统的总结过,正好最近刷一下Tsinghua的Tipa课件和PKU的Digital Image Processing,对以前的图像处理基础知识做一些回顾,整理成笔记形式,代码和示例基于matlab给出。主要包含内容:

  • 原理总结
  • 部分matlab实现
  • matlab源代码解析

1.图像坐标变换

  • 旋转
  • 尺度(缩放)
  • 平移
  • 错切
  • 反射
  • 投影
  • 反变换

1.1 旋转

原理

绕原点逆时针旋转θ度角的变换公式是x′=x cosθ − ysinθ与y′=xsinθ+ycosθ,在二维空间中用矩阵表示为:
cmd-markdown-logo

但是为了可以表示仿射变换,需要使用齐次坐标,常见的矩阵变化都是在三维下进行的,在矩阵中增加一列与一行,除右下角的元素为1外其它部分填充为0,通过这种方法,所有的线性变换都可以转换为仿射变换。此时旋转矩阵如下所示

logo

仿射变换:包含平移及线性映射,为了使矩阵乘法可同时实现这两个功能,需要所有向量在其末端扩长 “1”且所有矩阵都于底部添加一排零,右边扩长一列转换向量,及右下角添加一个 “1”。
注:仿射变换具体请参考:wiki_仿射变换

MATLAB 实现

利用花花公子杂志上的Lean的部分图像进行示例(-.- 关键部分都被数字图像处理的作者们截掉了,只有一张lean的脸保留了下来。。。。天真的我),matlab中图像旋转很简单,调用imrotate函数即可

clc;clear;close all;
%% image rotate
img = imread('/Users/Documents/MATLAB/lena.jpg');
rotateImg = imrotate(img,30); 
figure;
subplot(1,2,1),imshow(img);
subplot(1,2,2),imshow(rotateImg);

效果如下:可以看到图像逆时针旋转了30度
cmd-markdown-logo

简单解析

打开matlab中imrotate函数源码,在命令行敲

type imrotate

找出关键信息可以看到,图像旋转利用矩阵旋转实现,旋转矩阵为tform

tform = affine2d([cosd(ang) -sind(ang) 0; sind(ang) cosd(ang) 0 ; 0 0 1])
B = imwarp(A,tform,method,'OutputView',Rout, 'SmoothEdges',true);

1.2 尺度(缩放)

基于上文,即坐标变换通常3x3大小的矩阵完成,对矩阵中的每一点生成[x,y,1]三维向量与变换矩阵相乘,便得到新矩阵,大多数图像几何变换都基于矩阵完成,用字母表示为从A到I,如下图。
cmd-markdown-logo
则对于缩放有
cmd-markdown-logo

1.3 平移

cmd-markdown-logo

1.4 错切

错切常分为x轴错切或者y轴错切,平行于x轴的切变为x′=x+ky与y′=y,
平行于y轴的切变为x′=x与y′=y+kx,矩阵实现参考下图

cmd-markdown-logo

1.5 反射

二维反射变换如下,三维的基于上文变为增广矩阵即可。
cmd-markdown-logo

1.6 投影

cmd-markdown-logo

1.7 反变换

cmd-markdown-logo
cmd-markdown-logo

2.像素、邻域、距离

像素

像素定义类似与眼球的杆状体,每张图片都是像素点的集合,常见的显示器描述就是以像素为单位,例如”640乘480”,它有横向640像素和纵向480像素(就像VGA显示器那样),因此其总数为640 × 480 = 307,200像素(30.72万像素)。
数字图像均由像素点构成,依据坐标原点位置的不同常分为两类,每个像素点标示为I(r,c)或f(x,y)。
**灰度图像的值域I是一个一元标量: I=greylevel
彩色图像的值域I是一个多元向量: 如I=(r,g,b)**

img

每一个像素所能表达的不同颜色数取决于比特每像素(BPP,bit per pixel)。这个最大数可以通过取2的色彩深度次幂来得到。例如,常见的取值有
8 bpp:256色,亦称为“8位”;
16 bpp:216=65,536色,称为高彩色”;
24 bpp:224=16,777,216色,称为真彩色,亦称为“24位色”;
32 bpp:224 +28,电脑领域较常见的32位色并不是表示232种颜色,而是在24位色基础上增加了8位(28=256级)的灰阶,因此32位的色彩总数和24位是相同的,32位也称为全彩。
(注:对于超过8位的深度,这些数位就是三个分量(红绿蓝)的各自的数位的总和。一个16位的深度通常分为5位红色和5比特蓝色,6比特绿色。24位的深度一般是每个分量8位。
一张普通图片的像素点如下图所示:

cmd-markdown-logo

注:
1.用matlab以矩阵形式读入即可查看图片属性,常见为8位灰度或者3通道RGB24位彩色图
2.人眼只能分辨1000种颜色

邻域

2.2.1. 4邻域

像素p(x,y)的4邻域是:(x+1,y);(x-1,y);(x,y+1);(x,y-1)
用N4(p)表示像素p的4邻域

2.2.2. D邻域

像素p(x,y)的D邻域是:(x-1,y-1);(x-1,y+1);(x+1,y+1);(x+1,y-1)
用ND(p)表示像素p的D邻域

2.2.3. 8邻域

4邻域的点+ D邻域的点
用N8p表示像素p的8邻域
N8p = N4p + NDp

2.2.4. 连通性

对于灰度值在V中的像素p和q,如果q在集合
N4p中,则称这两个像素是4连通的,8联通与此类似

距离

像素间的距离分为三种
- 欧几里得距离(Euclidean distance)
- D4距离或城市距离(Manhattan distance)
- D8距离或棋盘距离(Chessboard distance)

2.3.1. 欧式距离

在欧氏距离定义下,具有与(x,y)距离小于等于某 个值r的像素是:包含在以(x,y)为圆心,以r为半 径的圆.像素p(x,y)和q(s,t)间的欧氏距离定义如下

2.3.2 城市距离

像素p(x,y)和q(s,t)间的城市距离定义如下:

具有D4 = 1的像素是(x,y)的4邻域,具有与(x,y)距离小于等于某个值r的那些像素形成直角菱形

2.3.3 棋盘距离

像素p(x,y)和q(s,t)间的 D8距离定义如下:

具有与(x,y)距离小于等于某个值r的那些像素形成正方形,具有D8 = 1的像素是(x,y)的8邻域

2.3.4 路径

一条从具有坐标(x,y)的像素p,到具有坐标(s,t)的像素q的路径,是具
有坐标(x0,y0),(x1,y1),…,(xn,yn)的不同像素的序列。
其中,(x0,y0) = (x,y),(xn,yn) = (s,t),(xi,yi) 和(xi-1,yi-1)是邻接的,1
≤ i ≤ n,n是路径的长度。
如果(x0,y0) = (xn,yn) ,则该路径是闭合路径。
可以用定义连通的类似方法定义4-路径和8-路径。

3.图像显示

抖动技术

误差抖动常用在图像/视频压缩中,用来降低色彩的深度。如下图所示,256级(8bit)灰度过度 【图二】将图一转换成16级(8bit)灰度(高4位不变,低4位置0) 【图三】将图一用误差扩散法转换成16级灰度。
可看出图3效果好于图2

4.采样与量化

大多数传感器(如CMOS)的输出是连续信号波形,为了产生一幅数字图像,需要把连续的感知数据转化为离散的数字形式,这包括两种处理:取样和量化
- 取样(Sampling):图像函数定义域(空间坐 标)的数字化
- 量化(Quantization):图像函数值域(灰度值) 的数字化

4.1 采样

采样通常为求每个像素对应区域内的积分均值,实际中,模拟信号都是电流\电压值,经过A/D转换为数字信号,具体可参考VB工业编程。

采样点越多,数据量越多,图像越清晰

4.2量化

量化常分为2^m,m=8最常见,即把模拟信号最大最小值中分段量化

量化阶数越高,视觉效果越好

5.图像质量

  • 亮度
  • 对比度(最大亮度/最小亮度)
  • 尺寸大小
  • 细微层次(模糊)
  • 颜色饱和度

6.图像存储与格式

(1) BMP(BitMaP)格式
(2) GIF(Graphics Interchange Format)格式
(3) TIFF(Tagged Image Format File)格式
(4) JPEG(Joint Photographic Expert Group)格式

关于图像存储与格式,需要大篇篇幅去论述,通常分为head和data两部分,在开发中不会过多涉及格式问题,因此不再详细叙述,知识总结1就先写到这里,莫名累。。。。。

参考链接

wiki-变换矩阵
wiki-像素
pku-cys
Tsinghua-Tipa

作者:@Awiny

2018-08-30 21:33:23 qq_28413479 阅读数 2495

面试图像岗总是会有些传统的图像处理的基础知识问答面试,比较不足,搜集些基础问题来写写强化下。
收集的问题连接: https://blog.csdn.net/songzitea/article/details/48931151

1.彩色图像、灰度图像、二值图像和索引图像区别?
2.图像的像素数与分辨率有什么区别
3.椒盐噪声用什么滤波处理比较有效?
4.常用的边缘检测有哪些算子,各有什么特性
5.奈奎斯特采样定理是什么
6、用于数据挖掘的分类算法有哪些,各有何优劣?

1.彩色图像、灰度图像、二值图像和索引图像区别?

彩色图像(color image):每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。

灰度图像(gray image)是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;但是,灰度图像在黑色与白色之间还有许多级的颜色深度。灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度(如果用16位,则有65536级)。

二值图像(binary image),即一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。

索引图像,即它的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256Ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256Ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。

2.图像的像素数与分辨率有什么区别

像素:每张图片都是由色点组成的,每个色点称为一个像素。一张图片由30万个色点组成,这个图片的像素就是30W。我们常说相机是多少像素,这个像素就是说这款照相机的感器件有多少个,有100W个感光器件的相机就是100W像素的相机,有4000W个感光器件的相机就是4000W像素,以此类推。一台100W像素的相机拍摄的照片洗成5寸的照片会比洗成6寸清晰一点。
图像分辨率:图像分辨率是指每英寸图像内的像素点数。图像分辨率是有单位的,叫 像素每英寸。分辨率越高,像素的点密度越高,图像越逼真(这就是为什么做大幅的喷绘时,要求图片分辨率要高,就是为了保证每英寸的画面上拥有更多的像素点)。
屏幕分辨率:屏幕分辨率是屏幕每行的像素点数*每列的像素点数,每个屏幕有自己的分辨率。屏幕分辨率越高,所呈现的色彩越多,清晰度越高。

3.椒盐噪声用什么滤波处理比较有效?

椒盐噪声:也称为脉冲噪声:在图像中,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。在一维信号中,可以理解为一些离群的点或者尖脉冲。
滤除椒盐噪声比较有效的方法是对信号进行中值滤波处理。顾名思义,中值滤波是指将一个像素的值用该像素邻域中强度值的中间值来取代,至于领域范围取多大则视实际需要而定。去除椒盐噪声的后可以得到较为平滑的信号,其效果要优于均值滤波器,当然同样也会造成边缘模糊、信号不够锐利,这似乎也是很多滤波方法的一大通病。

补充:
椒盐噪声是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声,椒盐噪声用中值滤波比较好。

原因是:

 1.椒盐噪声是幅值近似相等但是随机的分布在不同位置,图中既有污染的点,也有干净的点。

 2.图中噪声的均值不为零,所以不适合均值滤波。

 3.图中有干净的点也有污染的点,所以中值滤波可以用干净的点代替污染的点。

中值滤波缺点:对于点、线、尖顶的图像不适用中值滤波因为会出现自适应话。

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。除常用抑制噪声的方法外,对高斯噪声的抑制方法常常采用数理统计方法,高斯噪声用均值滤波比较好。

原因是:

 1.高斯噪声的幅值近似正态分布,但是分布在每个点上。

 2.因为所有的点都被污染所以不能中值滤波选不到正确的干净的点。

 3.因为高斯噪声服从正态分布所以均值噪声为零可以选用均值滤波处理噪声。

4.常用的边缘检测有哪些算子,各有什么特性

不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息;另外,成像过程中的光照和噪声也是不可避免的重要因素。正是因为这些原因,基于边缘的图像分割仍然是当前图像研究中的世界级难题,目前研究者正在试图在边缘提取中加入高层的语义信息。

在实际的图像分割中,往往只用到一阶和二阶导数,虽然,原理上,可以用更高阶的导数,但是,因为噪声的影响,在纯粹二阶的导数操作中就会出现对噪声的敏感现象,三阶以上的导数信息往往失去了应用价值。二阶导数还可以说明灰度突变的类型。在有些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后继的处理和识别工作。

各种算子的存在就是对这种导数分割原理进行的实例化计算,是为了在计算过程中直接使用的一种计算单位。

1.Sobel算子

    其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值, Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响。Sobel算子对于像素的位置的影响做了加权,与Prewitt算子、Roberts算子相比因此效果更好。

   Sobel算子包含两组3x3的矩阵,分别为横向及纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。实际使用中,常用如下两个模板来检测图像边缘。

检测水平边沿 横向模板 : 这里写图片描述 检测垂直平边沿 纵向模板:这里写图片描述

图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。这里写图片描述

然后可用以下公式计算梯度方向。
这里写图片描述

在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。

缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。

  1. Isotropic Sobel算子

    Sobel算子另一种形式是(Isotropic Sobel)算子,加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测边缘时梯度幅度一致,就是通常所说的各向同性Sobel(Isotropic Sobel)算子。模板也有两个,一个是检测水平边沿的 ,另一个是检测垂直平边沿的 。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。
    
  2. Roberts算子

罗伯茨算子、Roberts算子是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子,他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。1963年,Roberts提出了这种寻找边缘的算子。
Roberts边缘算子是一个2x2的模板,采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位较准,对噪声敏感。适用于边缘明显且噪声较少的图像分割。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。

  1. Prewitt算子

    Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。
    

    对数字图像f(x,y),Prewitt算子的定义如下:

G(i)=|[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]|
G(j)=|[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]|
则 P(i,j)=max[G(i),G(j)]或 P(i,j)=G(i)+G(j)
经典Prewitt算子认为:凡灰度新值大于或等于阈值的像素点都是边缘点。即选择适当的阈值T,若P(i,j)≥T,则(i,j)为边缘点,P(i,j)为边缘图像。这种判定是欠合理的,会造成边缘点的误判,因为许多噪声点的灰度值也很大,而且对于幅值较小的边缘点,其边缘反而丢失了。
Prewitt算子对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。

因为平均能减少或消除噪声,Prewitt梯度算子法就是先求平均,再求差分来求梯度。水平和垂直梯度模板分别为:

检测水平边沿 横向模板 这里写图片描述 检测垂直平边沿 纵向模板:这里写图片描述
该算子与Sobel算子类似,只是权值有所变化,但两者实现起来功能还是有差距的,据经验得知Sobel要比Prewitt更能准确检测图像边缘。

5.Laplacian算子

     Laplace算子是一种各向同性算子,二阶微分算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。

拉普拉斯算子也是最简单的各向同性微分算子,具有旋转不变性。一个二维图像函数的拉普拉斯变换是各向同性的二阶导数,定义
这里写图片描述

了更适合于数字图像处理,将拉式算子表示为离散形式:

这里写图片描述

另外,拉普拉斯算子还可以表示成模板的形式,如下图所示,

离散拉普拉斯算子的模板:这里写图片描述, 其扩展模板: 这里写图片描述

  拉式算子用来改善因扩散效应的模糊特别有效,因为它符合降制模型。扩散效应是成像过程中经常发生的现象。

  Laplacian算子一般不以其原始形式用于边缘检测,因为其作为一个二阶导数,Laplacian算子对噪声具有无法接受的敏感性;同时其幅值产生算边缘,这是复杂的分割不希望有的结果;最后Laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面;一般使用的是高斯型拉普拉斯算子(Laplacian of a Gaussian,LoG),由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。

6.Canny算子

  该算子功能比前面几种都要好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。

Canny边缘检测算法

step1: 用高斯滤波器平滑图象;

step2: 用一阶偏导的有限差分来计算梯度的幅值和方向;

step3: 对梯度幅值进行非极大值抑制

step4: 用双阈值算法检测和连接边缘

详解:http://www.cnblogs.com/cfantaisie/archive/2011/06/05/2073168.html

(1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。

(2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。

(3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。

5.奈奎斯特采样定理是什么

没研究过,待补

6、用于数据挖掘的分类算法有哪些,各有何优劣?

训练集有多大?如果你的训练集很小,高偏差/低方差的分类器(如朴素贝叶斯)比低偏差/高方差的分类器(如K近邻或Logistic回归)更有优势,因为后者容易过拟合。但是随着训练集的增大,高偏差的分类器并不能训练出非常准确的模型,所以低偏差/高方差的分类器会胜出(它们有更小的渐近误差)。你也可以从生成模型与鉴别模型的区别来考虑它们。某些分类器的优势朴素贝叶斯(Naive Bayes, NB)超级简单,就像做一些数数的工作。如果条件独立假设成立的话,NB将比鉴别模型(如Logistic回归)收敛的更快,所以你只需要少量的训练数据。即使条件独立假设不成立,NB在实际中仍然表现出惊人的好。如果你想做类似半监督学习,或者是既要模型简单又要性能好,NB值得尝试。Logistic回归(Logistic Regression, LR)LR有很多方法来对模型正则化。比起NB的条件独立性假设,LR不需要考虑样本是否是相关的。与决策树与支持向量机(SVM)不同,NB有很好的概率解释,且很容易利用新的训练数据来更新模型(使用在线梯度下降法)。如果你想要一些概率信息(如,为了更容易的调整分类阈值,得到分类的不确定性,得到置信区间),或者希望将来有更多数据时能方便的更新改进模型,LR是值得使用的。决策树(Decision Tree, DT)DT容易理解与解释(对某些人而言——不确定我是否也在他们其中)。DT是非参数的,所以你不需要担心野点(或离群点)和数据是否线性可分的问题(例如,DT可以轻松的处理这种情况:属于A类的样本的特征x取值往往非常小或者非常大,而属于B类的样本的特征x取值在中间范围)。DT的主要缺点是容易过拟合,这也正是随机森林(Random Forest, RF)(或者Boosted树)等集成学习算法被提出来的原因。此外,RF在很多分类问题中经常表现得最好(我个人相信一般比SVM稍好),且速度快可扩展,也不像SVM那样需要调整大量的参数,所以最近RF是一个非常流行的算法。支持向量机(Support Vector Machine, SVM)很高的分类正确率,对过拟合有很好的理论保证,选取合适的核函数,面对特征线性不可分的问题也可以表现得很好。SVM在维数通常很高的文本分类中非常的流行。由于较大的内存需求和繁琐的调参,我认为RF已经开始威胁其地位了。回到LR与DT的问题(我更倾向是LR与RF的问题),做个简单的总结:两种方法都很快且可扩展。在正确率方面,RF比LR更优。但是LR可以在线更新且提供有用的概率信息。鉴于你在Square(不确定推断科学家是什么,应该不是有趣的化身),可能从事欺诈检测:如果你想快速的调整阈值来改变假阳性率与假阴性率,分类结果中包含概率信息将很有帮助。无论你选择什么算法,如果你的各类样本数量是不均衡的(在欺诈检测中经常发生),你需要重新采样各类数据或者调整你的误差度量方法来使各类更均衡。但是。。。更好的数据往往比更好的算法更重要,提取好的特征也需要很大的功夫。如果你的数据集非常大,那么分类算法的选择可能对最后的分类性能影响并不大(所以可以根据运行速度或者易用性来选择)。如果你很在意分类的正确率,那么你得尝试多种分类器,根据交叉验证的结果来挑选性能最好的。或者,学习下Netflix Prize和Middle Earth, 使用某种集成的方法来组合多个分类器。

2019-11-17 22:33:05 lqfarmer 阅读数 245

    本文整理了图像处理初学者应该需要了解的100个基础问题,涉及读取、显示图像、操作像素、拷贝图像、保存图像、灰度化(Grayscale)、二值化(Thresholding)、大津算法、HSV 变换、减色处理、平均池化(Average Pooling)、最大池化(Max Pooling)、高斯滤波(Gaussian Filter)、中值滤波(Median filter)、仿射变换(Afine Transformations)等100多个知识点。

    给出了详细的代码实现,具体的输入输出case情况。

    内容整理自:

https://github.com/gzr2017/ImageProcessing100Wen

 

    問題1 - 10

    1通道替换

    2灰度化(Grayscale)

    3二值化(Thresholding)

    4大津算法

    5HSV 变换

    6减色处理

    7平均池化(Average Pooling)

    8最大池化(Max Pooling)

    9高斯滤波(Gaussian Filter)

    10中值滤波(Median filter)

 

    问题11 - 20

    11均值滤波

    12Motion Filter

    13MAX-MIN 滤波

    14微分滤波

    15Sobel 滤波

    16Prewitt 滤波

    17Laplacian 滤波

    18Emboss 滤波

    19LoG 滤波

    20直方图表示

 

    问题21-30

    21直方图归一化(Histogram Normalization)

    22直方图操作

    23直方图均衡化(Histogram Equalization)

    24伽玛校正(Gamma Correction)

    25最邻近插值(Nearest-neighbor Interpolation)

    26双线性插值(Bilinear Interpolation)

    27双三次插值(Bicubic Interpolation)

    28仿射变换(Afine Transformations)——平行移动

    29仿射变换(Afine Transformations)——放大缩小

    30仿射变换(Afine Transformations)——旋转

 

    问题31-40

    31仿射变换(Afine Transformations)——倾斜

    32傅立叶变换(Fourier Transform)

    33傅立叶变换——低通滤波

    34傅立叶变换——高通滤波

    35傅立叶变换——带通滤波

    36JPEG 压缩——第一步:离散余弦变换(Discrete Cosine Transformation)

    37峰值信噪比(Peak Signal to Noise Ratio)

    38JPEG 压缩——第二步:离散余弦变换+量化

    39JPEG 压缩——第三步:YCbCr 色彩空间

    40JPEG 压缩——第四步:YCbCr+DCT+量化

   

    问题41-50

    41Canny边缘检测:第一步——边缘强度

    42Canny边缘检测:第二步——边缘细化

    43Canny边缘检测:第三步——滞后阈值

    44霍夫变换(Hough Transform)/直线检测——第一步:霍夫变换

    45霍夫变换(Hough Transform)/直线检测——第二步:NMS

    46霍夫变换(Hough Transform)/直线检测——第三步:霍夫逆变换

    47形态学处理:膨胀(Dilate)

    48形态学处理:腐蚀(Erode)

    49开运算(Opening Operation)

    50闭运算(Closing Operation)

    

    问题51-60

    51形态学梯度(Morphology Gradient)

    52顶帽(Top Hat)

    53黑帽(Black Hat)

    54使用误差平方和算法(Sum of Squared Difference)进行模式匹配(Template Matching)

    55使用绝对值差和(Sum of Absolute Differences)进行模式匹配

    56使用归一化交叉相关(Normalization Cross Correlation)进行模式匹配

    57使用零均值归一化交叉相关(Zero-mean Normalization Cross Correlation)进行模式匹配

    584-邻接连通域标记

    598-邻接连通域标记

    60透明混合(Alpha Blending)

 

    问题61-70

    614-邻接的连接数

    628-邻接的连接数

    63细化处理

    64Hilditch 细化算法

    65Zhang-Suen 细化算法

    66方向梯度直方图(HOG)第一步:梯度幅值・梯度方向

    67方向梯度直方图(HOG)第二步:梯度直方图

    68方向梯度直方图(HOG)第三步:直方图归一化

    69方向梯度直方图(HOG)第四步:可视化特征量

    70色彩追踪(Color Tracking)

 

    问题71-80

    71掩膜(Masking)

    72掩膜(色彩追踪(Color Tracking)+形态学处理)

    73缩小和放大

    74使用差分金字塔提取高频成分

    75高斯金字塔(Gaussian Pyramid)

    76显著图(Saliency Map)

    77Gabor 滤波器(Gabor Filter)

    78旋转 Gabor 滤波器

    79使用 Gabor 滤波器进行边缘检测

    80使用 Gabor 滤波器进行特征提取

 

    问题81-90

    81Hessian 角点检测

    82Harris 角点检测第一步:Sobel + Gausian

    83Harris 角点检测第二步:角点检测

    84简单图像识别第一步:减色化+直方图

    85简单图像识别第二步:判别类别

    86简单图像识别第三步:评估

    87简单图像识别第四步:k-NN

    88k-平均聚类算法(k -means Clustering)第一步:生成质心

    89k-平均聚类算法(k -means Clustering)第二步:聚类

    90k-平均聚类算法(k -means Clustering)第三步:调整初期类别

 

    问题91-100

    91利用 k-平均聚类算法进行减色处理第一步:按颜色距离分类

    92利用 k-平均聚类算法进行减色处理第二步:减色处理

    93准备机器学习的训练数据第一步:计算 IoU

    94准备机器学习的训练数据第一步:随机裁剪(Random Cropping)

    95神经网络(Neural Network)第一步:深度学习(Deep Learning)

    96神经网络(Neural Network)第二步:训练

    97简单物体检测第一步----滑动窗口(Sliding Window)+HOG

    98简单物体检测第二步----滑动窗口(Sliding Window)+ NN

    99简单物体检测第三步----非极大值抑制(Non-Maximum Suppression)

    100简单物体检测第三步----评估 Precision, Recall, F-score, mAP

2018-08-16 22:54:17 Eastmount 阅读数 16999

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

同时推荐作者的C++图像系列知识:
[数字图像处理] 一.MFC详解显示BMP格式图片
[数字图像处理] 二.MFC单文档分割窗口显示图片
[数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
[数字图像处理] 四.MFC对话框绘制灰度直方图
[数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
[数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
[数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

本篇文章作为第一篇,将讲解图像处理基础知识和OpenCV入门函数,知识点如下:
1.图像基础知识
2.OpenCV读写图像
3.OpenCV像素处理

PS: 文章也学习了网易云高登教育的知识,推荐大家学习。

PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

一.图像基础知识

图像都是由像素(pixel)构成的,即图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。

图像通常包括二值图像、灰度图像和彩色图像。

1.二值图像
二值图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。

2.灰度图像
灰度图像除了黑和白,还有灰色,它把灰度划分为256个不同的颜色,图像看着也更为清晰。将彩色图像转换为灰度图是图像处理的最基本预处理操作,通常包括下面几种方法:
(1) 浮点算法:Gray=R0.3+G0.59+B0.11
(2) 整数方法:Gray=(R
30+G59+B11)/100
(3) 移位方法:Gray=(R28+G151+B77)>>8;
(4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)
(5) 仅取绿色:Gray=G;
(6) 加权平均值算法:根据光的亮度特性,公式: R=G=B=R
0.299+G*0.587+B0.144

通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。改变象素矩阵的RGB值,来达到彩色图转变为灰度图。

3.彩色图像
彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。



二.OpenCV读写图像

本文主要使用Python2.7和OpenCV进行讲解,首先调用"pip install opencv-python"安装OpenCV库,如下图所示:

1.读入图像
OpenCV读图像主要调用下面函数实现:

img = cv2.imread(文件名,[,参数])
参数(1) cv2.IMREAD_UNCHANGED (图像不可变)
参数(2) cv2.IMREAD_GRAYSCALE (灰度图像)
参数(3) cv2.IMREAD_COLOR (读入彩色图像)
参数(4) cv2.COLOR_BGR2RGB (图像通道BGR转成RGB)

2.显示图像
显示图像调用函数如下:

cv2.imshow(窗口名, 图像名)

3.窗口等待
调用函数如下:

cv2.waitKey(delay)
键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数>0表示等待delay毫秒;参数<0表示等待键盘单击。

4.删除所有窗口
调用函数如下:

cv2.destroyAllWindows() 删除所有窗口
cv2.destroyWindows() 删除指定的窗口

5.写入图片
调用函数如下:

retval = cv2.imwrite(文件地址, 文件名)

下面代码是读入图片并显示保存。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("test.jpg")

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("testyxz.jpg", img)

输出结果如下图所示,并且在文件夹下保存了一张名为“testyxz.jpg”的图像。

如果代码中没有watiKey(0)函数,则运行结果如下图所示:

同时
可以对代码进行升级,如下所示:

#无限期等待输入
k=cv2.waitKey(0)
#如果输入ESC退出
if k==27:
    cv2.destroyAllWindows()


三.OpenCV像素处理

1.读取像素
灰度图像直接返回灰度值,彩色图像则返回B、G、R三个分量。注意OpenCV读取图像是BGR存储显示,需要转换为RGB再进行图像处理。

灰度图像:返回值 = 图像(位置参数)
eg: test=img[88,42]
彩色图像:返回值 = 图像[位置元素, 0 | 1 | 2 ] 获取BGR三个通道像素
eg: blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]

2.修改图像
修改图像如果是灰度图像则直接赋值新像素即可,彩色图像依次给三个值赋值即可。

灰度图像:
img[88,142] = 255
彩色图像:
img[88,142, 0] = 255
img[88,142, 1] = 255
img[88,142, 2] = 255
彩色图像:方法二
img[88,142] = [255, 255, 255]

下面代码是获取像素及修改的操作。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
test = img[88,142]
print test
img[88,142] = [255, 255, 255]
print test

#分别获取BGR通道像素
blue = img[88,142,0]
print blue
green = img[88,142,1]
print green
red = img[88,142,2]
print red

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("testyxz.jpg", img)

输出结果如下所示:
[158 107 64]
[255 255 255]
255
255
255

下面代码是将行为100到200、列150到250的像素区域设置为白色。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)

#该区域设置为白色
img[100:200, 150:250] = [255,255,255]

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("testyxz.jpg", img)

运行结果如下图所示:

希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。
(By:Eastmount 2018-08-16 夜11点 https://blog.csdn.net/Eastmount/