本章我们利用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
#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;
}