OpenCV-C++-CUDA-06-形态学二值化操作

        本章我们利用cuda加速实现形态学操作。

我有这么一张图:
在这里插入图片描述
当我使用cuda版的threshold()方法时:

int main(int argc, char** argv)
{
	Mat image = imread("F:/test/ABCDE.png",0);
	imshow("input image", image);
	cuda::GpuMat image_gpu, dst;
	image_gpu.upload(image);
	cuda::threshold(image_gpu, dst, 50, 255, THRESH_BINARY);
	Mat result;
	dst.download(result);
	imshow("result", result);
	waitKey(0);
	return 0;
}

而它的效果是这样:
在这里插入图片描述
那么这个时候有一个方法,利用cpu版的自动阈值化方法,求出阈值,然后输入到cuda版本中:

int main(int argc, char** argv)
{
	Mat image = imread("F:/test/ABCDE.png",0);
	imshow("input image", image);
	cuda::GpuMat image_gpu, dst;
	image_gpu.upload(image);
	double value=cv::threshold(image, image, 0, 255, THRESH_BINARY|THRESH_OTSU);
	cout << value << endl;
	//Mat result;
	//dst.download(result);
	imshow("result", image);
	waitKey(0);
	return 0;
}

结果:
在这里插入图片描述
可以看到,阈值为153,而显示的二值化结果也是很好,所以,我们把阈值为153的输入到cuda版的threshold()中:

cuda::threshold(image_gpu, dst, 153, 255, THRESH_BINARY);

显示结果:
在这里插入图片描述

那么,接下来使用形态学操作进行处理,去除图中线段和点:

Mat se = getStructuringElement(MORPH_RECT, Size(3, 3));
	auto morph_filter=cuda::createMorphologyFilter(MORPH_OPEN, dst.type(), se);
	morph_filter->apply(dst, dst);

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

放上源代码:

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat image = imread("F:/test/ABCDE.png",0);
	imshow("input image", image);
	cuda::GpuMat image_gpu, dst;
	image_gpu.upload(image);
	cuda::threshold(image_gpu, dst, 153, 255, THRESH_BINARY);
	cuda::bitwise_not(dst, dst);//取反
	//形态学操作
	Mat se = getStructuringElement(MORPH_RECT, Size(3, 3));
	auto morph_filter=cuda::createMorphologyFilter(MORPH_OPEN, dst.type(), se);
	morph_filter->apply(dst, dst);
	Mat result;
	dst.download(result);
	imshow("result", result);
	waitKey(0);
	return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值