我在OpenCV(canny边缘检测)中从边缘检测模块中提取了边缘图.我想要做的是填补边缘图中的孔.
我正在使用C++和OpenCV库.在OpenCV中有一个cvFloodFill()函数,它将用种子(其中一个位置开始泛滥)填充漏洞.但是,我试图在不知道种子的情况下填充所有内部空洞.(类似于MATLAB中的imfill())
Q1:如何查找所有种子,以便我可以应用'cvFloodFill()'?
Q2:如何实现'imfill()'等效?
OpenCV中的新手,任何提示都很受欢迎.
我喜欢玩益智游戏Flood-It,它可以在线播放:
https://www.lemoda.net/javascript/flood-it/game.html
它也可以作为iGoogle小工具使用.目的是用最少数量的连续填充填充整个委员会.
我正在尝试编写一个可以最佳地解决这个难题的程序.解决这个问题的最佳方法是什么?理想情况下我想使用A*算法,但我不知道估算剩余步数的功能应该是什么.我写了一个程序,进行了深度4强力搜索,以最大化填充区域.它工作得相当好,并且在解决这个难题时打败了我,但我对这个算法并不完全满意.
有什么建议?提前致谢.
该文档为OpenCV的的floodfill功能状态:
该函数使用并更新掩码,因此您负责初始化掩码内容.洪水填充不能跨越掩码中的非零像素.例如,边缘检测器输出可以用作掩模以停止在边缘处填充.可以在对函数的多次调用中使用相同的掩码,以确保填充区域不重叠.
该功能如何更新掩码?它是否将填充中的所有像素设置为某个非零值?
我一直在努力找到一个有效的填充算法.在许多算法中,我只尝试过"递归线填充",其中一个行为完全符合它应该的主要警告,它偶尔会打击堆栈.:(
我已经尝试了很多我发现的非递归实现,并且它们都非常温和:要么在奇怪的地方留下空隙,要么泛滥整个区域(当它们应该被封闭时).
任何人都有一个用C语言编写的非递归填充工作源代码(或者c ++不是太大的OOP而且我可以很容易地解开)?
当我实施flood-fill课程时,它会变成我整个Bitmap黑色.显然这不是预期的效果.我查看了以下主题:
从我所看到的,我正在做他们在这些解决方案中提出的所有内容,但它并没有让我找到解决问题的方法.所以要切入追逐,这里的代码有一些简短的解释.
XML
我使用相对布局和定位(堆叠)两个ImageViews直接在彼此之上.它们都具有相同的图像,这就产生了能够在图像上绘制的错觉.但是,您实际上只是在透明覆盖上绘图.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
....
<ImageView
android:id="@+id/drawContainer2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toRightOf="@id/imageMapperSurfaces"
android:contentDescription="@string/image" />
<ImageView
android:id="@+id/drawContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toRightOf="@id/imageMapperSurfaces"
android:contentDescription="@string/image" />
...
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
Canvas
然后我Canvas使用此代码创建我,并确保正确设置我的图层类型.
public void setCanvas() {
if(mFile != null && mFile.exists()) {
mPictureBitmap = BitmapFactory.decodeFile(mFile.getAbsolutePath());
mBitmap = Bitmap.createScaledBitmap(mPictureBitmap, mImageView.getWidth(), mImageView.getHeight(), false);
mPictureBitmap = mBitmap.copy(Bitmap.Config.ARGB_8888, true);
mBitmap = mPictureBitmap.copy(Bitmap.Config.ARGB_8888, true);
mSceneBitmap = mBitmap.copy(Bitmap.Config.ARGB_8888, true);
mBlurBitmap = blurImage(mPictureBitmap);
mCanvas = new Canvas(mBitmap);
mImageView.setImageBitmap(mBitmap);
mImageView2.setImageBitmap(mPictureBitmap); …Run Code Online (Sandbox Code Playgroud) 我知道这个标题似乎有点含糊不清,因此我附上了一张图片,这将有助于清楚地理解问题.我需要在白色区域内找到洞.一个洞被定义为一个或多个在白色区域内具有值"0"的单元格我的意思是它必须被单元格完全包围,值为"1"(例如,在这里我们可以看到三个标记为1,2和3的孔).我想出了一个非常天真的解决方案:1.在整个矩阵中搜索值为"0"的单元格2.遇到这样的单元格(黑色)时运行DFS(Flood-Fill)并检查我们是否可以触摸主矩形区域的边界3.如果我们可以在DFS期间触摸边界那么它不是一个洞,如果我们不能到达边界那么它将被视为一个洞
现在,这个解决方案有效,但我想知道是否有任何其他有效/快速的解决方案来解决这个问题.
请让我知道你的想法.谢谢.

我正在尝试着色应用程序并找出目标c中的任何人之前做过的填充物.???我正在读取图片中的所有像素数据,我也可以更改它..但是洪水填充只能做我想要的..
..在这里我可以识别包含黑点的像素.但我真的很混淆如何识别特定白色区域中的像素.非常感谢...
我正在研究一个简单的绘图应用程序,我需要一个算法来填充洪水.
用户工作流程将如下所示(类似于Flash CS,更简单):
如果在应用填充后移动线条,则相应地更改填充区域.
任何人都有一个好主意,如何实现这样的算法?主要任务基本上是确定一个点周围的线段.(以某种方式存储此信息,移动线条)
编辑:解释图像:(画布中当然可以有其他行,对填充算法无关紧要)

EDIT2:更困难的情况:

EDIT3:我找到了一种用孔填充多边形的方法 http://alienryderflex.com/polygon_fill/,现在的主要问题是,我如何找到我的多边形?
language-agnostic geometry vector-graphics actionscript-3 flood-fill
给定图像上的一个点,我想要填充连接到该点的所有点 - 但是要填充到新图像上.一种天真的方法是将原始图像填充到特殊的魔术颜色值.然后,访问每个像素,并将具有此魔术颜色值的所有像素复制到新图像.肯定有更好的办法!
我在Java中使用递归Flood填充算法来填充图像的某些区域.使用非常小的图像可以正常工作,但是当de image变大时,JVM会给出Stack Over Flow Error.
这就是我必须使用我自己的堆栈使用Flood Fill重新实现该方法的原因.(我认为这是在这种情况下做到这一点的最好方法)
任何人都可以解释我如何编码吗?(如果你手边没有代码,算法的伪代码就可以了)
我在互联网上看了很多,但我还不太清楚.
编辑:我添加了我的递归代码
public void floodFill(int x, int y, Color targetColor,Color replacementColor) {
if (img.getRGB(x, y) != targetColor.getRGB()) return;
img.setRGB(x, y, replacementColor.getRGB());
floodFill(x - 1, y, targetColor, replacementColor);
floodFill(x + 1, y, targetColor, replacementColor);
floodFill(x, y - 1, targetColor, replacementColor);
floodFill(x, y + 1, targetColor, replacementColor);
return;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!