获取周围的像素颜色并更改它们

时间:2013-04-05 14:19:32

标签: delphi image-processing pixels

我想创建一个首先检查图像是否为某个像素颜色的应用程序。 当找到具有正确像素颜色的像素时,它将“突出显示”该像素。

但是这里有一个棘手的部分,之后我想检查“突出显示”像素的8个周围像素的颜色。如果这些周围像素中的一个是黑色,则该像素的颜色应该改变。

我设法“突出显示”具有某种像素颜色的像素(请参阅下面的代码),但我一直在寻找如何检查其周围像素......

我希望我的问题很明确。

procedure Tform_Main.analyzepixels (bitmapanalyse : TBitmap);
var
C: TColor;
X, Y:Integer;
Pixels : PRGBTripleArray 
begin
  bitmapanalyse := TBitmap.Create;
  try
  bitmapanalyse.Assign(FBitmap);

  Form_memo.Memo1.Lines.BeginUpdate;
  try
  for Y := 0 to bitmapanalyse.Height - 1 do
  begin
    Pixels := bitmapanalyse.ScanLine[Y];
    ProgressBar2.StepIt;
    ProgressBar2.Update;
    Application.ProcessMessages;
    for X := 0 to bitmapanalyse.Width - 1 do
    begin
      if (Pixels[X].rgbtRed >= Pixelcolor) and 
         (Pixels[X].rgbtGreen >= Pixelcolor) and    
         (Pixels[X].rgbtBlue >= Pixelcolor)
      then
      begin
        C := RGB(
          Pixels[X].rgbtRed,
          Pixels[X].rgbtGreen,
          Pixels[X].rgbtBlue
        );

           Form_memo.Memo1.Lines.Add(
          '===============' + sLineBreak +
          'Pixel[' + IntToStr(X) + '; ' + IntToStr(Y) + ']' + sLineBreak +
          'Color: ' + ColortoString(C))

        ;
        Pixels[X].rgbtRed := 255;
        Pixels[X].rgbtGreen := 255;
        Pixels[X].rgbtBlue := 0;
      end;
    end;
  end;
finally
  Form_memo.Memo1.Lines.EndUpdate;
end;

1 个答案:

答案 0 :(得分:1)

我可能遗漏了一些东西,但是因为你有(x,y)你可以通过简单地使用

获得所有周围的像素
[x - 1, y - 1][x  , y - 1][x + 1, y - 1]
[x - 1, y    ][x  , y    ][x + 1, y    ]
[x - 1, y + 1][x  , y + 1][x + 1, y + 1]

您已经拥有获取特定像素的逻辑。我只会重构你拥有的东西

function GetRGBAt(ABitmap: TBitmap; const X, Y: Integer) : PRGBTriple;
begin
    Result := nil; // don't remember if this is necessary
    if (Y >= 0) and (X >= 0) then
    begin
        Result := aBitmap.ScanLine[Y];
        Inc(Result, X);
    end;
end;

function IsRGBBlack(ABitmap: TBitmap; const X, Y: Integer) : boolean;
var
    P: PRGBTriple;
begin
    P := GetRGBAt(ABitmap, X, Y);
    Result := (P <> nil) and 
            (P^.rgbtBlue + P^.rgbtGreen + P^.rgbtBlue = 0);
end;

然后您只需要将检查添加到您的代码中。由于Delphi在OR布尔表达式上短路,因此以下内容应该足够了:

if    IsRGBBlack(bitmapanalyse, x - 1, y-1) 
   or IsRGBBlack(bitmapanalyse, x,     y-1) 
   or IsRGBBlack(bitmapanalyse, x + 1, y-1) 

   or IsRGBBlack(bitmapanalyse, x - 1, y) 
   // x, y not needed
   or IsRGBBlack(bitmapanalyse, x + 1, y) 

   or IsRGBBlack(bitmapanalyse, x - 1, y + 1) 
   or IsRGBBlack(bitmapanalyse, x,     y + 1) 
   or IsRGBBlack(bitmapanalyse, x + 1, y + 1)  then

// your logic here for (x, y)

这是一种非常简单的方法,但是您没有说明在相邻符合条件的像素的情况下您想要做什么,例如,您可能需要为这些像素添加一些额外的逻辑。