首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

-怎么取得相连的像素点?帮看看-

2013-07-29 
-------------如何取得相连的像素点?大虾帮看看-----------现在小弟在学图片处理,路过的大虾帮看一下..是

-------------如何取得相连的像素点?大虾帮看看-----------
现在小弟在学图片处理,路过的大虾帮看一下..

是这样的:
有一堆record,是从整个图片是取下来的,上面有坐标和颜色,格式:
x,y,color

有两个问题想请教:
1.如何判断在同一颜色下,相连(上下左右)的相素点?
2.如何将相连的像素点的数据抽出,存到别一个记录里?

(仅有35分了,路过的帮看看..)
[解决办法]

广度优先搜索:

uses Classes;

TPixel =record    //定义点类型
          x,y:integer;
          color: TColor;
        end;
{Canvas为原图画布,pt为起始搜索点,返回一个与pt颜色相同的点的列表}
function (Canvas: TCanvas;pt:TPixel): TList;
const
  direct :array [1..4,1..2] of shortint =((0,-1),(0,1),(-1,0),(1,0)); //方向增量
var
  dl: array [1..10000] of TPixel;  //队列
  head,tail,i:Integer;  //head为队首指针,tail为队尾指针
  tmp,tmp2:TPixel;
begin
  head:=0;  tail:=1; FillChar(dl,sizeof(dl),0); dl[tail]:=pt; //初始化队列
  result := TList.Create;
  while head<>tail do
  begin
    Inc(head);  //队首加1
    tmp:=dl[head];  //出队
    for i:= 1 to 4 do  //遍历四个方向
    begin
      tmp2.X :=tmp.X+direct[i,1];
      tmp2.Y :=tmp.Y+direct[i,2];
      if (tmp2.X<0)or(tmp2.X>Canvas.Width)or(tmp2.Y<0)or(tmp2.Y>Canvas.Width) then 
        continue;   //如果越界则跳过
      tmp2.Color := Canvas.Pixels[tmp2.X,tmp2.Y];
      if tmp2.Color = pt.Color then  //如果颜色相同则入队,并加入结果中
      begin
        Inc(tail);
        dl[tail]:=tmp2;
        result.Add(@tmp2);
      end;
    end; 


  end;
end;


[解决办法]
引用:
//注:我不是大虾。。

无论从技术还是热心助人来衡量,你已经是个大虾了。

热点排行