文章目录
图像处理基础
是否了解一些图像降噪的方法?
图像降噪指的是减少数字图像中噪声的过程,也叫作图像去噪。
椒盐噪声:在图像中随机出现黑色或者白色的点
高斯噪声:是一种连续的随机噪声,符合高斯分布(正态分布),高斯噪声会使像素值随机变化而导致图像模糊。
常见的降噪方法有:中值滤波、高斯滤波、双边滤波
中值滤波:一般序列中一点的值用该点的一个领域中各点值的中值代换。比如橙色点的值的中值对蓝色点进行替换。使用cv2.medianBlur()函数实现,最适合用来去除胡椒噪音
高斯滤波:线性平滑的滤波器,原理是对图像进行加权平均,使得每个像素点的值都变成周围像素的平均值。比如上图蓝色点的值应该是所有橙色点像素的平均值。使用cv2.GaussianBlur()实现,最适合用来去除高斯噪音
双边滤波:非线性滤波器,原理是在高斯噪声的基础上加上灰度权值和灰度权值。如下图所示:双边滤波会不处理边界信息,但是会把上方以及下方抹平。使用cv2.bilateralFilter()实现
为了消除图像外的噪点,也可以使用开运算,即先腐蚀后膨胀。
消除图像内的噪声,可以使用闭运算,即先膨胀后腐蚀。
是否了解图像增强的一些方法?
这里强烈推荐一个python库,用于图像增强的imgaug.
常见的图像增强方法一般可以分为:位置大小变化、噪声或者更改明亮度
-
仿射变换:在几何中,对一个向量空间进行一次线性变换并接上一个平移操作,使得变为另外一个向量空间。【也就是一些缩放旋转平移等操作】
一般包括平移、旋转、缩放、错切等,使用如下api
from imgaug import auguments as iaa iaa.Affine()
-
模糊,加噪
模糊一般可以分为高斯模糊、均值模糊、中值模糊等
# 高斯模糊 sigma表示高斯变换标准差 0 不扰动 强扰动 seq = iaa.GaussianBlur(sigma=(0, 7.0), name=None, deterministic="deprecated", random_state=None) #均值模糊:从最临近像素中取均值来扰动 # k窗口大小 seq = iaa.AverageBlur(k=(1, 9), name=None, deterministic="deprecated", random_state=None) # 中值模糊 通过最近邻中位数来扰动 seq = iaa.MedianBlur(k=(1, 9), name=None, deterministic="deprecated", random_state=None)
噪声的话常见的是加高斯噪声
seq = iaa.AdditiveGaussianNoise(loc=0, scale=0, per_channel=False, name=None, deterministic="deprecated", random_state=None)
-
裁剪或者填充类
# 填充图像的边缘 seq = iaa.Pad(percent=(0, 0.1)) # 裁剪图像 seq = iaa.Crop(percent=(0, 0.1))
是否了解各种边缘检测算子
-
sober算子:抗噪音比较强【sober卷积核参数如果是-1,就变为沙尔算子】
cv2.Sober(src,ddepth[位深],dx,dy,ksize=3) ddpth 位深: cv2.CV_64F or cv2.CV_32F dx =1 则对x方向求导 dy =1 则对y方向求导 ksize卷积核大小
-
Scharr算子:卷积核不可改变,能够检测出更细的特征
类似索贝尔算子,只不过kernel值不同,只能够求x或者y的边缘
cv2.Scharr(src,ddepth,dx,dy)
-
拉普拉斯算子:能够同时对X,Y轴检测,对噪音敏感,一般需要先降噪然后再调用拉普拉斯
cv2.Laplacian(img,ddepth,ksize,scale=1,...)
-
Canny算子,能够得到比较细致的边缘,同时也对噪音不敏感
canny算子的原理有以下四步:
- 使用5X5高斯滤波消除噪音
- 计算图像梯度的方向(0/45/90/135)
- 取局部最大值【取出四个方向的梯度最大值】
- 阈值计算【如果低于minVal或者高于maxVal则丢弃】
Canny(img,minVal,maxVal)
了解Hog吗?Hog特征的原理是什么?步骤流程呢?
方向梯度直方图(HOG)特征是一种进行物体检测特征的描述子,它通过计算和统计图像的局部区域的梯度直方图来构成特征。
原理:局部物体的表象和形状能够被梯度或者边缘的方向密度分布很好地描述。【说人话就是图像中的物体轮廓的梯度或者方向密度是和其他地方不同的,使用HOG就能够发现这些不同的梯度】
实现方法:(如果有一个image中含有你要检测的目标):
- 对图像灰度化
- 采用Gamma校正法对输入图像进行颜色空间的标准化。【降低对比度、降低局部阴影和光照影响】
- 计算图像每个像素梯度【为了捕获轮廓信息】
- 将图像划分为小cell
- 统计cell的梯度直方图(不同梯度的个数),即可形成cell的descriptor
- 将每几个cell组成一个block,将一个block内所有的cell特征descriptor串联起来得到hog特征的descriptor
- 将图像image内的所有block的HOG特征descriptor串起来就能够得到你需要检测目标的descriptor了
知道图像里面的插值算法有哪些吗?
这里参考博客:线性插值,双线性插值Bilinear Interpolation算法_大饼博士X的博客-CSDN博客
平常的图像缩放和放大都是通过插值算法来实现的,比如opencv中的resize就是如此!
通常的插值算法通常有最近邻插值
、双线性插值
,三次样条插值
-
最近邻插值
将目标图像中的点对应到原图像中,找到最相邻的证书坐标点的像素值作为该点的像素值
速度快,简单,但是效果最差,会出现马赛克
比如下面这个例子:
计算公式: h ( x , y ) = f ( X d s t ∗ s r c w i d t h d s t w e i g h t , Y d s t ∗ s r c h e i g h t d s t h e i g h t ) h(x,y)=f(\frac {X_{dst}*{src}_{width}}{dst_{weight}},\frac {Y_{dst}*{src}_{height}}{dst_{height}}) h(x,y)=f(dstweightXdst∗srcwidth,dstheightYdst∗srcheight),其中 h ( x , y ) h(x,y) h(x,y)代表的是目标图像的坐标, f ( x , y ) f(x,y) f(x,y)代表的是原图像, X d s t X_{dst} Xdst代表的是宽增大多少倍,这里2x2->4x4变了4倍
因此: h ( 3 , 0 ) = f ( 2 ∗ 2 / 4 , 0 ) = f ( 1 , 0 ) = 3 h(3,0)=f(2*2/4, 0)=f(1,0)=3 h(3,0)=f(2∗2/4,0)=f(1,0)=3
2.双线性插值
要了解双线性插值,那么就需要了解线性插值。
线性插值就是,先确定两个像素点,然后通过这两个像素点求出这两个像素点之间的点。形如这样的函数: f ( x ) = a 1 x + a 0 f(x)=a_1x+a_0 f(x)=a1x+a0,是不是已知这条线上的两个点之后能够求出这个直线上的任何一个点。
线性插值多项式:
而双线性插值就是线性插值在二维时的推广,本质上可以理解成在两个方向上做线性插值。
如下图所示:
如果我们想要确定未知点 p ( x , y ) p(x,y) p(x,y)的点,并且 A ( x 0 , y 0 ) , B ( x 1 , y 1 ) , C ( x 2 , y 2 ) , D ( x 3 , y 3 ) A(x_0,y_0),B(x_1,y_1),C(x_2,y_2),D(x_3,y_3) A(x0,y0),B(x1,y1),C(x2,y2),D(x3,y3)已经已知。常见的做法就是先在x方向做线性插值。
然后在 y y y方向上进行线性插值:
综合起来就是如下:
我们只要了解双线性插值就是在x方向做两次线性插值,在y方向上做一次线性插值就行了
解释一下RAW图像和RGB图像的区别?
raw格式sensor的输出格式,是sensor将光信号转换为电信号时的电平高低的原始记录,没有经过处理的原始数据。raw数据在输出的时候使用一定的顺序的,主要有四种: GRBG, RGGB, BGGR, GBRG
rgb格式:即每一个像素由三原色R、G、B蓝色组成。