S
szchengyu
Unregistered / Unconfirmed
GUEST, unregistred user!
小弟被迫进入图像处理的领域不久,一切都无从下手。
这个问题困扰了近一个星期了,不光是老板生气,我都气不顺 > -:()
能帮助我解决的朋友在下没齿不忘,如果是MM帮我,并且你不嫌弃,我以身相许:)
以下代码是从VC 中转出来的,原意是中值滤波(MedianFilter),但好像有点不对,
老是出错(不是一定出),检查了很久都不知道是怎么回事?
// 用冒泡法排序,取给定一维数组(bArray)的中值,
function GetMedianNum(bArray: array of Byte; Len: integer): Byte;
var
i, j: integer;
temp: byte;
begin
// 冒泡法排序
for j := 0 to Len - 1 do
begin
for i := 0 to Len - j - 1 do
begin
if bArray > bArray[i + 1] then
begin
temp := bArray;
bArray := bArray[i + 1];
bArray[i + 1] := temp;
end;
end;
end;
// 如果给定数组的个数为奇数,取最中间一个
if (Len and 1) > 0 then
result := bArray[(Len + 1) div 2]
else
// 如果给定数组的个数为偶数,取中间两个数的平均
result := (bArray[Len div 2] + bArray[Len div 2 + 1]) div 2;
end;
// 针对256色图
procedure MedianFilter(bmp: TBitmap; w, h, iFw, iFh, iFx, iFy: integer);
// bmp : 需要滤波的位图,
// w, h: 需要滤波的宽度和高度
// iFw, iFh: 给定模板的宽度和高度
// iFx, iFy: 给定模板的中心坐标
var
aValue: array of Byte; // 模板数组
i, j, m, n: integer;
ps, pd: PByteArray;
bmpTemp: TBitmap;
begin
bmpTemp := TBitmap.Create;
bmpTemp.Assign(bmp);
SetLength(aValue, iFh * iFw);
for i := iFy to h - iFh + iFy do
begin
pd := bmp.ScanLine;
for j := iFx to w - iFw + iFx do
begin
for m := 0 to iFh - 1 do
begin
ps := bmpTemp.ScanLine[i - iFy + m];
for n := 0 to iFw - 1 do
aValue[m * iFw + n] := ps[j - iFx + n]; // 常出错处,
// 一般是在一行的最后一列(当然已经考虑到越界而没处理边界),
end;
pd[j] := GetMedianNum(aValue, iFh * iFw);
end;
end;
bmpTemp.Free;
aValue := nil;
end;
我是这样调用的:
MedianFilter(Image1.Picture.Bitmap,
Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height,
3, 3, 1, 1);
// 对 Image1.Picture.Bitmap 进行中值滤波,模板为 3*3, 中心在中点,坐标为 (1, 1);
这个问题困扰了近一个星期了,不光是老板生气,我都气不顺 > -:()
能帮助我解决的朋友在下没齿不忘,如果是MM帮我,并且你不嫌弃,我以身相许:)
以下代码是从VC 中转出来的,原意是中值滤波(MedianFilter),但好像有点不对,
老是出错(不是一定出),检查了很久都不知道是怎么回事?
// 用冒泡法排序,取给定一维数组(bArray)的中值,
function GetMedianNum(bArray: array of Byte; Len: integer): Byte;
var
i, j: integer;
temp: byte;
begin
// 冒泡法排序
for j := 0 to Len - 1 do
begin
for i := 0 to Len - j - 1 do
begin
if bArray > bArray[i + 1] then
begin
temp := bArray;
bArray := bArray[i + 1];
bArray[i + 1] := temp;
end;
end;
end;
// 如果给定数组的个数为奇数,取最中间一个
if (Len and 1) > 0 then
result := bArray[(Len + 1) div 2]
else
// 如果给定数组的个数为偶数,取中间两个数的平均
result := (bArray[Len div 2] + bArray[Len div 2 + 1]) div 2;
end;
// 针对256色图
procedure MedianFilter(bmp: TBitmap; w, h, iFw, iFh, iFx, iFy: integer);
// bmp : 需要滤波的位图,
// w, h: 需要滤波的宽度和高度
// iFw, iFh: 给定模板的宽度和高度
// iFx, iFy: 给定模板的中心坐标
var
aValue: array of Byte; // 模板数组
i, j, m, n: integer;
ps, pd: PByteArray;
bmpTemp: TBitmap;
begin
bmpTemp := TBitmap.Create;
bmpTemp.Assign(bmp);
SetLength(aValue, iFh * iFw);
for i := iFy to h - iFh + iFy do
begin
pd := bmp.ScanLine;
for j := iFx to w - iFw + iFx do
begin
for m := 0 to iFh - 1 do
begin
ps := bmpTemp.ScanLine[i - iFy + m];
for n := 0 to iFw - 1 do
aValue[m * iFw + n] := ps[j - iFx + n]; // 常出错处,
// 一般是在一行的最后一列(当然已经考虑到越界而没处理边界),
end;
pd[j] := GetMedianNum(aValue, iFh * iFw);
end;
end;
bmpTemp.Free;
aValue := nil;
end;
我是这样调用的:
MedianFilter(Image1.Picture.Bitmap,
Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height,
3, 3, 1, 1);
// 对 Image1.Picture.Bitmap 进行中值滤波,模板为 3*3, 中心在中点,坐标为 (1, 1);