国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

黑白圖像的縮小灰度級顯示算法的編寫

2019-11-18 18:04:45
字體:
供稿:網(wǎng)友
 

大家都知道,黑白圖像是0,1二值的,縮小顯示的時候由于n個點轉(zhuǎn)化成1個點會導致圖像局部細節(jié)信息丟失,比如一條寬度一個象素的細線由于縮小可能就會沒有顯示,而使用灰度級顯示正是能解決這個縮小顯示的問題,Windows自帶的Eastman Software提供的的圖像處理可以在你縮小黑白圖片的時候使用灰度級來顯示,下面我們就來深入研究一下這個算法是如何實現(xiàn)的吧。

基本約定:

1.  灰度級縮小顯示只正對黑白或者灰度影像,經(jīng)過算法變換可用于彩色影像

2.  只有在顯示<100%的時候灰度級顯示才生效

3.  灰度級縮小算法是基于原始圖像來運算

具體算法:

1.  縮小算法

按照與原圖比例1n來對原圖nXn個點生成1個點(n可以是浮點數(shù)),考慮到效率可以使用灰度級變換,從0-255 取中間點127大于該值顯示白小于改值顯示黑色。

2.  灰度級顯示算法

結(jié)合縮小算法nXn個點生成一個點的原則,在原圖上按照每個點的權(quán)值和顏色相乘再除以n來得到生成點的顏色值。

例如:

a1  a2   a3  a4  a5  a6   a7  a8  a9 a10

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

 

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

b1    b2     b3     b4     b5     b6

經(jīng)過變換后

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

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

……

 

這是一維坐標,擴展到二維空間算法相同。

具體實現(xiàn)方法:

1.  計算出縮小后的位圖點陣大小(nXm)

比如原圖100X100,縮放90%之后就是90X90點陣

2.  循環(huán)點陣,為每個點的顏色賦值

賦值方法取相關(guān)點顏色乘以相應權(quán)值累加除以權(quán)值和

 

原圖


縮放為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);

//循環(huán)生成圖像的點陣

  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;

              //為每個點累加相關(guān)節(jié)點的顏色

        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;


這個算法是我寫的第一版本,還有很多優(yōu)化余地,比如如果是黑白圖像就不需要計算R G B,因為256級灰度全部是相同的
另外for循環(huán)中的表達式可能影像速度,還有用整數(shù)運算會比浮點快,等等。


上一篇:帖個HOOK鼠標滾輪滾動的DLL

下一篇:如何在DBGRID或者STRINGGRID中實現(xiàn)用滾輪進行翻頁的功能,就象瀏覽網(wǎng)頁一樣

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 太仓市| 皋兰县| 壤塘县| 鹿泉市| 吉水县| 隆化县| 思南县| 陵川县| 南丹县| 盐池县| 凤城市| 茶陵县| 资中县| 翁牛特旗| 延川县| 吉林市| 北宁市| 神池县| 梨树县| 浪卡子县| 眉山市| 蓬溪县| 宝鸡市| 南京市| 莱西市| 阳西县| 巴里| 纳雍县| 景东| 东乌| 桃园市| 永德县| 太仆寺旗| 陕西省| 汽车| 浏阳市| 施秉县| 巴楚县| 金秀| 甘肃省| 山丹县|