Rosenfeld细化算法C++代码实现
时间: 2023-08-04 09:28:27 浏览: 57
以下是Rosenfeld细化算法的C++代码实现:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// 二值化图像
Mat BinaryImage(Mat srcImage)
{
Mat dstImage;
cvtColor(srcImage, dstImage, COLOR_BGR2GRAY);
threshold(dstImage, dstImage, 0, 255, THRESH_BINARY | THRESH_OTSU);
return dstImage;
}
// 判断像素是否在边界内
bool IsInnerBoundary(const Mat& img, int row, int col)
{
int count = 0;
if (img.at<uchar>(row, col) == 0) {
count += (img.at<uchar>(row - 1, col - 1) == 255 ? 1 : 0);
count += (img.at<uchar>(row - 1, col) == 255 ? 1 : 0);
count += (img.at<uchar>(row - 1, col + 1) == 255 ? 1 : 0);
count += (img.at<uchar>(row, col - 1) == 255 ? 1 : 0);
count += (img.at<uchar>(row, col + 1) == 255 ? 1 : 0);
count += (img.at<uchar>(row + 1, col - 1) == 255 ? 1 : 0);
count += (img.at<uchar>(row + 1, col) == 255 ? 1 : 0);
count += (img.at<uchar>(row + 1, col + 1) == 255 ? 1 : 0);
if (count == 1) {
return true;
}
}
return false;
}
// 函数功能:Rosenfeld细化算法
void RosenfeldThinning(Mat& srcImage)
{
int rows = srcImage.rows;
int cols = srcImage.cols;
bool isChanged = true;
while (isChanged) {
isChanged = false;
Mat tmpImage = srcImage.clone();
for (int i = 1; i < rows - 1; i++) {
for (int j = 1; j < cols - 1; j++) {
if (IsInnerBoundary(tmpImage, i, j)) {
srcImage.at<uchar>(i, j) = 255;
isChanged = true;
}
}
}
tmpImage = srcImage.clone();
for (int i = 1; i < rows - 1; i++) {
for (int j = 1; j < cols - 1; j++) {
if (IsInnerBoundary(tmpImage, i, j)) {
srcImage.at<uchar>(i, j) = 255;
isChanged = true;
}
}
}
}
}
int main()
{
Mat srcImage = imread("test.png"); // 读取测试图像
if (srcImage.empty()) {
cout << "can't open the image!" << endl;
return -1;
}
imshow("srcImage", srcImage);
Mat binaryImage = BinaryImage(srcImage); // 二值化图像
imshow("binaryImage", binaryImage);
RosenfeldThinning(binaryImage); // Rosenfeld细化算法
imshow("thinningImage", binaryImage);
waitKey(0);
return 0;
}
```
其中,`BinaryImage` 函数用于将输入的彩色图像转化为二值图像,`IsInnerBoundary` 函数用于判断像素是否在边界内,`RosenfeldThinning` 函数实现了Rosenfeld细化算法。在 `main` 函数中,我们首先读取测试图像,然后将其转化为二值图像。接着,我们调用 `RosenfeldThinning` 函数进行细化,最后显示细化后的图像。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)