亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

VB圖像處理之二次線性插值的應用

2019-11-18 17:41:29
字體:
來源:轉載
供稿:網友
上次講到了用DIB方法來獲取圖像的像素。從這次開始將如果運用已經得到的像素來處理圖像。

  圖像插值放大的方法有很多,最主要的有二次線性插值和三次線性插值這兩種。這次我把自己的程序中所用的二次線性插值的算法公布給大家,希望對各位要使用VB寫類似程序的朋友有所幫助。

  程序中用到的API、數據類型、全局變量的定義請參考上一篇:《VB實現圖像在數據庫的存儲與顯示》

->PublicSubZoomImage(ByValOutPutWidthAsLong,ByValOutputHeightAsLong)
 DimIAsLong
 DimLAsLong
 DimXAsLong
 DimYAsLong
 DimXbAsLong
 DimYbAsLong
 DimXeAsLong
 DimYeAsLong
 DimMAsInteger
 DimNAsInteger
 DimCurRAsLong
 DimCurGAsLong
 DimCurBAsLong
 DimNxtRAsInteger
 DimNxtGAsInteger
 DimNxtBAsInteger
 DimDRAsSingle
 DimDGAsSingle
 DimDBAsSingle
 DimDRtAsSingle
 DimDGtAsSingle
 DimDBtAsSingle
 DimXratioAsSingle
 DimYratioAsSingle
 DimCurStepAsSingle
 DimNxtStepAsSingle
 DimNegNAsSingle

 OnErrorGoToErrLine
 IfNotCanZoomThenExitSub
 Done=False

 OutPutWid=OutPutWidth-1
 OutPutHei=OutputHeight-1
 I=(Bits/8)-1
 ReDimColTmp(I,InPutWid,OutPutHei)'先從Y方向進行縮放處理,結果保存在此中間數組內
 ReDimColOut(I,OutPutWid,OutPutHei)
 Xratio=OutPutWid/InPutWid
 Yratio=OutPutHei/InPutHei

 TimeZoom=timeGetTime

 NegN=1/Int(Yratio 1)
 ForX=0ToInPutWid
  CurR=ColVal(0,X,0)
  CurG=ColVal(1,X,0)
  CurB=ColVal(2,X,0)
  CurStep=0
  NxtStep=0
  ForY=0ToInPutHei-1
   NxtStep=CurStep Yratio
   Yb=CurStep
   Ye=NxtStep
   N=Ye-Yb
   ColTmp(0,X,Yb)=CurR
   ColTmp(1,X,Yb)=CurG
   ColTmp(2,X,Yb)=CurB
   M=Y 1
   NxtR=ColVal(0,X,M)
   NxtG=ColVal(1,X,M)
   NxtB=ColVal(2,X,M)
   IfN>1Then
    DRt=(NxtR-CurR)*NegN
    DGt=(NxtG-CurG)*NegN
    DBt=(NxtB-CurB)*NegN
    DR=0
    DG=0
    DB=0
    ForL=Yb 1ToYe-1
     DR=DR DRt
     DG=DG DGt
     DB=DB DBt
     ColTmp(0,X,L)=CurR DR
     ColTmp(1,X,L)=CurG DG
     ColTmp(2,X,L)=CurB DB
    Next
   EndIf
   CurStep=NxtStep
   CurR=NxtR
   CurG=NxtG
   CurB=NxtB
  Next
  ColTmp(0,X,OutPutHei)=NxtR
  ColTmp(1,X,OutPutHei)=NxtG
  ColTmp(2,X,OutPutHei)=NxtB
 Next

 NegN=1/Int(Xratio 1)
 ForY=0ToOutPutHei
  CurR=ColTmp(0,0,Y)
  CurG=ColTmp(1,0,Y)
  CurB=ColTmp(2,0,Y)
  CurStep=0
  NxtStep=0
  ForX=0ToInPutWid-1
   NxtStep=CurStep Xratio
   Xb=CurStep
   Xe=NxtStep
   N=Xe-Xb
   ColOut(0,Xb,Y)=CurR
   ColOut(1,Xb,Y)=CurG
   ColOut(2,Xb,Y)=CurB
   M=X 1
   NxtR=ColTmp(0,M,Y)
   NxtG=ColTmp(1,M,Y)
   NxtB=ColTmp(2,M,Y)
   IfN>1Then
    DRt=(NxtR-CurR)*NegN
    DGt=(NxtG-CurG)*NegN
    DBt=(NxtB-CurB)*NegN
    DR=0
    DG=0
    DB=0
    ForL=Xb 1ToXe-1
     DR=DR DRt
     DG=DG DGt
     DB=DB DBt
     ColOut(0,L,Y)=CurR DR
     ColOut(1,L,Y)=CurG DG
     ColOut(2,L,Y)=CurB DB
    Next
   EndIf
   CurStep=NxtStep
   CurR=NxtR
   CurG=NxtG
   CurB=NxtB
  Next
  ColOut(0,OutPutWid,Y)=NxtR
  ColOut(1,OutPutWid,Y)=NxtG
  ColOut(2,OutPutWid,Y)=NxtB
 Next

 Done=True
 TimeZoom=timeGetTime-TimeZoom
 CanPut=True
 ExitSub
