几个关于图像处理的问题,急死我啦!(100分)

  • 主题发起人 冰冷的雨
  • 开始时间

冰冷的雨

Unregistered / Unconfirmed
GUEST, unregistred user!
1、把一个24位Bitmap转成8位灰度图之后,如何知道它是不是真正的8位格式?
如果是,该怎么把它二值化?
2、在Timage的onClick事件中,怎么判断当前点的坐标和颜色?
3、我在Panel1和Panel2上放了两个Timage,分别是imgRude和imgPreview,
想把imgRude(比Panel1大)上的bitmap放到一个动态建立的bmp上进行格式转换并二值化,
最后在imgPreview上预览。结果imgPreview上的图被截掉了一部分,不知为什么?
(我用的是copyrect方法)
 
2. 代码如下:(注意图片格式应当为BMP)[:I]
procedure TForm1.Image1Click(Sender: TObject);
var
p,p1,p2 : TPoint;
begin
GetCursorPos(p);
p1 := self.ScreenToClient(p);
p2.X := p1.X - image1.Left;
p2.Y := p1.Y - image1.Top;
panel1.Color := image1.Canvas.Pixels[p2.X,p2.Y];
end;
 
pixelsformat的判定可以确定是否8bit
 
YoungSun,huazai,谢谢。我在二值化处理之前使用了imgPreview.pixelsformat设置
为8bit位图,可是结果不对,可以帮我看看程序吗(程序马上考过来)?
 
我想用以下程序把8位灰度图中灰度值大于Valve的点转化为白色,
其余点转为黑色。可是不管怎么调Valve,整个图像都变成了黑色;
如果去掉else后面的赋值语句,则可以调节效果,但应该是白色的
地方成了黑色,应该是黑色的地方却是一种灰色,Valve的值越小,
该灰色的色调越暗。请帮我看看问题
在哪里?
procedure TForm1.Button2Click(Sender: TObject);
var
bmp :TBitmap;
rt :TRect;
begin
bmp := TBitmap.Create;
bmp.Width := imgRude.Width;
bmp.Height := imgRude.Height;
.
.
.
//把24位彩色位图转为灰度图
Color24ToGray(rt,imgRude.Picture.Bitmap,bmp);

BitMap.PixelFormat := pf8Bit;
Gray8ToWB(spseValve.Value,bmp); //把8位灰度图二值化
imgPreview.Canvas.Draw(0,0,bmp);
bmp.Free;
end;
///////////////////
// Valve:阀值;
///////////////////
procedure Gray8ToWB(Valve: Integer;var Bitmap: TBitMap);
var
x,y : Integer;
P : PByteArray;
begin
try
for y := 0 to BitMap.Height -1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.Width -1 do
if P[x] > Valve then
P[x] := 255
else
p[x] := 0;
end;
finally
end;
end;
 
我写的一个例子:
灰度化:
procedure TMainForm.GraychangeClick(Sender: TObject);
var
p: PByteArray;
x, y: Integer;
Bmp: TBitmap;
Gray: byte;

begin
Bmp := TBitmap.Create;
Bmp.Assign(ChildForm.Image1.Picture.Bitmap);
Bmp.PixelFormat := pf24Bit;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 + p[x* 3]* 0.11);
p[x * 3] := Gray;
p[x * 3 + 1] := Gray;
p[x * 3 + 2] := Gray;
end
end;
ChildForm.Image1.Picture.Bitmap.Assign(Bmp);
bmp.free;
end;
二值化:
procedure TMainForm.blackwhiteClick(Sender: TObject);
var
p: PByteArray;
Gray, x, y: Integer;
Bmp: TBitmap;

begin
Bmp := TBitmap.Create;
Bmp.Assign(childform.Image1.Picture.Bitmap);
Bmp.PixelFormat := pf24Bit;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 + p[x
* 3]
* 0.11);

if gray > 128 then
begin

p[x * 3] := 255;
p[x * 3 + 1] := 255;
p[x * 3 + 2] := 255;
end
else
begin
p[x * 3] := 0;
p[x * 3 + 1] := 0;
p[x * 3 + 2] := 0;
end;
end;
end;
ChildForm.Image1.Picture.Bitmap.Assign(Bmp);
bmp.free;
end;
 
谢谢了。分数不多,不好意思。
 
顶部