OpenCV二值图像孔洞填充的一个简单方法c++
时间: 2023-07-15 07:15:01 浏览: 131
OpenCV中可以使用morphologyEx函数来进行二值图像的孔洞填充操作。
下面是一个简单的方法:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src = imread("binary_image.png", IMREAD_GRAYSCALE);
// 反转二值图像,使背景为白色
Mat inverted;
bitwise_not(src, inverted);
// 定义结构元素
Mat se = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
// 填充孔洞
morphologyEx(inverted, inverted, MORPH_CLOSE, se);
// 再次反转二值图像
bitwise_not(inverted, src);
// 显示结果
imshow("Original", src);
imshow("Filled", inverted);
waitKey(0);
return 0;
}
```
首先读入二值图像,然后反转二值图像,使背景为白色。接着定义一个结构元素,可以通过getStructuringElement函数获取。最后使用morphologyEx函数进行闭运算(MORPH_CLOSE),填充孔洞。最后再次反转二值图像,得到填充后的结果。
相关问题
c++版opencv如何填充图像中的孔洞
在C++版OpenCV中,可以使用cv::findContours()函数找到图像中的轮廓,然后使用cv::drawContours()函数来填充孔洞。
具体步骤如下:
1. 读入图像并转为灰度图像。
```c++
cv::Mat img = cv::imread("input.jpg");
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
```
2. 对灰度图像进行二值化处理。
```c++
cv::Mat binary;
cv::threshold(gray, binary, 0, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);
```
3. 找到图像中的轮廓。
```c++
std::vector<std::vector<cv::Point>> contours;
cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
```
4. 对每个轮廓进行绘制。
```c++
for (size_t i = 0; i < contours.size(); i++) {
cv::drawContours(img, contours, i, cv::Scalar(255, 255, 255), cv::FILLED);
}
```
5. 显示结果。
```c++
cv::imshow("Result", img);
cv::waitKey(0);
```
注意:在使用cv::drawContours()函数时,需要指定填充颜色(本例中为白色)以及填充方式(本例中为cv::FILLED)。
opencv如何填充图像中的孔洞,用c++回复
在 OpenCV 中,可以使用 `cv::morphologyEx()` 函数来填充图像中的孔洞。该函数可以进行形态学操作,可以对二值图像、灰度图像和彩色图像进行操作。
以下是一个示例代码,用于填充二值图像中的孔洞:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("binary_image.png", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Could not read the image" << endl;
return 1;
}
// 对图像进行闭操作,填充孔洞
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(img, img, MORPH_CLOSE, kernel);
namedWindow("Filled Image", WINDOW_NORMAL);
imshow("Filled Image", img);
waitKey(0);
return 0;
}
```
在这个示例中,我们首先读取了一个二值图像。然后,我们定义了一个 3x3 的矩形结构元素,使用 `cv::getStructuringElement()` 函数创建。接下来,我们使用 `cv::morphologyEx()` 函数执行闭操作,填充图像中的孔洞。最后,我们显示填充后的图像。
需要注意的是,这个示例代码中使用了矩形结构元素,如果你的图像中的孔洞不是这种形状,你需要使用不同形状的结构元素。
阅读全文