lintcode 1062. 洪水填充 DFS

一张image通过一个2-D整数数组来表示,每一个整数代表图片的像素值(从0到65535)。

给定一个坐标 (sr, sc) 代表洪水填充的起始像素(行和列),以及一个像素颜色newColor,“洪水填充”整张图片。

为了实现一个“洪水填充”,考虑起始像素点,以及与起始像素相同颜色的起始像素4向连接的任何像素,以及与这些像素4向相连的任何像素(同样和起始像素相同颜色),以此类推。把所以之前提到的像素点替换成新的颜色。

最终,返回修改后的图片。

样例 1:

输入: 
image = [[1,1],[0,0]]
sr = 0, sc = 0, newColor = 2
输出: [[2,2],[0,0]]
样例 2:

输入:
image = [[1,1,1],[1,1,0],[1,0,1]]
sr = 1, sc = 1, newColor = 2
输出: [[2,2,2],[2,2,0],[2,0,1]]
解释:
从图片的中心(坐标为(1, 1)),所有和起始像素通过相同颜色相连的像素上成了新的颜色。
注意底下的角落没有被染成2,因为它和起始像素不是4方向相连。

思路:DFS,以起始点为中心向四周寻找符合条件的像素点,通过递归,将符合条件的像素点重新作为起始点,以此类推,从而得到答案。

class Solution {
public:
    /**
     * @param image: a 2-D array
     * @param sr: an integer
     * @param sc: an integer
     * @param newColor: an integer
     * @return: the modified image
     */
    vector<vector<int>> floodFill(vector<vector<int>> &image, int sr, int sc, int newColor) {
        // Write your code here
        int num=image[sr][sc];
        change(image,sr,sc,newColor, num);
        return image;
    }
    void change(vector<vector<int>> &image, int sr, int sc, int newColor,int num)
    {
        int len1=image.size();
        int len2=image[0].size();
        if(sr<0||sr>=len1||sc<0||sc>=len2) return;
        if(image[sr][sc]==num)
        {
            image[sr][sc]=newColor;
            change(image,sr-1,sc,newColor,num);
            change(image,sr+1,sc,newColor,num);
            change(image,sr,sc-1,newColor,num);
            change(image,sr,sc+1,newColor,num);
        }
    }
};
Em.CV 是一个基于 OpenCV 的 C# 图像处理库,它提供了许多图像处理和计算机视觉的功能。其中,泛洪水填充(Flood Fill)是一种图像处理算法,用于填充一个封闭区域的像素。 在 Emgu.CV 中,你可以使用 `CvInvoke.FloodFill` 方法来进行泛洪水填充操作。该方法可以接受一个源图像、填充起始点、填充颜色、填充范围等参数。 下面是一个示例代码,演示如何使用 Emgu.CV 进行泛洪水填充: ```csharp using Emgu.CV; using Emgu.CV.Structure; // 加载图像 Image<Bgr, byte> image = new Image<Bgr, byte>("input.jpg"); // 定义填充起始点 int startX = 100; int startY = 100; // 定义填充颜色 MCvScalar fillColor = new MCvScalar(0, 0, 255); // 红色 // 定义填充范围 MCvConnectedComp connectedComponent = new MCvConnectedComp(); MCvScalar lowerDiff = new MCvScalar(20, 20, 20); // 填充颜色的下限差异 MCvScalar upperDiff = new MCvScalar(20, 20, 20); // 填充颜色的上限差异 // 进行泛洪水填充 CvInvoke.FloodFill(image, null, new System.Drawing.Point(startX, startY), fillColor, out connectedComponent, lowerDiff, upperDiff); // 显示结果图像 CvInvoke.Imshow("Flood Fill Result", image); CvInvoke.WaitKey(0); ``` 在这个示例中,我们首先加载了一个图像,然后定义了填充起始点、填充颜色以及填充范围。最后,调用 `CvInvoke.FloodFill` 方法进行填充操作,并显示结果图像。 请注意,这只是一个简单的示例,你可以根据自己的需求进行调整和扩展。另外,记得在使用 Emgu.CV 之前,你需要先安装 Emgu.CV 库并添加到你的项目引用中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值