黑白圖像的縮小灰度級(jí)顯示算法的編寫(xiě)
發(fā)表時(shí)間:2024-06-15 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]大家都知道,黑白圖像是0,1二值的,縮小顯示的時(shí)候由于n個(gè)點(diǎn)轉(zhuǎn)化成1個(gè)點(diǎn)會(huì)導(dǎo)致圖像局部細(xì)節(jié)信息丟失,比如一條寬度一個(gè)象素的細(xì)線由于縮小可能就會(huì)沒(méi)有顯示,而使用灰度級(jí)顯示正是能解決這個(gè)縮小顯示的問(wèn)題,Windows自帶的Eastman Software提供的的圖像處理可以在你縮小黑白圖片的時(shí)候使用灰...
大家都知道,黑白圖像是0,1二值的,縮小顯示的時(shí)候由于n個(gè)點(diǎn)轉(zhuǎn)化成1個(gè)點(diǎn)會(huì)導(dǎo)致圖像局部細(xì)節(jié)信息丟失,比如一條寬度一個(gè)象素的細(xì)線由于縮小可能就會(huì)沒(méi)有顯示,而使用灰度級(jí)顯示正是能解決這個(gè)縮小顯示的問(wèn)題,Windows自帶的Eastman Software提供的的圖像處理可以在你縮小黑白圖片的時(shí)候使用灰度級(jí)來(lái)顯示,下面我們就來(lái)深入研究一下這個(gè)算法是如何實(shí)現(xiàn)的吧。
基本約定:
1. 灰度級(jí)縮小顯示只正對(duì)黑白或者灰度影像,經(jīng)過(guò)算法變換可用于彩色影像
2. 只有在顯示<100%的時(shí)候灰度級(jí)顯示才生效
3. 灰度級(jí)縮小算法是基于原始圖像來(lái)運(yùn)算
具體算法:
1. 縮小算法
按照與原圖比例1:n來(lái)對(duì)原圖nXn個(gè)點(diǎn)生成1個(gè)點(diǎn)(n可以是浮點(diǎn)數(shù)),考慮到效率可以使用灰度級(jí)變換,從0-255 取中間點(diǎn)127大于該值顯示白小于改值顯示黑色。
2. 灰度級(jí)顯示算法
結(jié)合縮小算法nXn個(gè)點(diǎn)生成一個(gè)點(diǎn)的原則,在原圖上按照每個(gè)點(diǎn)的權(quán)值和顏色相乘再除以n來(lái)得到生成點(diǎn)的顏色值。
例如:
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
----- ---*- ----- -*--- ----- *---- -----*----- ----- -----
--------- --------- ---------- ---------- ---------- --------- --
b1 b2 b3 b4 b5 b6
經(jīng)過(guò)變換后
b1 = (1.0*a1+0.8*a2)/1.8
b2 = (0.2*a2+a3+0.6*a3)/1.8
……
這是一維坐標(biāo),擴(kuò)展到二維空間算法相同。
具體實(shí)現(xiàn)方法:
1. 計(jì)算出縮小后的位圖點(diǎn)陣大小(nXm)
比如原圖100X100,縮放90%之后就是90X90點(diǎn)陣
2. 循環(huán)點(diǎn)陣,為每個(gè)點(diǎn)的顏色賦值
賦值方法取相關(guān)點(diǎn)顏色乘以相應(yīng)權(quán)值累加除以權(quán)值和
原圖
縮放為66.6%
計(jì)算每點(diǎn)值
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)生成圖像的點(diǎ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;
//為每個(gè)點(diǎn)累加相關(guān)節(jié)點(diǎn)的顏色
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);
//取每個(gè)點(diǎn)的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;
//為點(diǎn)賦值顏色
image2.Canvas.Pixels[i,j]:=RGB(trunc(tmpColorR/(ScaleRate*ScaleRate)),trunc(tmpColorG/(ScaleRate*ScaleRate)),trunc(tmpColorB/(ScaleRate*ScaleRate)));
end;
這個(gè)算法是我寫(xiě)的第一版本,還有很多優(yōu)化余地,比如如果是黑白圖像就不需要計(jì)算R G B,因?yàn)?56級(jí)灰度全部是相同的
另外for循環(huán)中的表達(dá)式可能影像速度,還有用整數(shù)運(yùn)算會(huì)比浮點(diǎn)快,等等。