一、形态学应用案例
开、闭运算、形态学梯度等原理:
相关函数:
morphologyEx(InputArray src, OutputArray dst, int op, lnputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar & borderValue = morphologyDefaultBordervalue())
op:形态学操作的类型标志。见下图:
iterations:处理的次数。
应用案例如下:
int main() {
//读取图片
Mat src = imread("图片1.png", IMREAD_GRAYSCALE);
if (src.empty())
{
printf("不能打开空图片");
return -1;
}
//二值化计算
threshold(src, src, 80, 255, THRESH_BINARY);
//构建5*5矩形结构元素
Mat kernel_keys = getStructuringElement(0, Size(5, 5));
Mat src_open, src_close, src_gradient, src_tophat, src_blackbat, src_hitmiss;
//开运算
morphologyEx(src, src_open, MORPH_OPEN, kernel_keys);
imshow("o", src_open);
//闭运算
morphologyEx(src, src_close, MORPH_CLOSE, kernel_keys);
imshow("c", src_close);
//梯度运算
morphologyEx(src, src_gradient, MORPH_CLOSE, kernel_keys);
imshow("g", src_gradient);
//顶帽运算
morphologyEx(src, src_tophat, MORPH_TOPHAT, kernel_keys);
imshow("t", src_tophat);
//黑帽运算
morphologyEx(src, src_blackbat, MORPH_BLACKHAT, kernel_keys);
imshow("b", src_blackbat);
//击中击不中运算
morphologyEx(src, src_hitmiss, MORPH_HITMISS, kernel_keys);
imshow("h", src_hitmiss);
waitKey(0);
return 0;
}
二、图像细化
图像细化原理:
图像细化是将图像的线条从多像素宽度减少到单位像素宽度的过程,又被称为“骨架化”。删除像素点的标准:
首先计算p1中八邻域像素值之和并满足下列几点要求:
1、首先判断p1像素点周围有多少黑色像素点(数值为0),若其满足大于等于二、小于等于六时,则满足第一个条件。
2、在八邻域像素点中,顺时针旋转,像素有多少次由黑变到白的形式。当其仅有一次时,则满足第二个条件。
3、p2p4p6=时,则满足第三个条件
4、p4p6p8=时,则满足第四个条件
第二次细化见上图右侧红框,这里就不再赘述。
相关函数:
thinning(InputArray src, OutputArray dst,int thinningType = THINNING_ZHANGSUEN)
src:输入图像,必须是CV_8U的单通道图像。
dst:输出图像,与输入图像具有相同的尺寸和数据类型。
thinningType:细化算法选择标志,可以选择的参数THINNING_ZHANGSUEN (简记为0)和THINNING_GUOHALL(简记为1)。
应用此函数之前需要对opencv的基础版本进行扩展,这里我们进行简单的记录。
在这里我们需要用到三个内容:
1、CMake 官方下载网址:https://cmake.org/download/
这里我们选择对应的版本,在这里我们安装的是3.4.16,因此我们这里安装的版本如下:
cmake的安装过程如下:
流程概括如下:
1、找到安装包,双击打开
2、打开界面,点击Next
3、勾选协议,点击Next
4、选择添加 CMake 到系统环境变量,勾选创建桌面图标(可选项),点击Next
5、选择安装路径(路径不能出现汉字,防止报错),点击Next
6、点击 Install 进行安装
7、进入安装界面,稍等片刻
8、安装结束,点击 Finish 完成安装
至此安装Cmake软件结束。除此之外我们还需要下载opencv基础版源码以及扩展版源码:
我们直接进入github,https://github.com/opencv/opencv:
点击红框位置,并下载对应版本的源码。
扩展包的链接如下:https://github.com/opencv/opencv_contrib。下载对应版本的源码。并将下载的源码解压,我这里存放的路径如下:
这里build是存放编译后的文件内容,opencv这一文件夹忽略。
然后我们打开cmake:
需要设置两个路径,第一个路径是我们opencv的根目录、一个是我们编译后的文件需要存放的文件夹,设置完成后我们点击configure开始编译,我这里编译还是比较顺利的,一步完成,完成后我们需要根据自己的需求勾选需要的选项内容。在这里我只设置了一些基础内容,勾选了BUILD_opencv_world、OPENCV_ENABLE_NONFREE,以及设置了OPENCV_ EXTRA MODULES PATH的路径:
设置完成之后我们就可以开始再次编译了,编译完成之后如果没有报错就可以点击Generate生成编译文件了。生成之后我们点击Open_Project使用VS017进行编译,进入到VS2017之后我们选择生成-批生成-勾选对应的选项进行编译。至此我们就可以使用扩展包了。以前安装过opencv基础版的同学,记住要在使用之前将环境变量更换为重新编译之后的路径。
图像细化函数的应用实例:
int main() {
//读取图片
Mat src = imread("图片1.png", IMREAD_GRAYSCALE);
if (src.empty())
{
printf("不能打开空图片");
return -1;
}
//创建黑色背景
Mat back = Mat::zeros(100, 200, CV_8UC1);
//添加文字
putText(back, "qwe", Point(30, 30), 2, 1, Scalar(255), 2);
//添加实心圆
circle(back, Point(80, 75), 10, Scalar(255), -1);
//添加圆环
circle(back, Point(80, 75), 10, Scalar(255), 3);
//开始细化
Mat thin1, thin2;
ximgproc::thinning(src, thin1, 0);
ximgproc::thinning(back, thin2, 0);
imshow("q", thin1);
imshow("w", thin2);
waitKey(0);
return 0;
}