ErrLine:
 MsgBoxErr.Descr

  簡單解釋一下關于二次線性插值算法。

  (為了說明算法本身,我們只計算這個圖片的紅色分量,因為紅綠藍三種顏色的計算方法完全相同)

  假設我們有一個很簡單的圖片,圖片只有4個像素(2*2)

->AB
CD->

  現在我們要把這個圖片插值到9個像素:3*3

->AabB
acabcdbd
CcdD->

  其中大寫的字母代表原來的像素,小寫字母代表插值得到的新像素。

  想必看到這個圖,大家心里已經有了這個算法了。

->ab=(A B)/2
cd=(C D)/2
ac=(A C)/2
bd=(B D)/2
abcd=(ab cd)/2=(A B C D)/4->

  推導:

->ab=A (B-A)/2
cd=C (D-C)/2
...->

  很簡單,對吧,先從一個方向把只涉及兩個原始像素的新像素算出來。我們這里假定先計算水平方向。而在算垂直方向的插值的時候,因為ab和cd已經在前面算好了,所以abcd的計算也和計算ac和bd沒有任何區別了。

  有可能為有朋友已經想到把原來的圖像插值到4*4或5*5的方法了。

->Aab1ab2B
ac1ab1cd11ab2cd21bd1
ac2ab1cd12ab2cd22bd2
Ccd1cd2D->

  推導:

->ab1=A (B-A)*1/3
ab2=A (B-A)*2/3=ab1 (B-A)/3
cd1=C (D-C)*1/3
cd1=C (D-C)*2/3=cd1 (D-C)/3
...->

  以A和B為例,先求出原始像素的差(A-B)再算出每一步的遞增量(A-B)/3;然后每一個新的點就是在前面那個點的值加上這個遞增量就是了。

  這里我們假設A=100,B=255放大倍率為3,水平方向插值;先計算出原始像素的差:(B-A)=255-100=155

  再計算出水平方向每一步的遞增量:(A-B)/3=155/3=51.7

  這里我們用一個變量DRt來記錄這個遞增量(這里只用紅色來做例子)

->ab1=A DRt=100 51.7=151
ab2=ab1 DRt=151 51.7=202->

  好了,其實二次線性算法就是這么一個東西,并不復雜?;蛟S有寫朋友會對于我給出的代碼產生疑問。很簡單的一個算法為什么要寫這么多代碼。

  其實答案很簡單:為了提高速度。

  在VB中“ ”和“-”永遠是最快的,“*”要比“/”和“/”快。不論是什么類型的變量都是這樣的。

  下面再來分析一下我的程序。

  在我的程序中把兩個方向的插值分解成了兩個單獨的部分。

  先把

->AB
CD->

  變成:

->Aab1...abNB
Ccd1...cdND->

  再變成:

->Aab1...abNB
ac1.............db1
..................
acN..............bdN
Ccd1...cdND->

  這兩個方向的插值算法完全相同

  而Xratio和Yratio這兩個變量則用來記錄水平方向和垂直方向的放大倍率。所以這個過程也能夠讓圖像縮放不按照原始的縱橫比進行。

  好了,將這個模塊和全局變量添加到上次建立的工程模塊中。

  把按鈕中的代碼改成:

->subcommand1_click()
 Withpicture1
  .ScaleMode=3
  .BorderStyle=0
  DibGet.hdc,0,0,.scalewidth,.scaleheight
  ZoomImage,.scalewidth*2,.scaleheight*2
 EndWith
 picture2.AutoRedraw=True
 DibPutpicture2.hdc
 picture2.refresh
endsub->

  圖像是否已經放大到原來的兩倍了呢?速度不算很慢吧?

  什么?很慢?先編譯成EXE再運行吧。下面是效果圖:

  原圖:

->->

  二次線性插值放大5倍:

