opencv#40 图像细化

图像细化原理

作用:图像细化是将图像的线条从多像素宽度减少到单位像素宽度的过程,又被称为“骨架化”,删除像素点的标准:

opencv#40 图像细化_第1张图片

 通常情况下,我们使用二值化图像,我们在判断是否要删除某些像素点时,要进行两次判断。我们需要一个3*3的区域,也就是p1的八邻域范围内的数据,如果黑色的像素数目在2~6之间,则满足了其中的一个条件,在八邻域中,如果按照顺时针方向,有多少次由黑到白的形式?当且仅有1次时,就满足了删除p1点的第二个条件,第三四条件则是看三个像素的乘积是否为0,依次按照这四个条件遍历图像中的每一个非0像素,将满足这些条件的像素置为待删除的像素点,之后再集体将待删除点去除,然后继续第二次判断,与第一次类似。

相关函数

thinning()

void cv::ximgproc::thinning(InputArray    src,
                            OutputArray   dst,
                            int           thinningType = THINNING_ZHANGSUEN
                           )

·src:输入图像,必须是CV_8U单通道图像。通常使用二值化图像,灰度图像也可以。

·dst:输出图像,与输入图像具有相同的尺寸和数据类型。

·thinningType:细化算法选择标志,可以选择的参数为THINNING_ZHANGSUEN(简记为0)和THINNING_GUOHALL(简记为1)。

在之前的程序中我们使用的都是标准的opencv库,此函数需要opencv扩展库。

#include 
#include 
#include 

using namespace cv; //opencv的命名空间
using namespace std;



//主函数
int main()
{
	//中文字进行细化
	Mat img = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/ha.jpg");	
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	//英文字-实心圆和圆环细化
	Mat words = Mat::zeros(100, 200, CV_8UC1);//创建一个黑色的背景图
	putText(words, "Learn", Point(30, 30), 2, 1, Scalar(255), 2);//添加英文
	putText(words, "OpneCV 4",Point(30, 60), 2, 1, Scalar(255), 2);
	circle(words, Point(80, 75), 10, Scalar(255), -1);//添加实心圆
	circle(words, Point(130, 75), 10, Scalar(255), 3);//添加圆环
	
	Mat thin1, thin2;
	ximgproc::thinning(img, thin1, 0);//注意类名;
	ximgproc::thinning(words, thin2, 0);

	//显示处理结果
	imshow("thin1",thin1);
	imshow("img",img);
	imshow("thin2", thin2);
	imshow("words", words);
	waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出

	return 0;

}

你可能感兴趣的:(opencv,人工智能,计算机视觉)