形态学图像处理
0. 前言
参考博客:
opencv图像处理模块(6)——击中击不中 - 知乎 (zhihu.com)
第三版教材中图片下载地址: book images downloads
vs2019配置opencv可以查看:VS2019 & Opencv4.5.4配置教程
前情回顾:
数字图像处理第三章 灰度变换和空间滤波 学习笔记
数字图像处理第四章 频率域滤波 学习笔记
数字图像处理第五章 图像复原和重建(内容较简单,就没有详细记录笔记)
数字图像处理第六章 彩色图像处理
数字图像处理第七章 小波与多分辨率处理(内容困难,仅进行了简单记录)
数字图像处理第八章 图像压缩(目前非重点)
后续剧情:
数字图像处理第十章 图像分割 学习笔记
数字图像处理第11章 表示和描述 学习笔记
1. 腐蚀和膨胀
1.1 腐蚀
A ⊖ B = { z ∣ ( B ) z ∩ A c = ∅ } A\ominus B = \{z | (B)_{z} \cap A^{c} = \varnothing \} A⊖B={ z∣(B)z∩Ac=∅}
B不与A的补集的交集为空
1.2 膨胀
A ⊕ B = { z ∣ ( B ^ ) z ∩ A ≠ ∅ } A\oplus B=\left\{z\mid({\hat{B}})_{z}\cap A\neq\varnothing\right\} A⊕B={ z∣(B^)z∩A=∅}
A是被膨胀的集合, A和B至少有一个元素重合
1.3 对偶性
膨胀和腐蚀关于集合求补运算和反射运算是对偶的.
2. 开操作和闭操作
开操作: 平滑物体的轮廓, 断开较窄的狭颈并消除细的突出物.
闭操作: 弥合较窄的间断和细长的沟壑, 消除小的孔洞, 填补轮廓线中的断裂.
结构元B对集合A的开操作:
A ∘ B = ( A ⊖ B ) ⊕ B A\circ B=(A\ominus B)\oplus B A∘B=(A⊖B)⊕B
结构元B对集合A的闭操作:
A ∙ B = ( A ⊕ B ) ⊖ B A\bullet B=(A\oplus B)\ominus B A∙B=(A⊕B)⊖B
opencv有腐化函数erode()
和膨胀函数dilate()
Mat openOperationRes(Mat input, int size) {
Mat kernel = Mat::ones(Size(size, size), CV_8U);
//先腐化再膨胀
Mat eroded;
erode(input, eroded, kernel);
Mat opened;
dilate(eroded, opened, kernel);
return opened;
}
Mat closeOperationRes(Mat input, int size) {
Mat kernel = Mat::ones(Size(size, size), CV_8U);
//先膨胀再腐化
Mat dilated;
dilate(input, dilated, kernel);
Mat closed;
erode(dilated, closed, kernel);
return closed;
}
void test05(string path) {
Mat img = imread(path, IMREAD_GRAYSCALE);
if (img.empty()) {
cout << "Unable to load image\n";
return;
}
Mat kernel = Mat::ones(Size(3, 3), CV_8U);
//进行腐化操作
Mat eroded;
erode(img, eroded, kernel);
Mat opened = openOperationRes(img, 3);
Mat opened_closed = closeOperationRes(opened, 3);
imshow("original", img);
imshow("腐化后的结果", eroded);
imshow("开操作结果", opened);
imshow("开操作的闭操作结果", opened_closed);
waitKey(0);
}
3. 击中或不击中变换
形态学上的击中或不击中是形状检测中的一个基本工具。
A ⊛ B = ( A ⊖ B 1 ) ∩ ( A c ⊖ B 2 ) A\circledast B =(A\ominus B_1)\cap (A^c\ominus B_2) A⊛B=(A⊖B1)∩(A