opencv学习十三 形态学操作----提取水平与垂直线

基本原理

  • 膨胀:假设有图像A和数据结构B,B的中心为锚点,B覆盖范围下最大的像素值替换锚点像素(像素值越大,图像越亮)
  • 腐蚀:最小的像素值替换锚点像素
  • 开操作:腐蚀+膨胀(背景是黑色)
  • 图像形态学操作时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作、得到想要的结果。

提取步骤

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

API

adaptiveThreshold() 自适应阈值化操作

  • 与第十五节link 基本阈值操作(固定阈值化操作)的区别在于,前者是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值,而后者是确定的一个阈值。
  • 基本定义
adaptiveThreshold(InputArray src, OutputArray dst,   
                 double maxValue, int adaptiveMethod,                 
                 int thresholdType, int blockSize, double C );

  • 参数说明:
    Mat src//输入的灰度图像
    Mat dst//输出的二值图像
    double maxvalue// 二值图像最大值(一般255)
    int adaptiveMethod// 自适应方法,可选择ADAPTIVE_THRESH_MEAN_C或者
    ADAPTIVE_THRESH_GAUSSIAN_C
    int thresholdType//阈值类型,可选择THRESH_BINARY或者THRESH_BINARY_INV两种。(即阈值二值化或阈值反二值化)。
    int blockSize//块大小,奇数
    double C//可以是正数,0,负数
  • 自适应方法(adaptiveMethod)说明:
    自适应阈值化方法为每一个像素点单独计算阈值
    ADAPTIVE_THRESH_MEAN_C:该像素点周围blockSizeblockSize区域内的像素求平均值,然后减去C。
    ADAPTIVE_THRESH_GAUSSIAN_C:该像素点周围blockSize
    blockSize区域内的像素根据高斯函数加权计算,然后减去常数C。

代码演示

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv)
{
 Mat src, dst, gray_image, binary_image, edst, ddst;
 src = imread("D:/vcprojects/hengshuxian.png");
 if (!src.data)
 {
  printf("could not load image...\n");
  return -1;
 }
 //转化成灰度图
 cvtColor(src, gray_image, COLOR_RGB2GRAY);
 //转化成二值图
 adaptiveThreshold(~gray_image, binary_image, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
 //定义结构元素
 Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
 //腐蚀
 erode(binary_image, edst, hline);
 //膨胀
 dilate(edst, ddst, hline);
 //按位取反
 bitwise_not(ddst, ddst);
 namedWindow("0", WINDOW_AUTOSIZE);
 imshow("0", src);
 namedWindow("1", WINDOW_AUTOSIZE);
 imshow("1", gray_image);
 namedWindow("2", WINDOW_AUTOSIZE);
 imshow("2", binary_image);
 namedWindow("output_iamge", WINDOW_AUTOSIZE);
 imshow("output_image", ddst);
 waitKey(0);
 return 0;
}

结果

彩色图
在这里插入图片描述
灰度图
在这里插入图片描述
二值图
在这里插入图片描述
提取横线
在这里插入图片描述

还可以应用于验证码去斜线

代码演示

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv)
{
 Mat src, dst, gray_image, binary_image,edst,ddst;
 src = imread("D:/vcprojects/chars.png");
 if (!src.data)
 {
  printf("could not load image...\n");
  return -1;
 }
 //转化成灰度图
  cvtColor(src, gray_image, COLOR_RGB2GRAY);
  //转化成二值图
 adaptiveThreshold(~gray_image, binary_image, 255,ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
 //定义结构元素
  Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1, -1));
  //腐蚀
  erode(binary_image, edst, kernel);
  //膨胀
  dilate(edst, ddst, kernel);
  //按位取反
  bitwise_not(ddst, ddst);
  namedWindow("1", WINDOW_AUTOSIZE);
  imshow("1", gray_image);
  namedWindow("2", WINDOW_AUTOSIZE);
  imshow("2", binary_image);
  namedWindow("output_iamge", WINDOW_AUTOSIZE);
  imshow("output_image", ddst);
  waitKey(0);
  return 0;
}

结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值