日萌社
人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
Canny边缘检测的流程
问题解析
Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
好的检测- 算法能够尽可能多地标识出图像中的实际边缘。
好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。
Canny边缘检测的流程是:
- 图像降噪。我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我们第一步就是想到要先去除噪声,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。
- 计算图像梯度,得到可能边缘。计算图像梯度能够得到图像的边缘,因为梯度是灰度变化明显的地方,而边缘也是灰度变化明显的地方。当然这一步只能得到可能的边缘。因为灰度变化的地方可能是边缘,也可能不是边缘。这一步就有了所有可能是边缘的集合。
- 非极大值抑制。通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。即“胖边缘”变成“瘦边缘”。
- 双阈值筛选。通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low),高阈值(high)。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。
答案
- 高斯滤波
- 计算图像的梯度
- 非极大值抑制
- 高低阈值输出二值图像
问题拓展
其他的边缘检测算子的使用,比如sobel,scharr算子等
常用的边缘检测方法有哪些?
对霍夫变换的理解
问题解析
霍夫变换常用来提取图像中的直线和圆等几何形状。它通过一种投票算法检测具有特定形状的物体。该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。
答案
- 针对每个像素点,使得theta从-90度到180度,使用极坐标p = xcos(theta) + ysin(theta) 计算得到共270组(p,theta)代表着霍夫空间的270条直线。将这270组值存储到H中。
- 如果一组点共线,则这组点中的每个值,都会使得H(p,theta)加1。
- 因此找到H(p,theta)值最大的直线,就是共线的点最多的直线,H(p,theta)值次大的,是共线点次多的直线。可以根据一定的阈值,将比较明显的线全部找出来
问题拓展
直线检测的算法?
请说下霍夫圆检测的原理?
对HOG特征的理解
问题解析
HOG(Histogram of Oriented Gridients的简写)特征检测算法,一种解决人体目标检测的图像描述子,是一种用于表征图像局部梯度方向和梯度强度分布特性的描述符。其主要思想是:在边缘具体位置未知的情况下,边缘方向的分布也可以很好的表示行人目标的外形轮廓。
整体流程简单描述如下:
- 将输入图像(你要检测的目标或者扫描窗口)灰度化,即将彩色图转换为灰度图
- 颜色空间归一化:采用Gamma校正法对输入图像进行颜色空间的标准化(归一化),目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰
- 梯度计算:计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰
- 梯度方向直方图:将图像划分成小cells(例如8*8像素/cell), 统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的描述符
- 重叠直方图归一化:将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征描述符。
- HOG特征:将图像image内的所有block的HOG特征描述符串联起来就可以得到该image(你要检测的目标)的HOG特征描述符,就得到最终的可供分类使用的特征向量了
答案
HOG的主要思想是:在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布(即梯度的统计信息,而梯度主要位于边缘的地方)很好地描述。HOG特征检测算法的几个步骤:颜色空间归一化—>梯度计算—>梯度方向直方图—>重叠块直方图归一化—>HOG特征
问题拓展
理解Harr特征,LBP特征等?
常用的图像局部特征和全局特征
问题解析
首先明确全局特征和局部特征的意义:
全局特征指图像的整体属性,包括颜色特征、纹理特征、形状特征、直方图等。容易受到干扰,如光照、旋转、噪声等。图像的局部特征反映图像局部的特殊性,局部特征数量丰富,特征间相关度小,不容易受到部分遮挡、光照等噪声的干扰,因为不会因为部分特征的消失而影响其他特征的检测和匹配。典型的局部图像特征生成应包括图像极值点检测和描述两个阶段。好的局部图像特征应具有特征检测重复率高、速度快 ,特征描述对光照、旋转、视点变化等图像变换具有鲁棒性,特征描述符维度低,易于实现快速匹配等特点。
答案
常用的全局特征就是颜色,纹理,形状,直方图等,局部特征有关键点,角点等
问题拓展
对图像进行特征描述的方法有哪些?
图像的角点是什么?为什么使用角点作为特征?
问题解析
首先明确角点是图像中极值点,在某方面属性特别突出的点,是在某些属性上强度最大或者最小的孤立点、线段的终点。 对于图像而言,如图所示圆圈内的部分,即为图像的角点,其是物体轮廓线的连接点。
描述方法有:
- 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
- 两条及两条以上边缘的交点;
- 图像中梯度值和梯度方向的变化速率都很高的点;
- 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向
答案
角点是图像很重要的特征,某方面属性特别突出的点,是在某些属性上强度最大或者最小的孤立点、线段的终点等。对图像图形的理解和分析有很重要的作用。角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。
问题拓展
关键点指什么?特征点是什么?
常用的颜色空间
问题解析
常用的图像空间有:
RGB:是图像采集设备采集图像最常用的一种,由三个分量组成,分别为红色分量(R),绿色分量(G)和蓝色分量(B)。
HSI/HSV:分别为色调分量(H)、饱和度分量(S)和亮度分量(I)。色调H分量容是一种颜色“质”的反映,每一种颜色光都有相对应的波长及相应的色调值。饱和度S分量表示一种颜色的纯度。强度I分量反映了光线的强弱变化,是颜色“量”的反映。由于人的视觉对亮度的敏感程度远强于对颜色浓淡的敏感程度,为了便于色彩处理和识别,人的视觉系统经常采用HSI色彩空间,它比RGB色彩空间更符合人的视觉特性.在图像处理和计算机视觉中大量算法都可在HSI色彩空间中方便地使用
CMYK: 应用于印刷工业,印刷业通过青(C)、品(M)、黄(Y)三原色油墨的不同网点面积率的叠印来表现丰富多彩的颜色和阶调,这便是三原色的CMY颜色空间。
YUV: 一种颜色编码方法,常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。YUV是编译true-color颜色空间(color space)的种类, “Y”表示明亮度,“U”和“V”则是色度、浓度。
答案
- RGB
- HSI/HSV
- CMYK
- YUV
图像的插值方法有哪些?
问题解析
在做数字图像处理时,经常会碰到小数象素坐标的取值问题,这时就需要依据邻近象素的值来对该坐标进行插值。比如:做地图投影转换,对目标图像的一个象素进行坐标变换到源图像上对应的点时,变换出来的对应的坐标是一个小数,这时就需要插值。常见的插值方法有:
- 双线性内插法
双线性内插法是利用待求象素四个邻象素的灰度在两个方向上作线性内插,如下图所示:
双线性内插法的计算比最邻近点法复杂,计算量较大,但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。
- 三次内插法
该方法利用三次多项式S(x)求逼近理论上最佳插值函数sin(x)/x, 其数学表达式为:
待求像素(x, y)的灰度值由其周围16个灰度值加权内插得到,如下图:
三次曲线插值方法计算量较大,但插值后的图像效果最好。
答案
- 最近邻法
- 双线性内插法
- 三次内插法
常用的滤波方法,写出均值滤波的实现
问题解析
图像滤波既可以在空域进行,也可以在频域进行。图像滤波可以更改或者增强图像。常用的滤波器是:
- 高斯滤波:高斯滤波器是响应脉冲为高斯形状的滤波器,对于图像来说,高斯滤波器是利用高斯核的一个2维的卷积算子,用于图像模糊化(平滑,去除细节和噪声)
- 均值滤波:均值滤波器很简单,就是像素的值用窗内邻居的平均值来代替。主要应用于平滑噪声,但是跟上面的高斯滤波器比,它的平滑手段显然更粗暴些,邻域的值不管远近一律平等,高斯滤波器还至少根据远近有些区分。
- 中值滤波:中值滤波器就是用窗内的中间值代替该像素的值,也多用于减少噪声,特别对于椒盐噪声有很好的效果
答案
滤波方法:
- 中值滤波
- 均值滤波
- 高斯滤波
均值滤波的实现:
def means_filter(input_image, filter_size):
# 创建原图像的副本
input_image_cp = np.copy(input_image)
# 创建滤波器
filter_template = np.ones((filter_size, filter_size))
# 对图像进行padding
pad_num = int((filter_size - 1) / 2)
input_image_cp = np.pad(input_image_cp, (pad_num, pad_num), mode="constant", constant_values=0)
# 获取图像的大小
m, n = input_image_cp.shape
output_image = np.copy(input_image_cp)
# 遍历图像进行滤波
for i in range(pad_num, m - pad_num):
for j in range(pad_num, n - pad_num):
output_image[i, j] = np.sum(filter_template * input_image_cp[i - pad_num:i + pad_num + 1, j - pad_num:j + pad_num + 1]) / (filter_size ** 2)
# 输出滤波后结果
output_image = output_image[pad_num:m - pad_num, pad_num:n - pad_num]
return output_image
问题拓展
图像中的噪声怎么处理?
椒盐噪声使用哪种滤波方法较好?
Graph-cut的基本原理和应用
问题解析
GraphCut方法图像分割问题与图的最小割(min cut)问题相关联。
首先用一个无向图G=表示要分割的图像,V和E分别是顶点(vertex)和边(edge)的集合。此处的Graph和普通的Graph稍有不同。普通的图由顶点和边构成,如果边的有方向的,这样的图被则称为有向图,否则为无向图,且边是有权值的,不同的边可以有不同的权值,分别代表不同的物理意义。而Graph Cuts图是在普通图的基础上多了2个顶点,这2个顶点分别用符号”S”和”T”表示,统称为终端顶点。其它所有的顶点都必须和这2个顶点相连形成边集合中的一部分。
答案
根据待分割的图像,确定图的节点与边,即图的形状已确定下来,是给图中所有边赋值相应的权值,然后找到权值和最小的边的组合,就完成了图像分割。
问题拓展
基于图的分割方法有哪些?
Grabcut的原理
写一个图像的resize方法
问题解析
实现图像的缩放,要求不能直接使用opencv等图像处理工具:
- 获取要处理的图像及图像缩放后的大小
- 确定缩放比例
- 遍历缩放后的结果,利用双线性插值法完成图像的缩放
答案
def image_Resize(src, shape):
# 获取原图像和图像缩放后的大小.
height, width, channels = src.shape
dst_width, dst_height = shape
# 若缩放后大小与原图像相同,则直接放回原图像
if ((dst_height == height) and (dst_width == width)):
return src
# 创建全0数组存放缩放后图像
dst_Image = np.zeros((dst_height, dst_width, channels), np.uint8)
# 缩放比例.
scale_x = float(width)/dst_width
scale_y = float(height)/dst_height
# 遍历
for k in range(channels):
for dst_y in range(dst_height):
for dst_x in range(dst_width):
# Original coords.
src_x = (dst_x + 0.5) * scale_x - 0.5
src_y = (dst_y + 0.5) * scale_y - 0.5
# 双线性插值
src_x_0 = int(np.floor(src_x))
src_y_0 = int(np.floor(src_y))
src_x_1 = min(src_x_0 + 1, width - 1)
src_y_1 = min(src_y_0 + 1, height - 1)
value0 = (src_x_1 - src_x) * src[src_y_0, src_x_0, k] + (src_x - src_x_0) * src[src_y_0, src_x_1, k]
value1 = (src_x_1 - src_x) * src[src_y_1, src_x_0, k] + (src_x - src_x_0) * src[src_y_1, src_x_1, k]
# 缩放后结果
dst_Image[dst_y, dst_x, k] = int((src_y_1 - src_y) * value0 + (src_y - src_y_0) * value1)
return dst_Image
问题拓展
写程序将图片放大或缩小?
图像中直方图的应用
问题解析
直方图就是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中。其中, bin 为直方图中经常用到的一个概念,可以译为 “直条” 或 “组距”,其数值是从数据中计算出的特征统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。且无论如何,直方图获得的是数据分布的统计图。通常直方图的维数要低于原始数据。
图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。CV 领域常借助图像直方图来实现图像的二值化。
直方图的性质:
- 直方图反映了图像中的灰度分布规律。它描述每个灰度级具有的像元个数,但不包含这些像元在图像中的位置信息。
- 任何一幅特定的图像都有唯一的直方图与之对应,但不同的图像可以有相同的直方图。
- 如果一幅图像有两个不相连的区域组成,并且每个区域的直方图已知,则整幅图像的直方图是该两个区域的直方图之和。
答案
- 每幅图像都可做出其灰度直方图。
- 根据直方图的形态可以大致推断图像质量的好坏。由于图像包含有大量的像元,其像元灰度值的分布应符合概率统计分布规律。假定像元的灰度值是随机分布的,那么其直方图应该是正态分布。
- 图像的灰度值是离散变量,因此直方图表示的是离散的概率分布。若以各灰度级的像元数占总像元数的比例值为纵坐标轴做出图像的直方图,将直方图中各条形的最高点连成一条外轮廓线,纵坐标的比例值即为某灰度级出现的概率密度,轮廓线可近似看成图像相应的连续函数的概率分布曲线
SIFT/SURF的特征提取方法,是如何保持尺度不变性的?
问题解析
主要考察SIFT/SURF特征的理解,SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。
- 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯差分函数来识别潜在的对于尺度和旋转不变的关键点。
- 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
- 关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而保证了对于这些变换的不变性。
- 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度作为关键点的描述符,它允许比较大的局部形状的变形或光照变化。
SURF 算法,是SIFT算法的增强版,它的计算量小,运算速度快,提取的特征与SIFT几乎相同。
答案
SIFT/SURF特征:尺度不变特征转换,在空间尺度中寻找极值,提取位置,尺度、旋转不变量。流程是:尺度空间极值检测—>关键点定位—>关键点方向确定—>关键点描述