如何用动态阀值法将图形二值化?

gidee 2003-11-11 03:13:47
只要给出算法代码
分不够可以再给
...全文
217 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gide 2004-03-13
  • 打赏
  • 举报
回复
thirdapple(陨落雕) 给出具体的办法,分给你,不够可以再加
gidee 2003-12-03
  • 打赏
  • 举报
回复
自己顶自己
thirdapple 2003-12-03
  • 打赏
  • 举报
回复
双峰图取峰谷
gidee 2003-11-11
  • 打赏
  • 举报
回复
老大,首先谢谢,但是你的不是动态阀值。
你还是全局的,有动态的请举手
谷戈 2003-11-11
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var valve: integer;
str1: string;
begin
try
str1 := inputbox('阀值输入', '输入二值化的阀值:', '200');
valve := StrToint(str1);
showmessage('比例:' + FloatToStr(CalPercent(image1.Picture.Bitmap, valve)));

except
application.MessageBox('必须输入0-255之间的数字!', '操作提示', MB_OK + MB_ICONINFORMATION);
end;
end;


function TForm1.CalPercent(const BitmapSouce: TBitmap; valve: integer): double; var
p, p1: PByteArray;
x, y: Integer;
Bmp: TBitmap;
Gray: byte;
WhiteNum, BlackNum: integer;
begin
WhiteNum := 0;
BlackNum := 0;
Bmp := TBitmap.Create;
Bmp.Assign(BitmapSouce);
Bmp.PixelFormat := pf24Bit;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
p1 := BitmapSouce.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
Gray := (p1[x * 3 + 2] * 299 + p1[x * 3 + 1] * 587 + p1[x * 3] * 114) div 1000;
if gray > valve then
begin
gray := 255;
inc(WhiteNum)
end
else
begin
gray := 0;
inc(BlackNum);
end ;

p[x * 3 + 2] := gray;
p[x * 3 + 1] := gray;
p[x * 3] := gray;
end;
end;

image2.Picture.Bitmap := bmp;
if WhiteNum = 0 then //全黑
result := 1000000000
else
Result := BlackNum / WhiteNum;
end;

valve为阀值,并能计算除黑白两种面积的比例;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