gpt4 book ai didi

image - 将图像转换为矩阵

转载 作者:行者123 更新时间:2023-12-03 15:38:02 26 4
gpt4 key购买 nike

我正在尝试将图像(假设是黑色和白色)转换为矩阵(其中 0 = 黑色,1 = 白色)

我尝试使用此代码:

procedure TForm1.Button1Click(Sender: TObject);
type
tab = array[1..1000,1..1000] of byte;
var i,j: integer;
s : string;
image : TBitmap;
t : tab;
begin
image := TBitmap.Create;
image.LoadFromFile('c:\image.bmp');

s := '';
for i := 0 to image.Height do
begin
for j := 0 to image.Width do
begin
if image.Canvas.Pixels[i,j] = clWhite then
t[i,j] := 0
else
t[i,j] := 1;

end;
end;
for i := 0 to image.Height do
begin
for j := 0 to image.Width do
begin
s:=s + IntToStr(t[i,j]);
end;
Memo1.Lines.Add(s);
s:='';
end;
end;

但它给了我错误的结果。

有什么想法吗?

最佳答案

您的代码中有五个错误和另外两个问题!

首先

for i := 0 to image.Height do

必须替换为

for i := 0 to image.Height - 1 do

(为什么?)同样,

for j := 0 to image.Width do

必须替换为

for j := 0 to image.Width - 1 do

第二Pixels 数组采用参数 [x, y],而不是 [y, x] 。因此,您需要更换

image.Canvas.Pixels[i,j]

image.Canvas.Pixels[j,i]

第三,你写了“0 = 黑色,1 = 白色”,但显然你做了相反的事情!

第四,您尝试访问 t[0, 0],即使您的矩阵从 1 开始索引。使用 array[0..1000,0..1000] of byte; 来解决这个问题。

第五,出现内存泄漏(image 未释放 - 使用 try..finally)。

另外,最好使用动态数组:

type
TByteMatrix = array of array of byte;

var
mat: TByteMatrix;

然后你开始

SetLength(mat, image.Height - 1, image.Width - 1);

如果你希望它索引[y, x],否则相反。

最后,在这种情况下,您根本不应该使用 Pixels 属性,因为它非常慢。请改用 Scanline 属性。请参阅thisthatsomething else了解更多信息。

此外,只需在备忘录控件更新之前添加 Memo1.Lines.BeginUpdate 并在更新之后添加 Memo1.Lines.EndUpdate,即可获得显着的速度。

关于image - 将图像转换为矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15312874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com