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

W是辽源人

W是辽源人

2016-02-19 18:48

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享黑白图像的缩小灰度级显示算法的编写,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。
 

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

基本约定:

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

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

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

具体算法:

1.  缩小算法

按照与原图比例1n来对原图nXn个点生成1个点(n可以是浮点数),考虑到效率可以使用灰度级变换,从0-255 取中间点127大于该值显示白小于改值显示黑色。?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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.  循环点阵,为每个点的颜色赋值

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

  ?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 
  

原图

  
  

缩放为66.6%
  
  
  

计算每点值
  
  

Delphi代码如下

 

var

  i,j:integer;

  tmpColorR,tmpColorG,tmpColorB:dWord;

  x,y:integer;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  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;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

        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循环中的表达式可能影像速度,还有用整数运算会比浮点快,等等。
  
  

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
黑白图像的缩小灰度级显示算法的编写

如何在VB中直接显示无格式256灰度级图像

编程语言 网络编程
如何在VB中直接显示无格式256灰度级图像

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

VC编程实现灰度图像与彩色图像的相互转换

编程语言 网络编程
VC编程实现灰度图像与彩色图像的相互转换

解析数码摄影黑白照片的灰度管理

平面设计 海报设计 广告设计 画报设计 签名设计 服装设计 名片设计 画册设计 版式设计 商标设计
解析数码摄影黑白照片的灰度管理

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

将iPhone转换灰度显示

手机软件
将iPhone转换灰度显示

VB图像处理之铅笔画算法和木雕算法

编程语言 网络编程
VB图像处理之铅笔画算法和木雕算法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

理解才能创新 轻松打造自己的AJAX框架

理解才能创新 轻松打造自己的AJAX框架

delphi的调用约定

delphi的调用约定
下拉加载更多内容 ↓