->->

  關于二次線性插值就說到這里了->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久这里只有精品| 欧美日韩国产一区二区三区| 国产亚洲欧洲高清| 国产精品久久一区| 国产99久久精品一区二区 夜夜躁日日躁| 日韩av在线直播| 一区二区三区无码高清视频| 亚洲欧洲在线播放| 最新国产成人av网站网址麻豆| 久久中文字幕在线| 69av视频在线播放| 91精品久久久久久久久久久久久| 97人人做人人爱| 国产成人在线精品| 亚洲国产美女久久久久| 亚洲日韩欧美视频| 久久人人爽人人爽人人片亚洲| xxav国产精品美女主播| 国产日韩综合一区二区性色av| 欧美日韩国产一区在线| 亚洲国产古装精品网站| 91精品在线看| 日韩国产在线播放| 亚洲精品久久久久国产| 亚洲电影免费观看高清| 亚洲va久久久噜噜噜久久天堂| 成人精品在线观看| 97视频网站入口| 91视频国产高清| 日韩一区av在线| 精品亚洲夜色av98在线观看| 欧美老女人bb| 国产精品jvid在线观看蜜臀| 亚洲一区二区三区久久| 国产网站欧美日韩免费精品在线观看| 不用播放器成人网| 97久久精品人搡人人玩| 久久精品视频在线观看| 欧美日韩国产一中文字不卡| 日韩电影在线观看永久视频免费网站| 国内精品中文字幕| 亚洲日本中文字幕| 一区二区三区视频观看| 91精品国产色综合久久不卡98| 亚洲女同精品视频| 91精品国产乱码久久久久久蜜臀| 亚洲黄色av网站| 亚洲缚视频在线观看| 国产精品h在线观看| 日韩欧美视频一区二区三区| 欧美成人中文字幕| 国产精品久久二区| 91久久精品美女高潮| 亚洲国产精品久久久| 国产视频精品久久久| 欧美大尺度在线观看| 国产v综合ⅴ日韩v欧美大片| 精品日韩视频在线观看| 2019中文字幕免费视频| 亚洲自拍偷拍区| 亚洲精品不卡在线| 57pao国产成人免费| 日韩电影中文 亚洲精品乱码| 亚洲最大成人免费视频| 国产成人短视频| 久久久久女教师免费一区| 精品香蕉在线观看视频一| 国产日韩欧美在线看| 北条麻妃在线一区二区| 国产在线视频一区| 国产69久久精品成人| 亚洲自拍偷拍网址| 日韩欧美在线观看视频| 成人激情视频在线| 国产97色在线| 国产成人精品免费久久久久| 成人欧美一区二区三区黑人孕妇| 日韩电影免费观看在线| 久99久在线视频| 国产精品视频永久免费播放| 亚洲男人av在线| 久久精品视频播放| 2019亚洲男人天堂| 久久99精品久久久久久青青91| 欧美激情视频一区| 亚洲91精品在线| 一个人看的www欧美| 九九久久久久久久久激情| 国产精品久久久久久网站| 91精品国产91| 国内免费久久久久久久久久久| 精品国产一区二区三区久久久狼| 欧美激情欧美激情| 日韩精品高清在线| 久久精品视频播放| 日本一区二区三区在线播放| 久久综合网hezyo| 亚洲视频在线免费观看| 91精品在线观看视频| 国产视频亚洲精品| 精品无人区乱码1区2区3区在线| 97精品久久久中文字幕免费| 中文字幕亚洲一区二区三区五十路| 色一情一乱一区二区| 亚洲精品456在线播放狼人| 久久久精品2019中文字幕神马| 亚洲色无码播放| 国产91色在线|免| 成人免费自拍视频| 色悠久久久久综合先锋影音下载| 伊人久久久久久久久久久久久| 91av在线看| 国产精品毛片a∨一区二区三区|国| 久久香蕉国产线看观看av| 日本19禁啪啪免费观看www| 国产日韩欧美成人| 国产一区香蕉久久| 国产日产久久高清欧美一区| 亚洲男人天堂久| 日本精品va在线观看| 亚洲国产古装精品网站| 国产成人精品在线| 欧美精品一区在线播放| 国产日韩一区在线| 欧美插天视频在线播放| 欧美xxxx做受欧美.88| 国产一区二区视频在线观看| 久久人体大胆视频| 国产国语videosex另类| 欧美日韩不卡合集视频| 久久不射热爱视频精品| 成人国产精品色哟哟| 欧美激情第一页xxx| 亚洲综合精品伊人久久| 91精品国产99| 日韩av免费看网站| 国产视频精品自拍| 欧美视频免费在线| 日韩在线视频免费观看高清中文| 91中文字幕在线观看| 亚洲人午夜精品免费| 欧美精品www在线观看| 亚洲老头同性xxxxx| 日韩毛片在线看| 精品一区二区三区四区在线| 欧美一级成年大片在线观看| 亚洲国产日韩欧美在线99| 国产欧美日韩精品丝袜高跟鞋| 国产98色在线| 欧美精品日韩www.p站| 国产精品中文在线| 伊人久久免费视频| 亚洲跨种族黑人xxx| 亚洲精品国产综合久久| 欧美黄色小视频| 国产亚洲欧洲在线| 国产精品美乳在线观看| 久久久久国产一区二区三区| 欧美成人中文字幕在线| 亚洲免费视频网站| 久久久av亚洲男天堂| 成人国产精品久久久久久亚洲| 26uuu日韩精品一区二区| 在线一区二区日韩|