灰度图形态学运算知识点总结 gray-scale morphology

这里写图片描述

一般, 结构元素B是flat.

1. 腐蚀

f以正无穷大扩边, 选取B覆盖f区域中的最小值.

2. 膨胀

f以负无穷大扩边, 选取B覆盖f区域中的最大值.

3. 开运算

先腐蚀后膨胀.
开运算会抑制小size的白点(高灰度对象).

4. 闭运算

先膨胀后腐蚀.
闭运算会填充小size的黑洞(低灰度对象).

5. 腐蚀,膨胀,开,闭的一维仿真

四种运算的仿真代码:

%% 灰度图形态学运算
clc;close all;clear;
x=1:600;
y=2*sin(0.01*x)+sin(0.02*x)+sin(0.04*x);
SELen=51; % odd number
SE=ones(1,SELen);
%% 腐蚀运算 
y_erosion=nan(size(y));
for i=1:length(y)
    h=max(1,i-floor(SELen/2));
    t=min(length(y),i+floor(SELen/2));
    y_erosion(i)=min(y(h:t));
end
%% 膨胀
y_dilation=nan(size(y));
for i=1:length(y)
    h=max(1,i-floor(SELen/2));
    t=min(length(y),i+floor(SELen/2));
    y_dilation(i)=max(y(h:t));
end
%% 开运算
y_open=y_erosion; % 先腐蚀后膨胀
for i=1:length(y_erosion)
    h=max(1,i-floor(SELen/2));
    t=min(length(y_erosion),i+floor(SELen/2));
    y_open(i)=max(y_erosion(h:t));
end
%% 闭运算
y_close=y_dilation; % 先膨胀后腐蚀
for i=1:length(y_dilation)
    h=max(1,i-floor(SELen/2));
    t=min(length(y_dilation),i+floor(SELen/2));
    y_close(i)=min(y_dilation(h:t));
end
figure;plot(x,y,'r-',x,y_erosion,'g-',x,y_dilation,'b-');
xlabel('点序号');ylabel('灰度值');legend('原曲线','腐蚀','膨胀');
figure;plot(x,y_open,'r-',x,y_close,'b-');
xlabel('点序号');ylabel('灰度值');
legend('开','闭');

输出:
这里写图片描述

这里写图片描述
注意: 闭运算曲线开头处, 是一段水平线, 没有和原曲线重合. 和DIP书中不一致.

使用Matlab的内置函数验证一下:

%% 内置灰度形态运算
clc;close all;clear;
x=1:600;
y=2*sin(0.01*x)+sin(0.02*x)+sin(0.04*x);

SELen=51; % odd number
SE = strel('line', 50, 0);
%% imerode imdilate
y_imerode=imerode(y,SE);
y_imdilate=imdilate(y,SE);
%% imclose 闭运算
y_imclose = imclose(y,SE);
%% imopen 开运算
y_imopen=imopen(y,SE);
%% plot
figure;plot(x,y,'r-',x,y_imerode,'g-',x,y_imdilate,'b-');
xlabel('点序号');ylabel('灰度值');legend('原曲线','imerode','imdilate');
figure;plot(x,y_imopen,'r-',x,y_imclose,'b-');
legend('imopen','imclose');

结果和上面的完全一致.

6. 形态学平滑

a. 对于噪声灰度高于背景灰度的情形, 先开后闭. 因为开运算会抑制小size的白点(高灰度对象). 或者连续地先开后闭运算, SE逐渐增大.
b. 对于噪声灰度低于背景灰度的情形, 先闭后开. 因为闭运算会填充小size的黑洞(低灰度对象).也可以连续操作.

7. 形态学梯度

膨胀减去腐蚀.

8. top-hat

原图减去开运算

9. bottom-hat

闭运算减去原图.
top-hat和bottom-hat 可以用于移除背景, 校正不均匀光照.
可以作为分割的前处理.

10. 粒度分析 Granulometry

统计相同形状不同size的粒子位置和数量.
a. 先做形态平滑.
b. 使用逐渐增大的SE做opening.
c. 不同尺度SE的opening结果求差分.
d. 差分曲线有较大尖峰的地方就是提取的相应size的粒子.

11. 文本分割 Textual Segment

和粒度分析类似.
a. 先用闭运算把较小的黑洞填平. SE大小要合适.
b. 使用开运算把较大黑洞连成一片. 形成了界限分明的两个区域.
c. 使用形态梯度算法提取边界.

12. 形态学重建

形态学重建运算比简单的形态学运算好的地方在于:
a. 对背景的提取较为完整干净.
b. 对前景(对象)的保留较为完整.

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是对个人生活照进行缩放、旋转和插值运算的 Python 代码: ```python import cv2 # 读取图像 img = cv2.imread('personal_photo.jpg') # 缩放图像 scale_percent = 50 # 缩放比例为 50% width = int(img.shape[1] * scale_percent / 100) height = int(img.shape[0] * scale_percent / 100) dim = (width, height) resized = cv2.resize(img, dim, interpolation=cv2.INTER_LINEAR) # 旋转图像 angle = 45 # 旋转角度为 45 度 M = cv2.getRotationMatrix2D((width / 2, height / 2), angle, 1) rotated = cv2.warpAffine(resized, M, (width, height)) # 显示图像 cv2.imshow('Original', img) cv2.imshow('Resized', resized) cv2.imshow('Rotated', rotated) cv2.waitKey(0) cv2.destroyAllWindows() ``` 其中,`cv2.resize()` 函数用于缩放图像,`cv2.getRotationMatrix2D()` 函数用于计算旋转矩阵,`cv2.warpAffine()` 函数用于应用旋转矩阵对图像进行旋转。 插值运算是一种用于图像缩放、旋转等操作的算法,用于计算目标像素的灰度值。常用的插值算法有最近邻插值、双线性插值和双三次插值等。其中,最近邻插值是一种简单的插值算法,它直接取最近的像素值作为目标像素的灰度值。双线性插值是一种更加精确的插值算法,它根据目标像素周围的四个像素值进行加权平均来计算目标像素的灰度值。双三次插值是一种更加复杂的插值算法,它根据目标像素周围的 16 个像素值进行加权平均来计算目标像素的灰度值。 插值算法的公式可以表示为: $$ f(x,y) = \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} w_{i,j}(x-x_i)(y-y_j) $$ 其中,$f(x,y)$ 表示目标像素的灰度值,$(x_i,y_j)$ 表示源像素的坐标,$w_{i,j}$ 表示权重。对于最近邻插值,$w_{i,j}$ 取值为 1 或 0;对于双线性插值,$w_{i,j}$ 取值为目标像素周围的四个像素的加权系数;对于双三次插值,$w_{i,j}$ 取值为目标像素周围的 16 个像素的加权系数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值