图像细化原理
作用:图像细化是将图像的线条从多像素宽度减少到单位像素宽度的过程,又被称为“骨架化”,删除像素点的标准:
通常情况下,我们使用二值化图像,我们在判断是否要删除某些像素点时,要进行两次判断。我们需要一个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;
}