C++ OpenCV形态学操作--提取水平和垂直线

原理方法

图像形态学操作时候,可以通过自定义的结构元素实惠结构元素对输入图像一些对象敏感,另外一些不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出,通过使用两个最基本的形态学操作--膨胀和腐蚀,使用不同的结构元素实现对输入图像的操作,得到想要的结果.

膨胀 , 输出的像素值是结构元素覆盖下输入图像的最大像素值

腐蚀 , 输出的图像值是结构元素覆盖下输入图像的最小像素值

提取方法

  • 输入图像彩色图像imread

  • 转换为灰度图像 -- cvtColor

  • 转换为二值图像 -- adaptiveThreshold

  • 定义结构元素

  • 开操作(腐蚀+膨胀)提取水平与垂直线

C++ OpenCV形态学操作--提取水平和垂直线_第1张图片

代码演示

新建一个项目opencv-0012,配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法.并加载我们常用的那个图片显示出来,这次我们加载的图像换了一张,因为原来的图像里面找不到水平和垂直的线,所以我们新换了一个图片

C++ OpenCV形态学操作--提取水平和垂直线_第2张图片

显示效果

C++ OpenCV形态学操作--提取水平和垂直线_第3张图片

根据上面写的提取方法顺序,我们写代码

1.先取灰度图像

C++ OpenCV形态学操作--提取水平和垂直线_第4张图片

显示效果

C++ OpenCV形态学操作--提取水平和垂直线_第5张图片

里面有个提示,当图像转为灰度或是二值图时,我们在Mat类型如果前面加上~就代表取反了,像刚才的代码里面我们显示的时候把dst前面加上~

C++ OpenCV形态学操作--提取水平和垂直线_第6张图片

显示效果如下:

C++ OpenCV形态学操作--提取水平和垂直线_第7张图片

2.转换为二值图像

把上面的灰度图像取反后我们再转换为二值图像

C++ OpenCV形态学操作--提取水平和垂直线_第8张图片

显示效果如下:

C++ OpenCV形态学操作--提取水平和垂直线_第9张图片

3.定义结构元素

    //定义横线结构元素
    cv::Mat hline = cv::getStructuringElement(cv::MORPH_RECT,
        cv::Size(src.cols / 5, 1), cv::Point(-1, -1));

其实 Size里面src.cols/5我们是带表宽度为原图的5分之一长,如果不够五分之一长度就过滤掉,1是高度,所以这样就是一个横线的元素

4.进行开操作

C++ OpenCV形态学操作--提取水平和垂直线_第10张图片

显示效果

C++ OpenCV形态学操作--提取水平和垂直线_第11张图片

可以看到只保留了长度为图像五分之一长的横线.

取垂直线

C++ OpenCV形态学操作--提取水平和垂直线_第12张图片

我们把刚才的代码改造一下,让垂直和水平都显示出来

垂直线取法就是在Size里面把后面的高度改为图像的五分之一

显示效果为

C++ OpenCV形态学操作--提取水平和垂直线_第13张图片


-END-

长按下方二维码关注

你可能感兴趣的:(c++,java,css,opencv,python)