OpenCV——形态学操作的应用

提取水平与垂直线

原理方法

       图像形态学操作的时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出,通过使用两个基本的形态学操作——膨胀(dilate)和腐蚀(erode),使用不同的结构元素实现对输入图像的操作,得到想要的结果。(理解对比开操作和闭操作)
膨胀——输出的像素值是结果元素覆盖下输入图像的最大像素值
腐蚀——输出的像素值是结构元素覆盖下输入图像的最小像素值
 

提取步骤

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

相关API——转换为二值图像——adaptiveThreshold

adaptiveThreshold(
    Mat src,//输入的灰度图像
    Mat dest,//输入的二值图像
    double maxValue,//二值图像的最大值
    int adaptiveMethod,//自适应方法,只能其一
                       //ADAPTIVE_THRESE_MEAN_C
                       //ADAPTIVE_THRESH_GAUSSIAN_C
    int thresholdType,//阈值类型
    int blockSize,//块大小
    double C//常量C可以是正数,0,负数
)

有时为了让输出的图像显示更圆滑,可以使用blur函数进行图像的模糊操作

#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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DDsoup

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值