opencv 图像骨骼化 c++
时间: 2023-07-24 09:04:08 浏览: 102
OpenCV 提供的函数 `distanceTransform` 和 `threshold` 可以实现图像骨骼化。以下是一个简单的 C++ 代码示例:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src = imread("input.jpg", IMREAD_GRAYSCALE);
Mat dst;
distanceTransform(src, dst, DIST_L2, 3);
threshold(dst, dst, 0.5 * 255, 255, THRESH_BINARY);
imshow("src", src);
imshow("dst", dst);
waitKey();
return 0;
}
```
首先读入一张灰度图像 `src`,然后调用 `distanceTransform` 函数计算距离变换结果,再调用 `threshold` 函数将距离变换结果二值化,得到骨骼化图像 `dst`。最后使用 OpenCV 的 `imshow` 函数显示原图和骨骼化图像,并使用 `waitKey` 函数等待用户按下键盘。
其中 `DIST_L2` 表示使用欧几里得距离进行距离变换,`3` 表示使用 3x3 的卷积核进行距离变换。`0.5 * 255` 表示将距离变换结果的像素值阈值设为 0.5,并乘以 255 转换为 8 位灰度图像的像素值。
相关问题
基于c++的opencv实现对输入图像的骨骼化操作
骨骼化(Skeletonization)是将二值化图像中的物体细化为一系列线条的过程。基于C++的OpenCV库可以通过以下步骤实现对输入图像的骨骼化操作:
1. 读取输入图像并转换为灰度图像
```C++
cv::Mat src = cv::imread("input_image.jpg");
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
```
2. 对灰度图像进行二值化处理
```C++
cv::Mat binary;
cv::threshold(gray, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
```
3. 对二值化图像进行骨骼化操作
```C++
cv::Mat skel(binary.size(), CV_8UC1, cv::Scalar(0));
cv::Mat temp;
cv::Mat eroded;
cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3, 3));
bool done;
do {
cv::erode(binary, eroded, element);
cv::dilate(eroded, temp, element);
cv::subtract(binary, temp, temp);
cv::bitwise_or(skel, temp, skel);
eroded.copyTo(binary);
done = (cv::countNonZero(binary) == 0);
} while (!done);
```
4. 显示骨骼化结果
```C++
cv::imshow("Skeleton", skel);
cv::waitKey(0);
```
完整代码如下:
```C++
#include <opencv2/opencv.hpp>
int main() {
cv::Mat src = cv::imread("input_image.jpg");
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
cv::Mat binary;
cv::threshold(gray, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
cv::Mat skel(binary.size(), CV_8UC1, cv::Scalar(0));
cv::Mat temp;
cv::Mat eroded;
cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3, 3));
bool done;
do {
cv::erode(binary, eroded, element);
cv::dilate(eroded, temp, element);
cv::subtract(binary, temp, temp);
cv::bitwise_or(skel, temp, skel);
eroded.copyTo(binary);
done = (cv::countNonZero(binary) == 0);
} while (!done);
cv::imshow("Skeleton", skel);
cv::waitKey(0);
return 0;
}
```
运行后会显示骨骼化结果。
阅读全文