opencv#40 图像细化

图像细化原理

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

 通常情况下,我们使用二值化图像,我们在判断是否要删除某些像素点时,要进行两次判断。我们需要一个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 <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/ximgproc.hpp>

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;

}

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值