“div”与“/”在图象处理中的区别?(100分)

  • 主题发起人 主题发起人 kongg
  • 开始时间 开始时间
K

kongg

Unregistered / Unconfirmed
GUEST, unregistred user!
在我的课程设计当中,我需要做一个图象平滑的程序,我的过程是:
加入两个image,分别是image1和image2,image1是待处理的图象,
image2是保存处理后的图象。程序如下:
var i,j:integer;
begin
for i:=0 to image1.width do
begin
for j:=0 to image1.height do
begin
image2.canvas.pixel[i,j]:=(image1.canvas.pixel[i+1,j]
image1.canvas.pixel[i-1,j]+image1.canvas.pixel[i,j-1]
image1.canvas.pixel[i,j+1]) div 4;
end;
end;
end.
程序对有些图片处理的效果很好,但好多的图片被处理成花色,尤其是对那些
色彩和边缘比较丰富的图片。我又用了“/”代替"div ",但系统提示出错,请
各位指点一二。我愿意出我的分数的一半。
 
/ 是浮点数除
div 是整除
 
我知道div是整除,/是浮点数除。
 
是pixels而不是pixel吧?

TCanvas的Pixels属性是Tcolor类型而不是一般的整型,运算起来比较特殊,可能这是导致用除号出错的原因(只是猜的)。
 
Pixels属性是整型,而运算表达式的结果却可能是浮点型,当然会出错了。
另外,你是采用局部平均法进行图像平滑的吧? 此算法似乎要包含中心点,
而不仅仅是相邻点。
for i:=0 to image1.width do
for j:=0 to image1.height do
image2.canvas.pixel[i,j]:=(image1.canvas.pixel[i+1,j]
image1.canvas.pixel[i-1,j]+image1.canvas.pixel[i,j-1]
image1.canvas.pixel[i,j+1]+image1.canvas.pixel[i,j])
div 5;

若效果还不理想, 试试换一个平滑模板
1 1 1 1 2 1
1/10 * 1 2 1 或 1/16 * 2 4 2
1 1 1 1 2 1
 
后两种模板对各点加权,应该能够可以突出边缘。
 
cheka:有没有中心点结果是一样的。你的平滑模板做出来的结果还是那样。
怎么办?
有没有更好的方法(我是指用Delphi,不用其他语言)?
 

嘿嘿,知道了,彩色位图的TColor值是由R,G,B三者构成的,
不能简单的相加平均(处理灰度图像就不存在这一问题)。
否则便会出现各种颜色的混淆,就是“花色”了。正确的
办法是先把TColor拆解成R,G,B。

拆解代码如下

TempColor := ColorToRGB(TheColor);
B := (TempColor and $FF0000) shr 16;
G := (TempColor and $FF00) shr 8;
R := (TempColor and $FF);

然后用你的模板依次处理R,G,B三个值即可

 
agree cheka,我以前用vb时也曾这样作过。
这种算法不需要对中心点加权。
 
另外补充一下,把RGB分别处理完了后,要重新合成为TColor.
方法为拆解的逆操作
 
谢谢cheka,我接受你的答案。
 

Similar threads

S
回复
0
查看
896
SUNSTONE的Delphi笔记
S
S
回复
0
查看
873
SUNSTONE的Delphi笔记
S
后退
顶部