在形态学中,可以利用顶帽变换和底帽变换加上二值化阈值,来进行图像的分割。
图像相减与开操作和闭操作相结合,可产生所谓的顶帽变换和底帽变换。 灰度级图像 f 的顶帽变换定义为 f 减去其开操作。
T h a t ( f ) = f − ( f o b ) T_{hat}(f) = f - (f o b) That(f)=f−(fob)
灰度级图像f的底帽变换定义为其闭操作减去f。
B h a t ( f ) = ( f ⋅ b ) − f B_{hat}(f) = (f · b) - f Bhat(f)=(f⋅b)−f
这些变换的主要应用之一是:用一个结构元通过开操作或闭操作从一幅图像中删除物体; 然后,差操作得到一幅仅保留已删除分量的图像。
顶帽变换用于暗背景上的亮物体,而底帽变换则用于相反的情况。由于这一原因,这些变换又称为白顶帽变换和黑底帽变换。
顶帽变换的一个重要用途是校正不均匀光照的影响。合适(均匀)的光照在从背景中提取目标的处理中扮演核心的角色。
首先使用开操作,得到平滑后的图像,之后利用差值(即顶帽变换)得到光照矫正后的图像。将这张图像和原图像分别找到最合适的光照阈值,对图像分割后的图像进行对比分析。
主函数:
%% 运行 main_hat.m
clc;
clear;
close all;
%% 课本图 9.40
% 读取图片
im = imread('rice_image_with_intensity_gradient.tif'); % 原始图像 uint8
im1 = im2bw(im,0.53);
[im2,im3] = T_hat(im);
im4 = im2bw(im3,0.39);
%% 将结果保存到当前目录下的result文件夹下
imwrite(im1, sprintf('result/%s.jpg','2_im1'));
imwrite(im2, sprintf('result/%s.jpg','2_im2'));
imwrite(im3, sprintf('result/%s.jpg','2_im3'));
imwrite(im4, sprintf('result/%s.jpg','2_im4'));
%% 显示结果
subplot(221); imshow(im); title('图像'); axis on
subplot(222); imshow(im1); title('阈值图像'); axis on
subplot(234); imshow(im2); title('开操作图像'); axis on
subplot(235); imshow(im3); title('顶帽图像'); axis on
subplot(236); imshow(im4); title('阈值图像'); axis on
功能函数:
function [im_P,im_T]= T_hat(im)
%% 求出B
B = zeros(40,40);
for k = -40:1:40
for l = -40:1:40
if(k^2+l^2<=1600)
B(l+41,k+41) = 1;
else
B(l+41,k+41) = 0;
end
end
end
%% 腐蚀
im_F = my_imerode(im,B);
%% 膨胀
im_P = my_imdilate(im_F,B);
%% 得出结果
im_T = double(im) - im_P;
im_P = uint8(im_P);
im_T = uint8(255*mat2gray(im_T));
end
my_imdilate这个函数在前面的I中已经介绍了,这里不再给出。
function im_e = my_imerode(im,B)
% 以B的结构元进行腐蚀
%% 得到图像尺寸
[M,N] = size(im);
im_f = double(im);
%% 得到B的尺度
[m,n] = size(B);
m_2 = floor((m+1)/2);
n_2 = floor((n+1)/2);
%% 图像延拓
im_f = [im_f(:,n-1:-1:1),im_f,im_f(:,N:-1:N-n+2)];
im_f = [im_f(m-1:-1:1,:);im_f;im_f(M:-1:M-m+2,:)];
im_f = double(im_f);
%% 图像腐蚀
im_e = zeros(M,N);
for i = 1:M
for j = 1:N
im_sub = im_f(i+m_2-1:i+m_2+m-2,j+n_2-1:j+n_2+n-2);
C = im_sub.*B + 255*(1-B);
im_e(i,j) = min(C(:));
end
end
%im_e = logical(im_e);
end
图一是一幅大小为 600*600 的米粒图像,在非均匀光照下得到的。由于非均匀光照的干扰,导致无法直接选取阈值来进行很好的图像分割。
因此首先对原图像,使用半径为 40 的圆形结构元进行开操作。这个结构元足够大,大到不会拟合任何物体,这样就可以仅仅保留下一个图像的背景。
将原图像减去上面计算出的背景图像,这样图片的亮暗之间不再存在极端的差别,这时候再取最优的阈值进行图像分割,这时可以得到最好的图像分割实验结果。