【问题标题】:Floodfill part of an Image图像的填充部分
【发布时间】:2014-05-21 18:12:38
【问题描述】:

我有如下图

我想让图像变得像

我已经编写了代码,如下所示:

var
  Tx,Ty, R,G,B,A, posX, posY : integer;
begin
  posX :=-1; posY := -1;
  for Ty:= 0 to Image1.Height-1 do
  begin
    for Tx:= 0 to Image1.Width-1 do
    begin
      R:= GetRValue(image1.Canvas.Pixels[Tx, Ty]);
      G:= GetGValue(image1.Canvas.Pixels[Tx, Ty]);
      B:= GetBValue(image1.Canvas.Pixels[Tx, Ty]);
      A:= (R + G + B) Div 3;

      if (A > 50) then
      begin
         Image1.Canvas.Pixels[Tx,Ty] := rgb(255,255,255);
      end else
      begin
         Image1.Canvas.Pixels[Tx,Ty] := rgb(0,0,0);
         if (posX < 0) then
         begin
           posX := Tx;
           posY := Ty;
         end;
      end;
   end;
  end;
 Image1.Canvas.Brush.Style := bsSolid;
 Image1.Canvas.Brush.Color := clred;
 Image1.Canvas.FloodFill(posX,posY,clBlack,fsSurface);
end;

我上面的编码只能使填充仅用于点。

我怎样才能使填充像结果图像一样?谢谢

【问题讨论】:

  • 您可以使用FillRgn 填充区域,但您将如何定义该区域?我的直觉告诉我,你试图以错误的方式解决问题。我们可以通过这种方式帮助您解决问题,但在我看来,帮助您找到更好的解决方案会更有意义。
  • 您似乎误解了“flood-fill”的含义。当您在图像编辑程序中使用等效工具(如 MS Paint)时,您不会得到相同的结果吗?您的代码将浅色像素变为白色,将深色像素变为黑色,然后您想将黑色像素更改为红色。为什么要先把它们弄黑?直接把它们改成红色就行了。

标签: delphi flood-fill


【解决方案1】:

您似乎想用红色替换所有暗像素,用白色替换所有亮像素。您的代码几乎就在那里。与其用黑色替换暗像素,然后对黑色像素进行填充,为什么不直接将它们设置为红色,而完全忘记填充。

只需将代码中的RGB(0,0,0) 替换为clRed,并删除所有与floodfill 相关的代码。

我应该尝试解释什么是 Floodfill 以及为什么它没有达到您的预期。填充将所有颜色相似、相邻的像素的颜色更改为选定的种子像素。也就是说,它从您选择的像素开始,在您的情况下,(posX,posY)。它处理该像素,然后处理与该像素相邻的所有相同颜色的像素,然后处理与 那些 像素相邻的相同颜色的像素,依此类推。

在这种情况下,您从字母 i 上方的点开始填充。 “洪水”从那个点向外扩散,从黑色像素到黑色像素,直到它到达由白色像素形成的边界。洪水永远不会到达字母 i 的主体,因为这些点与种子点不连续。

来自维基百科的这个链接有更多解释和一些动画,可以帮助你理解。 http://en.wikipedia.org/wiki/Flood_fill

【讨论】:

  • 对不起,如果我的帖子让你们都被误解了。首先我将颜色更改为黑色或二值化,因为如果您上传的图像不是黑白图像,您必须先更改为黑白图像。其次,我为什么做洪水填充是为了检查图像中有多少物体。例如,对于我发布的图像,如果第一次填充完成检查点,那么有一个计数器来检查是否有 1 个对象,然后第二个填充检查是否有另一个对象。
  • 所以你想用floodfill统计图片中“物体”的数量。这就是我的建议。您可以保留循环遍历所有像素的代码,将它们更改为黑色或白色。现在再次循环遍历所有像素。这一次,每次找到黑色像素时,递增计数器,并从该像素开始进行填充,将黑色变为红色。
  • 顺便说一句,您提到您正在上传图片。我很好奇,你为什么要上传图片,它是上传到哪里的?
  • 好的,我先试试你的建议。不管它是否工作,我会稍后发布。我使用 opendialog 在 delphi 中加载图像。所以它可以加载任何我想要的图像。
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多