二值化图像填充算法,也称为区域填充算法,是一种用于将特定区域内的像素颜色替换为特定颜色的图像处理技术。闭环填充算法和开环填充算法是二值化图像填充算法的两种常见形式。

闭环填充算法的基本原理是从指定的起始点开始,沿着像素边界向外扩展,直到遇到闭环。在遇到闭环时,算法会将闭环内的所有像素填充为指定颜色。开环填充算法的基本原理与闭环填充算法类似,但不会填充闭合的区域。

下面是C++实现二值化图像闭环和开环填充算法的代码示例:

#include <iostream>
#include <queue>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

// 二值化图像闭环填充算法
void fillCloseLoop(Mat& img, Point seed, uchar color) {
    queue<Point> q;
    q.push(seed);
    while (!q.empty()) {
        Point p = q.front();
        q.pop();
        if (img.at<uchar>(p) == color) continue;
        img.at<uchar>(p) = color;
        if (p.x > 0) q.push(Point(p.x - 1, p.y));
        if (p.x < img.cols - 1) q.push(Point(p.x + 1, p.y));
        if (p.y > 0) q.push(Point(p.x, p.y - 1));
        if (p.y < img.rows - 1) q.push(Point(p.x, p.y + 1));
    }
}

// 二值化图像开环填充算法
void fillOpenLoop(Mat& img, Point seed, uchar color) {
    queue<Point> q;
    q.push(seed);
    while (!q.empty()) {
        Point p = q.front();
        q.pop();
        if (img.at<uchar>(p) == color) continue;
        img.at<uchar>(p) = color;
        if (p.x > 0 && img.at<uchar>(p.x - 1, p.y) == 0) q.push(Point(p.x - 1, p.y));
        if (p.x < img.cols - 1 && img.at<uchar>(p.x + 1, p.y) == 0) q.push(Point(p.x + 1, p.y));
        if (p.y > 0 && img.at<uchar>(p.x, p.y - 1) == 0) q.push(Point(p.x, p.y - 1));
        if (p.y < img.rows - 1 && img.at<uchar>(p.x, p.y + 1) == 0) q.push(Point(p.x, p.y + 1));
    }
}

int main() {
    Mat img = imread("test.png", IMREAD_GRAYSCALE);
    if (img.empty()) return -1;
    Mat closeLoopImg = img.clone();
    Mat openLoopImg = img.clone();

    // 闭环填充测试
    fillCloseLoop(closeLoopImg, Point(100, 100), 255);
    imshow("closeLoopImg", closeLoopImg);

    // 开环填充测试
    fillOpenLoop(openLoopImg, Point(100, 100), 255);
    imshow("openLoopImg", openLoopImg);

    waitKey(0);
    return 0;
}

在上述代码中,我们使用了OpenCV库来读取和显示图像。在主函数中,我们首先读取了一个二值化图像,并使用fillCloseLoop()fillOpenLoop()函数对其进行了闭环和开环填充。这两个函数都使用了队列来实现像素的扩展,并在遇到闭环或边界时将像素颜色替换为指定颜色。

在运行代码后,我们可以看到两个填充结果的显示窗口。其中,闭环填充算法将从起始点(100,100)开始,沿着像素边界向外扩展,直到遇到闭环,将闭环内的所有像素填充为白色。而开环填充算法将从起始点(100,100)开始,沿着像素边界向外扩展,直到遇到边界,将开环内的所有像素填充为白色。

总的来说,二值化图像填充算法是一种非常实用的图像处理技术,可以用于分割图像中的区域、检测目标区域等。通过掌握闭环和开环填充算法的原理和实现,可以更好地理解和应用这一技术

C++实现二值化图像闭环和开环的填充算法以及原理和代码

原文地址: https://www.cveoy.top/t/topic/cuQ3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录