形态学操作之提取水平与垂直直线

184 篇文章 110 订阅
88 篇文章 132 订阅

形态学操作之提取水平与垂直直线

检测原理

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

  1. 膨胀:输出的像素值是结构元素覆盖下输入图像的最大像素值;
  2. 腐蚀:输出的像素值是结构元素覆盖下输入图像的最小像素值。

二值图像与灰度图像上的膨胀操作

二值图像与灰度图像上的腐蚀操作

结构元素

上述膨胀与腐蚀过程可以使用任意的结构元素,常见的结构元素形状有:矩形、圆、直线、磁盘形状、砖石头、形状等各种自定义形状。

提取过程

  1. 输入彩色图像-imread
  2. 转换为灰度图像-cvtColor
  3. 转换为二值图像-adaptiveThreshold
  4. 定义结构元素
  5. 开操作(腐蚀+膨胀)提取水平与垂直直线

#include <opencv2\opencv.hpp>

#include <iostream>

 

using namespace std;

using namespace cv;

 

const char * input = "input image";

const char *output = "output image";

 

void main()

{

       Mat srcImg, grayImg, binImg, tempImg,resImg;

       srcImg = imread("chars.png");

       if (!srcImg.data)

       {

              cout << "error image data" << endl;

              return;

       }

       namedWindow(input, WINDOW_AUTOSIZE);

       imshow(input, srcImg);

 

       //convert to grayImg

       if (srcImg.channels() == 3)

       {

              cvtColor(srcImg, grayImg, CV_BGR2GRAY);

       }

       else

       {

              grayImg = srcImg;

       }

 

       //convert to  binaryImg

       adaptiveThreshold(~grayImg, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);

 

       //create struct element

       int xSize =binImg.cols/180 ;

       int ySzie = binImg.rows/180;

       Mat horizonLine = getStructuringElement(MORPH_RECT, Size(xSize, 1), Point(-1, -1));

       Mat verticalLine = getStructuringElement(MORPH_RECT, Size(1, ySzie), Point(-1, -1));

 

       //open operation, 提取水平直线

       //erode(binImg, tempImg, horizonLine);

       //dilate(tempImg, resImg, horizonLine);

       //morphologyEx(binImg, resImg, CV_MOP_OPEN, horizonLine); //morphologyEx==erode+dilate

 

       /*提取字符*/

       Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

       morphologyEx(binImg, resImg, CV_MOP_OPEN, kernel);

       bitwise_not(resImg, resImg);

       blur(resImg, resImg, Size(3, 3), Point(-1, -1));

       imshow(output, resImg);

 

       waitKey(0);

       return;

}

字符提取效果如图:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值