粗暴的骨架法
将形态学算法引入光条纹中心提取 单纯提取骨架导致精度不高;反复细化操作导致运算速度降低
上代码
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;
//-----------------------------------【全局变量声明部分】--------------------------------------
// 描述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_dstImage, g_midImage, g_grayImage, imgHSVMask;//原始图、中间图和效果图
int threshold_value = 60; //阈值
int size = 800; //面积因子
float start_time, end_time, sum_time; //处理时间
//-----------------------------------【全局函数声明部分】--------------------------------------
// 描述:全局函数声明
//-----------------------------------------------------------------------------------------------
void ThinSubiteration1(Mat& pSrc, Mat& pDst);
void ThinSubiteration2(Mat& pSrc, Mat& pDst);
void normalizeLetter(Mat& inputarray, Mat& outputarray);
void Line_reflect(Mat& inputarray, Mat& outputarray);
void Delete_smallregions(Mat& pSrc, Mat& pDst);
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main()
{
//载入原始图
g_srcImage = imread("C:\\Users\\Charm Luo\\Desktop\\Laser extraction\\opncv提取中心线\\train\\129.png"); //读取素材图
// 加载的图片的大小
cout << g_srcImage.size() << endl;
//记录开始处理的时间
start_time = getTickCount();
//显示灰度图
cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);
cout << g_grayImage.size() << endl;
imshow("【灰度图】", g_grayImage);
//二值化
threshold(g_grayImage, imgHSVMask, threshold_value, 255, THRESH_BINARY);
imshow("【二值化】", imgHSVMask);
g_midImage = Mat::zeros(imgHSVMask.size(), CV_8UC1); //绘制
//去除小面积区域
Delete_smallregions(imgHSVMask, g_midImage);
imshow("【目标图】", g_midImage);
imwrite("Target_image129.jpg", g_midImage);
//normalizeLetter显示效果图
normalizeLetter(g_midImage, g_dstImage);
imshow("【效果图】", g_dstImage);
//曲线映射到原图
/*threshold(g_grayImage, g_midImage, threshold_value, 255, THRESH_BINARY);
imshow("【二值化图】", g_midImage); */
Line_reflect(g_dstImage, g_midImage);
imshow("【映射图】", g_midImage);
imwrite("Reflect_image129.jpg", g_midImage);
//转换类型,保存skeleton图像
normalize(g_dstImage, g_midImage, 0, 255, NORM_MINMAX, CV_8U);
imwrite("Thinning_image129.jpg", g_midImage);
//计算运行时间
end_time = getTickCount();
// 算法所用时间
sum_time = (end_time - start_time) / getTickFrequency();
printf("%lf s", sum_time);
waitKey(0);
return 0;
}
void ThinSubiteration1(Mat& pSrc, Mat&a