使用C++实现zhang细化算法代码
时间: 2023-12-31 09:15:03 浏览: 48
以下是一个使用C++实现Zhang-Suen细化算法的示例代码:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
// 实现张细化算法
void ZhangSuenThin(Mat& img) {
Mat temp;
int k = 0; // 迭代次数
do {
img.copyTo(temp);
for (int i = 1; i < img.rows - 1; i++) {
for (int j = 1; j < img.cols - 1; j++) {
// 如果该点是黑色点
if (img.at<uchar>(i, j) == 0) {
// 计算周围8个像素的值
int p2 = img.at<uchar>(i - 1, j);
int p3 = img.at<uchar>(i - 1, j + 1);
int p4 = img.at<uchar>(i, j + 1);
int p5 = img.at<uchar>(i + 1, j + 1);
int p6 = img.at<uchar>(i + 1, j);
int p7 = img.at<uchar>(i + 1, j - 1);
int p8 = img.at<uchar>(i, j - 1);
int p9 = img.at<uchar>(i - 1, j - 1);
// 计算p2-p9的个数
int A = (!p2 && p3) + (!p3 && p4) + (!p4 && p5) + (!p5 && p6) +
(!p6 && p7) + (!p7 && p8) + (!p8 && p9) + (!p9 && p2);
// 计算p2-p9的转换次数
int B = p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9;
int m1 = (p2 * p4 * p6) == 0;
int m2 = (p4 * p6 * p8) == 0;
// 满足第一步细化条件
if (A == 1 && (B >= 2 && B <= 6) && m1 && m2) {
temp.at<uchar>(i, j) = 255;
}
}
}
}
img.copyTo(temp);
for (int i = 1; i < img.rows - 1; i++) {
for (int j = 1; j < img.cols - 1; j++) {
// 如果该点是黑色点
if (img.at<uchar>(i, j) == 0) {
// 计算周围8个像素的值
int p2 = img.at<uchar>(i - 1, j);
int p3 = img.at<uchar>(i - 1, j + 1);
int p4 = img.at<uchar>(i, j + 1);
int p5 = img.at<uchar>(i + 1, j + 1);
int p6 = img.at<uchar>(i + 1, j);
int p7 = img.at<uchar>(i + 1, j - 1);
int p8 = img.at<uchar>(i, j - 1);
int p9 = img.at<uchar>(i - 1, j - 1);
// 计算p2-p9的个数
int A = (!p2 && p3) + (!p3 && p4) + (!p4 && p5) + (!p5 && p6) +
(!p6 && p7) + (!p7 && p8) + (!p8 && p9) + (!p9 && p2);
// 计算p2-p9的转换次数
int B = p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9;
int m1 = (p2 * p4 * p8) == 0;
int m2 = (p2 * p6 * p8) == 0;
// 满足第二步细化条件
if (A == 1 && (B >= 2 && B <= 6) && m1 && m2) {
temp.at<uchar>(i, j) = 255;
}
}
}
}
temp.copyTo(img);
} while (k++ < 100); // 最多迭代100次
}
int main() {
Mat img = imread("test.png", 0); // 读入二值图像
imshow("original", img);
ZhangSuenThin(img); // 细化图像
imshow("thinned", img);
waitKey(0);
return 0;
}
```
需要说明的是,该代码中的ZhangSuenThin函数实现了张细化算法,并将细化后的图像保存在img中。最后,将原图像和细化后的图像显示在屏幕上。