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

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

我有这么一张图:
OpenCV-C++-CUDA-06-形态学二值化操作_第1张图片
当我使用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;
}

而它的效果是这样:
OpenCV-C++-CUDA-06-形态学二值化操作_第2张图片
那么这个时候有一个方法,利用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;
}

结果:
OpenCV-C++-CUDA-06-形态学二值化操作_第3张图片
可以看到,阈值为153,而显示的二值化结果也是很好,所以,我们把阈值为153的输入到cuda版的threshold()中:

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

显示结果:
OpenCV-C++-CUDA-06-形态学二值化操作_第4张图片

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

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

结果:
OpenCV-C++-CUDA-06-形态学二值化操作_第5张图片

放上源代码:

#include
#include
#include

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

你可能感兴趣的:(OpenCv-C++学习记录,形态学,二值化,OpenCV,CUDA)