奇趣技术网 收藏本站
设为主页
商务合作
首页 新闻中心 行业动态 软件新闻 安全资讯 病毒预警 漏洞发布 操作系统 Dos Win9x Win2000 WinXP Win2003 WinVista Linux Unix
数据库 DB2 Access MSSQL MySQL Oracle Sybase 编程技术 ASP PHP JSP CGI/Perl XML .Net C/C++/C# VB VC Delphi Java 汇编
安全技术 安全教学 工具介绍 漏洞利用 病毒防范 入侵检测 防火墙 安全防范 汉化破解 攻击实例 加密解密 技术论坛
中华网络安全联盟 >> 程序开发 >> Delphi >> 黑白图像的缩小灰度级显示算法的编写
程序开发
Asp
PHP
JSP
CGI/Perl
XML
.Net
C/C++/C#
Visual Basic
Visual C++
Delphi
Java
汇编语言
  • Delphi实现网页表单数

  • 用Delphi开发Web服务数

  • Delphi中利用钩子实现

  • 一个判断定文件是否为

  • 把Flash文件转换为Exe

  • 用Delphi实现文件下载

  • Delphi中保存图像列表

  • 基于Delphi的接口编程

  • 黑白图像的缩小灰度级显示算法的编写
    字体:

    中华网络安全联盟    作者:佚名    来源:网络转载    时间:2006-3-22

    大家都知道,黑白图像是0,1二值的,缩小显示的时候由于n个点转化成1个点会导致图像局部细节信息丢失,比如一条宽度一个象素的细线由于缩小可能就会没有显示,而使用灰度级显示正是能解决这个缩小显示的问题,Windows自带的Eastman Software提供的的图像处理可以在你缩小黑白图片的时候使用灰度级来显示,下面我们就来深入研究一下这个算法是如何实现的吧。



    基本约定:

    1.  灰度级缩小显示只正对黑白或者灰度影像,经过算法变换可用于彩色影像

    2.  只有在显示<100%的时候灰度级显示才生效

    3.  灰度级缩小算法是基于原始图像来运算

    具体算法:

    1.  缩小算法

    按照与原图比例1:n来对原图nXn个点生成1个点(n可以是浮点数),考虑到效率可以使用灰度级变换,从0-255 取中间点127大于该值显示白小于改值显示黑色。

    2.  灰度级显示算法

    结合缩小算法nXn个点生成一个点的原则,在原图上按照每个点的权值和颜色相乘再除以n来得到生成点的颜色值。

    例如:

    a1  a2   a3  a4  a5  a6   a7  a8  a9 a10

    |-----|---*-|-----|-*---|-----|*----|-----*-----|-----|-----|



    |---------|---------|----------|----------|----------|---------|--

    b1    b2     b3     b4     b5     b6

    经过变换后

    b1 = (1.0*a1+0.8*a2)/1.8

    b2 = (0.2*a2+a3+0.6*a3)/1.8

    ……



    这是一维坐标,扩展到二维空间算法相同。

    具体实现方法:

    1.  计算出缩小后的位图点阵大小(nXm)

    比如原图100X100,缩放90%之后就是90X90点阵

    2.  循环点阵,为每个点的颜色赋值

    赋值方法取相关点颜色乘以相应权值累加除以权值和




    原图




    缩放为66.6%




    计算每点值



    Delphi代码如下



    var

      i,j:integer;

      tmpColorR,tmpColorG,tmpColorB:dWord;

      x,y:integer;

      ScaleRate,ScaleRateX,ScaleRateY:real;

    begin

           //combobox1.text为缩放%

      ScaleRate:=100/strtoFloatDef(combobox1.text,100);

    //循环生成图像的点阵

      for i:=0 to  trunc(image1.Picture.Width/ScaleRate) do

        for j:=0 to  trunc(image1.Picture.height/ScaleRate) do

          begin

            tmpColorR:=0;

            tmpColorG:=0;

            tmpColorB:=0;

                  //为每个点累加相关节点的颜色

            for x:=trunc(i*ScaleRate) to  ceil(((i+1)*ScaleRate)-1) do

              begin

                for y:=trunc(j*ScaleRate) to ceil(((j+1)*ScaleRate)-1) do

                  begin

                    ScaleRateX:=Min(x+1,(i+1)*ScaleRate) - Max(x,i*ScaleRate);

                    ScaleRateY:=Min(y+1,(j+1)*ScaleRate) - Max(y,j*ScaleRate);

                  //取每个点的RGB值(如果是黑白或者灰度,只需要取得一位)

                    tmpColorR:=tmpColorR+trunc(ScaleRateX*ScaleRateY*(GetRValue(Image1.Canvas.Pixels[x,y])));

                    tmpColorG:=tmpColorG+trunc(ScaleRateX*ScaleRateY*(GetGValue(Image1.Canvas.Pixels[x,y])));

                    tmpColorB:=tmpColorB+trunc(ScaleRateX*ScaleRateY*(GetBValue(Image1.Canvas.Pixels[x,y])));

                  end;

              end;

    //为点赋值颜色

            image2.Canvas.Pixels[i,j]:=RGB(trunc(tmpColorR/(ScaleRate*ScaleRate)),trunc(tmpColorG/(ScaleRate*ScaleRate)),trunc(tmpColorB/(ScaleRate*ScaleRate)));

          end;


    这个算法是我写的第一版本,还有很多优化余地,比如如果是黑白图像就不需要计算R G B,因为256级灰度全部是相同的
    另外for循环中的表达式可能影像速度,还有用整数运算会比浮点快,等等。

    字体:
     
    设为主页 收藏本站 联系我们 友情连接 商务合作 网友留言
    Copyright©2006-2008 中华网络安全联盟 All rights reserved.