构造结构元素
代码示例
A = imread('broken_text.tif');
B = [0 1 0;1 1 1;0 1 0];
A2 = imdilate(A,B); % 膨胀处理
subplot(1,2,1);imshow(A);title('原图像');
subplot(1,2,2);imshow(A2);title('膨胀处理');
运行结果
代码示例
A = imread('wirebond_mask.tif');
se1 = strel('disk',5); % 圆盘腐蚀
A1 = imerode(A,se1); % 腐蚀5次
se2 = strel('disk',10);
A2 = imerode(A,se2); % 腐蚀10次
se3 = strel('disk',20);
A3 = imerode(A,se3); % 腐蚀20次
subplot(2,2,1);imshow(A);title('原图像');
subplot(2,2,2);imshow(A1);title('腐蚀5次');
subplot(2,2,3);imshow(A2);title('腐蚀10次');
subplot(2,2,4);imshow(A3);title('腐蚀20次');
运行结果
代码示例
f1 = imread('shapes.tif');
se1 = strel('square',20);
fo1 = imopen(f1,se1);
fc1 = imclose(f1,se1);
foc1 = imclose(fo1,se1);
subplot(2,4,1);imshow(f1);title('简单图形');
subplot(2,4,2);imshow(fo1);title('开运算'); % 去除突出部分及齿状边缘
subplot(2,4,3);imshow(fc1);title('闭运算');
subplot(2,4,4);imshow(foc1);title('先开再闭'); % 有效平滑去噪
f2 = imread('fingerprint.tif');
se2 = strel('square',3);
fo2 = imopen(f2,se2);
fc2 = imclose(f2,se2);
foc2 = imclose(fo2,se2);
subplot(2,4,5);imshow(f2);title('指纹图形');
subplot(2,4,6);imshow(fo2);title('开运算'); % 消除了杂散点,但引入了缺口
subplot(2,4,7);imshow(fc2);title('闭运算');
subplot(2,4,8);imshow(foc2);title('先开再闭'); % 连接缺口,填充
运行结果
代码示例
f = imread('small_squares.tif');
B1 = strel([0 0 0;0 1 1;0 1 0]); % 击中
B2 = strel([1 1 1;1 0 0;1 0 0]); % 击不中
g = bwhitmiss(f,B1,B2); % 击中或击不中变换
subplot(1,2,1);imshow(f);title('原图像');
subplot(1,2,2);imshow(g);title('击中或击不中变换');
运行结果
查找表(击中或击不中变换)
代码示例
f = imread('bone-skel.tif');
g = endpoints(f);
subplot(1,2,1);imshow(f);title('原图像');
subplot(1,2,2);imshow(g);title('查找表输出');
%-------------------------------------------------------------------%
function g = endpoints(f)
% 端点检测函数
persistent lut
if isempty(lut)
lut = makelut(@endpoint_fcn, 3);
end
g = applylut(f,lut);
%-------------------------------------------------------------------%
function is_end_point = endpoint_fcn(nhood)
% Determines if a pixel is an end point.
% IS_END_POINT = ENDPOINT_FCN(NHOOD) accepts a 3-by-3 binary
% neighborhood, NHOOD, and returns a 1 if the center element is an
% end point; otherwise it returns a 0.
is_end_point = nhood(2,2) & (sum(nhood(:)) == 2);
运行结果
开运算重构
代码示例
f = imread('book_text.tif');
fe = imerode(f,ones(51,1)); % 腐蚀
fo = imopen(f,ones(51,1)); % 开运算
fobr = imreconstruct(fe,f); % fe标记,f掩模
subplot(2,2,1);imshow(f);title('原图像');
subplot(2,2,2);imshow(fe);title('腐蚀');
subplot(2,2,3);imshow(fo);title('开运算');
subplot(2,2,4);imshow(fobr);title('开运算重构');
运行结果
使用重构删除复杂图像的背景
代码示例
f = imread('calculator.tif'); % 目的是突显出键盘上的文字
f_obr = imreconstruct(imerode(f,ones(1,71)),f); % 开运算重构,消除每个键上方的水平反射光
f_o = imopen(f,ones(1,71)); % 标准开运算(用于比较)
f_thr = imsubtract(f,f_obr); % 顶帽重构,从原图像中减去开运算重构的结果
f_th = imsubtract(f,f_o); % 标准顶帽运算(用于比较)
g_obr = imreconstruct(imerode(f_thr,ones(1,11)),f_thr); % 消除键右侧的垂直反射光,信息误消
g_obrd = imdilate(g_obr,ones(1,21));
f2 = imreconstruct(min(g_obrd,f_thr),f_thr); % 重构
subplot(4,2,1);imshow(f);title('原图像');
subplot(4,2,3);imshow(f_obr);title('消除键上方的水平反射光');
subplot(4,2,4);imshow(f_o);title('标准开运算');
subplot(4,2,5);imshow(f_thr);title('顶帽重构');
subplot(4,2,6);imshow(f_th);title('标准顶帽运算');
subplot(4,2,7);imshow(g_obrd);title('消除键右侧的垂直反射光');
subplot(4,2,8);imshow(f2);title('最后的重构结果');
运行结果