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

2016-02-19 18:48 10 1 收藏

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

【 tulaoshi.com - 编程语言 】

 

  大家都知道,黑白图像是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" />

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

2.  灰度级显示算法

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

例如:

a1  a2   a3  a4  a5  a6   a7  a8  a9 a10

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

 

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

b1    b2     b3     b4     b5     b6

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

经过变换后

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;

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

来源:http://www.tulaoshi.com/n/20160219/1619058.html

延伸阅读
标签: PS 电脑
1、打开Photoshop,随便导入一张图片。作为操作前的准备。 2、在当前图像中,不论图像处于何种编辑情况下,按Ctrl + 空格键,不松手,点击鼠标左键----每当点击一次,就放大一次;按住鼠标左键不松手(在PS CS5中操作),图像就一直变大;按下鼠标左键并拖动,图像快速变大, 3、按住“空格键”不松手,鼠标变成抓手工具形状了。 4、缩小...
用Authorware开发多媒体作品,自然不能少了图片的显示。通常我们是用框架图标,把要显示的图片依次导入。这样做非常麻烦,每一幅图片要依次导入,逐个设置显示方式,这且不说,万一下次要显示不同的图片时,还得重新导入、设置,非常烦琐。那么,能不能让Authorware显示指定文件夹里的图片呢?这样,就用不着每次都要导入了,只要指定图片所在...
PS给黑白图像的快速上色及更换背景 教程上色部分比较简单,直接用一个渐变映射上好底色,微调一下细节颜色,增加一些彩妆即可。不过在上色之前作者把人物抠取出来,这样换背景就非常方便。 原图 photoshop教程最终效果 1、双击背景图像,解锁。点击图层面板下面的小文件夹图标新建一个组,命名组女孩,把背...
图像显示是程序设计中必不可少的内容。我们可使用VB中的图片框控制或图像控制进行图像显示的操作,但它的显示属于直接显示,不像一些多媒体制作系统(如Authorware)那样对图像的显示提供多种效果。具有一定效果的图像显示能给用户以新颖、难忘的感觉。 如何利用VB设计图像的显示效果是本文讨论的内容。 首先我们来了解一下图像的显示效果:...
以下是作品原稿,以及四种不同的转化为灰度的方法以供比较。 转化为灰度 这可能是最快捷,至少是最通用的方法。选择作品然后使用 编辑-编辑颜色-转换为灰度。 调整色彩平衡 这种方法可对黑色进行更多的控制。选中作品,使用 编辑-编辑颜色-调整色彩平衡 。 从下拉菜单中选择灰度,点击预览和转换的复选框,即可使用滑动条调整黑色的...

经验教程

978

收藏

8
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部