空间域图像处理
以下为两幅相位相差 $180^{\circ}$ 的干涉图,其中第一幅相位为 $I_1=a+b\cos(\varphi)$,第二幅相位为 $I_2=a+b\cos(\varphi+\pi)$。确定中心低反射圆环(光纤)的中心坐标。
◎ 第一幅干涉图
◎ 第二幅干涉图
因为两幅图的干涉条纹相位相差 $180^{\circ}$,所以可以考虑将两幅图相加,从理论上讲,这样可以基本消除干涉条纹。
1
2
3
4
5
| a = imread('1.bmp');
b = imread('2.bmp');
pic1 = imlincomb(0.5,a,0.5,b);
imshow(pic1);
title('加法运算');
|
◎ 图像相加
可以看出干涉条纹基本消除。目前存在的问题是,还有部分条纹并没有完全消除,且圆环的颜色与背景的颜色相近。为了确定圆环的边界,需要先对图像进行二值化处理。
1
2
3
| pic2 = imbinarize(pic1,0.29);
imshow(pic2);
title('二值化');
|
◎ 二值化处理
经二值化处理后,可以明显分辨出圆的位置。且消除了上一幅图干涉条纹的影响。接下来进行边缘检测,这里使用的是 edge
函数和 Sobel 算子。因为在二值化后的图像中,圆的周围仍有部分杂散的黑色区域,会影响图像的识别结果,所以要对圆的所在区域进行截取。这里图像截取确定的坐标范围是 $x\in[280,460]$,$y\in[180,320]$。
1
2
3
4
5
6
7
| pic3 = edge(pic2,'sobel',0.2);
x1 = 280;
x2 = 460;
y1 = 180;
y2 = 320;
imshow(pic3(y1:y2,x1:x2));
title('Sobel 算子边缘检测');
|
◎ Sobel 算子边缘检测
◎ 截取后的图像
圆心位置确定的方法很简单,因为经过二值化处理和边缘检测后,只剩下圆的轮廓,轮廓为白色,表示为 $1$。只要找到一个点,该点到 $1$ 的距离为定值即可。
1
2
3
4
5
6
7
8
9
10
11
12
| pic4 = pic3(y1:y2,x1:x2);
[y,x] = find(pic4==1);
center_x = min(x)+(max(x)-min(x))/2;
center_y = min(y)+(max(y)-min(y))/2;
imshow(pic3);
hold on;
x0 = x1+center_x;
y0 = y1+center_y;
plot(x0,y0,'*r');
s = sprintf('(%.1f,%.1f)',x0,y0);
text(x0,y0,s,'Color','red');
title('标注中心坐标');
|
◎ 标注坐标
频率域图像处理
给定图像如下所示,消除图像中的周期性干扰。
◎ 带有周期性干扰的图像
首先绘制原图像的频域图,观察噪声分布,具体代码和频域图像如下所示。
1
2
3
4
5
| I = imread('1.bmp');
I2 = rgb2gray(I);
s = fftshift(fft2(I2));
I3 = log(abs(s));
imshow(I3,[]);
|
◎ 原图的频域图像
频域图像的高频部分有周期分布的噪声,考虑使用理想低通滤波器消除高频噪声干扰。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [a,b] = size(s);
a0 = round(a/2);
b0 = round(b/2);
d = 16;
for i = 1:a
for j = 1:b
distance = sqrt((i-a0)^2+(j-b0)^2);
if distance <= d
h = 1;
else
h = 0;
end
s(i,j) = h.*s(i,j);
end
end
s = uint8(real(ifft2(ifftshift(s))));
imshow(s)
|
◎ 经理想低通滤波器处理后的图像
由上图可以看出,经理想低通滤波器处理后,原图的周期噪声基本消除,但原图左上方的阴影等细节部分也有所丢失。滤波后的频域图像如下图所示。
◎ 滤波后的频域图像
综合练习
识别文字时拍到照片有下图所示的阴影,造成文字分割困难,尝试改善图像质量。
◎ 原图带有阴影,文字识别困难
首先使用同态滤波将原图阴影去除,代码如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| I1 = imread('img.png');
I2 = rgb2gray(I1); % 转为灰度图
f1 = fspecial('gaussian', [7 7], 0.25);
f2 = fspecial('gaussian', [7 7], 1.95);
F = f1-f2; %构建一个高通
J1 = log(1.0+double(I2)); %分开入射光和反射光
J2 = imfilter(J1, F, 'symmetric', 'conv'); % 将高通滤波器与对数转换之后的图像卷积
J3 = exp(J2)-1.0; % 变换回来
minJ = min(min(J3));
maxJ = max(max(J3));
J4 = (J3-minJ)/(maxJ-minJ); % 同态滤波
imshow(J4);
|
经同态滤波处理后的图像如下所示,可以看到阴影变得均匀。
◎ 经同态滤波处理后的图像
然后进行二值化处理即可。
1
| k = im2bw(J4, 0.462); % 二值化
|
◎ 二值化后的图像
本文内容源自浙江大学光电学院本科课程《机器视觉与图像处理》的课堂练习,图像处理的软件为 MATLAB,图像处理的方法只是个人的尝试,并非标准方法,因此仅供参考。