<LearnOpenCV(10) C++>形态学有啥用

形态学操作简例

利用简单实例了解形态学操作的玩具级应用。

二值图像

RGB2GRAY

cvtColor()格式转换
源图像转换为灰度图,目的是为了进一步自适应图像二值化。

Mat gray_src;
cvtColor(src, gray_src, COLOR_BGR2GRAY);

在这里插入图片描述

GRAY 2 BINARY

根据习惯调整灰度图像前景与背景:

imshow("~gray_src", ~gray_src);
imshow("gray_src", gray_src);

在这里插入图片描述

API
CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
                                     double maxValue, int adaptiveMethod,
                                     int thresholdType, int blockSize, double C );
  • src 输入图像
  • dst 输出图像
  • maxvalue 变换后的最大值
  • adaptiveMethod 自适应阈值算法 ADAPTIVE_THRESH_MEAN_C 和ADAPTIVE_THRESH_GAUSSIAN_C 分别对应邻域均值和邻域高斯加权值
  • thresholdType 邻域大小
  • blocksize 阈值算法常量,用于控制最终结果的偏移量 详看自适应阈值化操作:adaptiveThreshold()函数
Mat binimg;
adaptiveThreshold(~gray_src, binimg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);

在这里插入图片描述

形态学操作

定义一个横长条,对图像进行开操作(先腐蚀后膨胀),可以得到二值图像中对应图像的轮廓。

	Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 5, 1), Point(-1, -1));//定义一个宽为src.cols / 5,高为1的长矩形
	Mat tmp;
	erode(binimg, tmp, hline);//复习腐蚀和膨胀api 没有选择直接调用morphologyEx()
	dilate(tmp, dst, hline);
	imshow("tmp", tmp);
	imshow("dst", dst);

在这里插入图片描述
或者一个纵长条

	Mat wline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 5), Point(-1, -1));
	Mat tmp;
	erode(binimg, tmp, wline);
	dilate(tmp, dst, wline);
	imshow("tmp", tmp);
	imshow("dst", dst);

在这里插入图片描述

亦可以是别的

在这里插入图片描述

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;
Mat src, dst;

int main() {
	src = imread("5.jpg");
	if (!src.data)
	{
		printf("Wrong with Loading img!\n");
		return -1;
	}

	Mat gray_src;
	cvtColor(src, gray_src, COLOR_BGR2GRAY);

	Mat binimg;
	adaptiveThreshold(~gray_src, binimg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
	Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 5, 1), Point(-1, -1));
	Mat wline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 5), Point(-1, -1));
	Mat kernel = getStructuringElement(MORPH_RECT, Size(5	, 5), Point(-1, -1));//定义一个正方形的结构

	Mat tmp;
	erode(binimg, tmp, kernel);
	dilate(tmp, dst, kernel);
	blur(dst, dst, Size(3, 3), Size(-1, -1));//均值滤波 更圆润
	bitwise_not(dst, dst);//等价于~dst 第一次用:https://blog.csdn.net/m0_56838271/article/details/127140543?spm=1001.2014.3001.5502
	imshow("input", src);
	imshow("dst", dst);
	waitKey(0);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wdmcs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值