从牛客上找的面经
转自:牛客网
作者:雲水謡
链接:https://www.nowcoder.com/discuss/262804
来源:牛客网
OPPO-计算机视觉算法(sp)
一面:
大约40分钟吧,主要聊项目,问的问题不多。
- 针对项目问了一些问题,问的比较浅
- SIFT特征提取怎么做的,具备什么性质,为什么
- 高斯滤波,均值滤波,中值滤波
- 手写中值滤波
二面玄学:
差不多10-15分钟左右吧,直接开问,主要就简历上的东西快速问一下,基本没涉及具体技术的东西
三面HR:
20分钟左右吧。个人情况、家庭情况、待遇预期、遇到的困难、职业规划等等吧。。。
SIFT(尺度不变特征变换)
1.概念
该算法是一种用于图像处理领域的一种描述,这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。
2.SIFT特征提取的步骤
1.尺度空间极值检测:使用高斯模糊计算出所有的尺度的图像位置,尺度空间用高斯金字塔表示,使用高斯差分金字塔去检测尺度和旋转不变的兴趣点,也就是候选关键点。
2.关键点定位:在每个候选的位置上通过一个拟合模型确定位置和尺度,选择的依据是关键点是否稳定。
3.方向确定:为描述其旋转不变性,基于图像局部梯度方向分配给关键点一个或多个方向。
4.关键点的描述:在关键点周围领域内,在选定的尺度上测量图像局部梯度。每个关键点的描述包括位置、尺度、方向,使其不受外界变化而变化,比如光照、视角变化。
3.性质
1.SIFT是图像的局部特征,对于旋转、尺度保持不变性,对于光照、视角变化也有稳定性。
2.独特性好,适合在海量特征数据库中进行快速准确的匹配。
3.多量性,即使少量物体也能产生大量的特征向量。
4.高速性,优化后可达到实时匹配。
5.可扩展性,容易和其他特征联合。
4.缺点
1.实时性差,但可以通过优化解决。
2.有时特征点提取的少。
3.对于边缘光滑的物体不容易提取特征。
滤波
高斯滤波
1.含义:高斯滤波是对整幅图像加权平均的过程,每一个像素点的值都是根据本身及其领域内其他点的值加权平均后得到的。高斯平滑滤波器是个低通滤波器。
2.作用:是一种线性平滑滤波,用于减少高斯噪声。
3.性质:
(1)二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的.一般来说,一幅图像的边缘方向是事先不知道的,因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑.旋转对称性意味着高斯平滑滤波器在后续边缘检测中不会偏向任一方向.
(2)高斯函数是单值函数.这表明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的.这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真.
(3)高斯函数的傅立叶变换频谱是单瓣的.正如下面所示,这一性质是高斯函数付立叶变换等于高斯函数本身这一事实的直接推论.图像常被不希望的高频信号所污染(噪声和细纹理).而所希望的图像特征(如边缘),既含有低频分量,又含有高频分量.高斯函数付立叶变换的单瓣意味着平滑图像不会被不需要的高频信号所污染,同时保留了大部分所需信号.
(4)高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好.通过调节平滑程度参数σ,可在图像特征过分模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(欠平滑)之间取得折衷.
(5)由于高斯函数的可分离性,较大尺寸的高斯滤波器可以得以有效地实现.二维高斯函数卷积可以分两步来进行,首先将图像与一维高斯函数进行卷积,然后将卷积结果与方向垂直的相同一维高斯函数卷积.因此,二维高斯滤波的计算量随滤波模板宽度成线性增长而不是成平方增长.
4.matlab代码(调用)
clear,clc;
% 读取图像
Img = imread('t1.jpg');
M = size(Img);
if numel(M)>2
gray = rgb2gray(Img);
else
gray = Img;
end
% 创建滤波器
W = fspecial('gaussian',[5,5],1);
G = imfilter(gray, W, 'replicate');
figure(1);
subplot(121); imshow(gray); title('原始图像');
subplot(122); imshow(G); title('滤波后图像');
均值滤波
均值滤波的计算是中心点的像素值是核内点的平均值,均值滤波不能很好的保护图像的细节,使图像变得模糊,对去除噪声效果不好尤其是椒盐噪声。代码转自https://www.cnblogs.com/ninghechuan/p/9526100.html
%Mean Filter
clc;
clear all;
close all;
RGB_data = imread('lena.jpg');
R_data = RGB_data(:,:,1);
G_data = RGB_data(:,:,2);
B_data = RGB_data(:,:,3);
%imshow(RGB_data);
[ROW,COL, DIM] = size(RGB_data);
Y_data = zeros(ROW,COL);
Cb_data = zeros(ROW,COL);
Cr_data = zeros(ROW,COL);
Gray_data = RGB_data;
for r = 1:ROW
for c = 1:COL
Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;
Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;
end
end
Gray_data(:,:,1)=Y_data;
Gray_data(:,:,2)=Y_data;
Gray_data(:,:,3)=Y_data;
figure;
imshow(Gray_data);
%Gray Mean Filter
Gray_data = im2double(Gray_data);
imgn = imnoise(Gray_data,'salt & pepper',0.05);
%imgn = Gray_data;
figure;
imshow(imgn);
for r = 2:1:ROW-1
for c = 2:1:COL-1
Mean_Img(r,c) = (imgn(r-1, c-1) + imgn(r-1, c) + imgn(r-1, c+1) + imgn(r, c-1) + imgn(r, c) + imgn(r, c+1) + imgn(r+1, c-1) + imgn(r+1, c) + imgn(r+1, c+1)) / 9;
end
end
figure;
imshow(Mean_Img);
中值滤波
中值滤波就是对核内的值排序中值作为中心点的像素值。代码转自:https://blog.csdn.net/qq_43211132/article/details/87455793
x=imread('G:\matlab\1.jpg');%需要过滤的图像
n=3; %模板大小
[height, width]=size(x); %获取图像的尺寸(n小于图片的宽高)
figure;
imshow(x);%显示原图
% x = padarray(x,[3,3]); %对图像边缘进行填充
x = imnoise(x,'salt & pepper'); %加入椒盐噪声
figure;
imshow(x); %显示加入噪声后的图片
x1=double(x); %数据类型转换
x2=x1; %转换后的数据赋给x2
for i=1:height-n+1
for j=1:width-n+1
c=x1(i:i+(n-1),j:j+(n-1)); %在x1中从头取模板大小的块赋给c
e=c(1,:); %e中存放是c矩阵的第一行
for u=2:n %将c中的其他行元素取出来接在e后使e为一个行矩阵
e=[e,c(u,:)];
end
med=median(e); %取一行的中值
x2(i+(n-1)/2,j+(n-1)/2)=med; %将模板各元素的中值赋给模板中心位置的元素
end
end
d=uint8(x2); %未被赋值的元素取原值
figure;
imshow(d); %显示过滤图片
x0=rgb2gray(x); %灰度处理,灰度处理后的图像是二维矩阵
b=medfilt2(x0,[n,n]); %matlab中自带值滤波函数
figure;
imshow(b); %显示过滤后的灰度图片
本文地址:https://blog.csdn.net/weixin_42268280/article/details/107279343