用point?方法太慢了,還是用api的getDIBits和setDIBits吧,彩圖轉(zhuǎn)灰度圖的代碼如下:
西區(qū)網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),西區(qū)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為西區(qū)1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的西區(qū)做網(wǎng)站的公司定做!
Private?Declare?Function?GetBitmapBits?Lib?"gdi32"?(ByVal?hBitmap?As?Long,?ByVal?dwCount?As?Long,?lpBits?As?Any)?As?Long
Private?Declare?Function?SetBitmapBits?Lib?"gdi32"?(ByVal?hBitmap?As?Long,?ByVal?dwCount?As?Long,?lpBits?As?Any)?As?Long
Private?Declare?Function?GetDIBits?Lib?"gdi32"?(ByVal?aHDC?As?Long,?ByVal?hBitmap?As?Long,?ByVal?nStartScan?As?Long,?ByVal?nNumScans?As?Long,?lpBits?As?Any,?lpBI?As?BitMapInfo,?ByVal?wUsage?As?Long)?As?Long
Private?Declare?Function?SetDIBits?Lib?"gdi32"?(ByVal?hdc?As?Long,?ByVal?hBitmap?As?Long,?ByVal?nStartScan?As?Long,?ByVal?nNumScans?As?Long,?lpBits?As?Any,?lpBI?As?BitMapInfo,?ByVal?wUsage?As?Long)?As?Long
Private?Type?BitMapInfoHeader?''文件信息頭——BITMAPINFOHEADER
biSize?As?Long
biWidth?As?Long
biHeight?As?Long
biPlanes?As?Integer
biBitCount?As?Integer
biCompression?As?Long
biSizeImage?As?Long
biXPelsPerMeter?As?Long
biYPelsPerMeter?As?Long
biClrUsed?As?Long
biClrImportant?As?Long
End?Type
Private?Type?RGBQuad
rgbBlue?As?Byte
rgbGreen?As?Byte
rgbRed?As?Byte
''rgbReserved?As?Byte
End?Type
Private?Type?BitMapInfo
bmiHeader?As?BitMapInfoHeader
bmiColors?As?RGBQuad
End?Type
Private?Sub?Command1_Click()
Dim?ix?As?Integer
Dim?iy?As?Integer
Dim?iWidth?As?Integer?'以像素為單位的圖形寬度
Dim?iHeight?As?Integer?'以像素為單位的圖形高度
Dim?bytGray?As?Byte
Dim?bytThreshold?As?Byte
Dim?bits()?As?Byte?'三維數(shù)組,用于獲取原彩色圖像中各像素的RGB數(shù)值以及存放轉(zhuǎn)化后的灰度值
Dim?bitsBW()?As?Byte?'三維數(shù)組,用于存放轉(zhuǎn)化為黑白圖后各像素的值
'獲取圖形的寬度和高度
iWidth?=?Picture1.ScaleWidth?/?Screen.TwipsPerPixelX
iHeight?=?Picture1.ScaleHeight?/?Screen.TwipsPerPixelY
Picture1.Picture?=?Picture1.Image
'創(chuàng)建并初始化一個(gè)bitMapInfo自定義類(lèi)型
Dim?bi24BitInfo?As?BitMapInfo
With?bi24BitInfo.bmiHeader
.biBitCount?=?32
.biCompression?=?0
.biPlanes?=?1
.biSize?=?Len(bi24BitInfo.bmiHeader)
.biWidth?=?iWidth
.biHeight?=?Picture1.ScaleHeight?/?Screen.TwipsPerPixelY
End?With
'重新定義數(shù)組大小
ReDim?bits(3,?0?To?iWidth,?0?To?iHeight)?As?Byte
ReDim?bitsBW(3,?0?To?iWidth,?0?To?iHeight)?As?Byte
'使用GetDIBits方法一次性獲取picture1中各點(diǎn)的rgb值,比point方法或getPixel函數(shù)逐像素獲取像素rgb要快出一個(gè)數(shù)量級(jí)
lrtn?=?GetDIBits(Picture1.hdc,?Picture1.Picture.Handle,?0,?iHeight,?bits(0,?0,?0),?bi24BitInfo,?0)
'數(shù)組的三個(gè)維度分別代表像素的RGB分量、以圖形左下角為原點(diǎn)的X和Y坐標(biāo)。
'具體說(shuō)來(lái),這時(shí)bits(0,2,3)代表從圖形左下角數(shù)起橫向第2個(gè)縱向第3個(gè)像素的Blue值,而bits(1,2,3)和bits(2,2,3)分別的Green值和Red值.
bytThreshold?=?128?'這里定義轉(zhuǎn)換為黑白圖像時(shí)的閾值為128,即灰色亮度大于128的像素轉(zhuǎn)為白色,小于128的像素轉(zhuǎn)為黑的,此值可根據(jù)需要修改為0-255之前任意數(shù)值
For?ix?=?0?To?iWidth
For?iy?=?0?To?iHeight
'***********RGB轉(zhuǎn)為灰度的算法有多種,這里給出常見(jiàn)的兩種*******
'bytGray?=?bits(0,?ix,?iy)?*?0.11?+?bits(1,?ix,?iy)?*?0.59?+?bits(2,?ix,?iy)?*?0.3?'這是傳統(tǒng)的根據(jù)三原色亮度加權(quán)得到灰階的算法
bytGray?=?(bits(0,?ix,?iy)?^?2.2?*?0.0722?+?bits(1,?ix,?iy)?^?2.2?*?0.7152?+?bits(2,?ix,?iy)?^?2.2?*?0.2126)?^?(1?/?2.2)?'這是簡(jiǎn)化?sRGB?IEC61966-2.1?[gamma=2.20],有點(diǎn)類(lèi)似于photoshop中所用的算法
bits(0,?ix,?iy)?=?bytGray
bits(1,?ix,?iy)?=?bytGray
bits(2,?ix,?iy)?=?bytGray
'*********轉(zhuǎn)為黑白圖像********
If?bits(0,?ix,?iy)??bytThreshold?Then
bitsBW(0,?ix,?iy)?=?0
bitsBW(1,?ix,?iy)?=?0
bitsBW(2,?ix,?iy)?=?0
Else
bitsBW(0,?ix,?iy)?=?255
bitsBW(1,?ix,?iy)?=?255
bitsBW(2,?ix,?iy)?=?255
End?If
Next
Next
'將灰度圖顯示到picture2中
Picture2.Picture?=?Picture2.Image?'如果picture2的picture屬性為空,需要在setDIBits之前將其picture屬性設(shè)置一下,否則無(wú)法顯示出圖形
SetDIBits?Picture2.hdc,?Picture2.Picture.Handle,?0,?iHeight,?bits(0,?0,?0),?bi24BitInfo,?0
Picture2.Picture?=?Picture2.Image
'將黑白圖顯示到picture3中
Picture3.Picture?=?Picture3.Image
SetDIBits?Picture3.hdc,?Picture3.Picture.Handle,?0,?iHeight,?bitsBW(0,?0,?0),?bi24BitInfo,?0
Picture3.Picture?=?Picture3.Image
End?Sub
代碼運(yùn)行很快,如圖所示圖片基本可瞬間完成
圖像的灰度變換一般是指根據(jù)某種規(guī)律改變圖像中的灰度值,使得圖像的亮度或者對(duì)比度發(fā)生變化,最終讓圖像變得更容易分辨以及達(dá)到我們想要的效果,一般來(lái)說(shuō),灰度轉(zhuǎn)換有以下幾種方式:
① 線性變換: 當(dāng)圖像出現(xiàn)曝光不足或者曝光過(guò)度的時(shí)候,灰度圖會(huì)被局限在很小的范圍內(nèi),這時(shí)我們會(huì)通過(guò)線性變換將每一個(gè)像素線性拉伸。一般線性變換效果會(huì)增強(qiáng)圖像的對(duì)比度,舉個(gè)例子就是,圖像會(huì)變得黑色更黑,白色更白。
② 分段線性變換: 主要是用作突出感興趣的目標(biāo)或者灰度區(qū)間,抑制那些不感興趣的區(qū)域,一般來(lái)說(shuō),我們會(huì)把圖像分成三段去進(jìn)行線性變換,對(duì)任意區(qū)間的灰度區(qū)間進(jìn)行壓縮或拓展,一般用在有類(lèi)似于折痕這樣的噪聲的圖片中,減少折痕的影響。
③ 非線性變換: 該變換一般不針對(duì)某個(gè)不同的灰度區(qū)間進(jìn)行變換,而是在整個(gè)灰度值范圍內(nèi)采取相同的非線性函數(shù)實(shí)現(xiàn)灰度值區(qū)間的壓縮和拓展。如對(duì)數(shù)變換,用于擴(kuò)展圖像的低灰度值部分,壓縮高灰度值部分,使得低灰度的圖像細(xì)節(jié)清晰化。相對(duì)應(yīng)的指數(shù)變換則是拉伸高灰度區(qū)域,提高灰度區(qū)域高的像素點(diǎn)。
?這個(gè)說(shuō)的直方圖一般指的是灰度直方圖,是按照灰度值大小,統(tǒng)計(jì)圖像中像素出現(xiàn)的頻率,橫坐標(biāo)為灰度值,縱坐標(biāo)是該灰度值出現(xiàn)的頻率或者像素個(gè)數(shù)。但直方圖只能反映整幅圖像的亮暗程度和對(duì)比度,不能看出灰度空間分布情況。直方圖一般有以下兩種修正形式:
① 直方圖均衡化: 通過(guò)對(duì)原圖像進(jìn)行某種變換,使得原圖像的灰度直方圖修正為均勻分布直方圖,從而達(dá)到調(diào)整圖像對(duì)比度的目的,主要適用于背景和前景太暗或太亮的圖像(啊,依舊是萬(wàn)能的ppt畫(huà)的直方圖,ppt賽高)。
② 直方圖規(guī)定化 :即是將原圖像直方圖變成規(guī)定形狀的直方圖。最理想的情況是直方圖均衡化實(shí)現(xiàn)了圖像灰度的均衡分布,對(duì)提高圖像對(duì)比度有明顯的作用。但是在實(shí)際使用中,我們不一定需要直方圖具有整體的均勻分布特性,而是希望與規(guī)定的一致。
? 意思是將圖像的像素點(diǎn)全部設(shè)置成0或255,變成黑白圖像,大幅度減少圖像的數(shù)據(jù)量,凸顯目標(biāo)輪廓,同樣的,一般有三種做法:
①取0-255之間的平均數(shù)作為閾值過(guò)濾,灰度值小于平均數(shù)127的歸于像素0,反之歸于255。
②計(jì)算圖像所有像素的灰度平均值作為閾值過(guò)濾,灰度值小于閾值的歸于像素0,反之歸于255。
③取灰度直方圖上,前景和背景兩個(gè)高峰之間的最低谷為閾值,灰度值小于閾值的歸于像素0,反之歸于255。
符號(hào)說(shuō)明:erode(腐蝕)dilate(膨脹)src(原圖)element(移動(dòng)窗口大小)dist(最終圖像)
先腐蝕后膨脹,可以用來(lái)消除小物體,可以在分離物體,平滑邊界的同時(shí)改變面積不明顯,效果通常為放大了裂痕或局部亮度低的區(qū)域,公式為:
dist= dilate(erode(src, element))
先膨脹后腐蝕,能排除小型黑色區(qū)域,效果通常為突出了比原圖輪廓周?chē)档膮^(qū)域。公式為:
dist = erode(dilate(src , element))
求膨脹圖與腐蝕圖之差,對(duì)二值圖像進(jìn)行這一操作可以突出圖塊邊緣,從而保留物體的邊緣輪廓,公式為:
dist = dilate(src, element) - erode(src , element)
求原圖和開(kāi)運(yùn)算圖之差,開(kāi)運(yùn)算減去原圖后可以得到比原圖輪廓周?chē)鷧^(qū)域更亮的效果圖,公式為:
dist = src - dilate(erode(src, element))
求閉運(yùn)算圖和原圖之差,用作分離比臨近點(diǎn)暗一點(diǎn)的斑塊,得出比較平滑的輪廓,公式為:
dist = erode(dilate(src, element)) - src
?主要是用作對(duì)圖像進(jìn)行平滑處理,目的是去除圖像中的噪聲,但會(huì)使得圖像中物體邊緣模糊,具體操作為:對(duì)窗口范圍內(nèi)像素的灰度值進(jìn)行平均值計(jì)算,然后將當(dāng)前像素的灰度值用它所在鄰域內(nèi)像素的平均值代替。
內(nèi)容摻雜個(gè)人理解,記錄準(zhǔn)確性不擔(dān)保,隨時(shí)改(●ˇ?ˇ●)
圖像二值化的目的是最大限度的將圖象中感興趣的部分保留下來(lái),在很多情況下,也是進(jìn)行圖像分析、特征提取與模式識(shí)別之前的必要的圖像預(yù)處理過(guò)程。這個(gè)看似簡(jiǎn)單的問(wèn)題,在過(guò)去的四十年里受到國(guó)內(nèi)外學(xué)者的廣泛關(guān)注,產(chǎn)生了數(shù)以百計(jì)的閾值選取方法,但如同其他圖像分割算法一樣,沒(méi)有一個(gè)現(xiàn)有方法對(duì)各種各樣的圖像都能得到令人滿意的結(jié)果。
本文針對(duì)幾種經(jīng)典而常用的二值發(fā)放進(jìn)行了簡(jiǎn)單的討論并給出了其vb.net 實(shí)現(xiàn)。
1、P-Tile法
Doyle于1962年提出的P-Tile (即P分位數(shù)法)可以說(shuō)是最古老的一種閾值選取方法。該方法根據(jù)先驗(yàn)概率來(lái)設(shè)定閾值,使得二值化后的目標(biāo)或背景像素比例等于先驗(yàn)概率,該方法簡(jiǎn)單高效,但是對(duì)于先驗(yàn)概率難于估計(jì)的圖像卻無(wú)能為力。
2、OTSU 算法(大津法)
OSTU算法可以說(shuō)是自適應(yīng)計(jì)算單閾值(用來(lái)轉(zhuǎn)換灰度圖像為二值圖像)的簡(jiǎn)單高效方法。1978 OTSU年提出的最大類(lèi)間方差法以其計(jì)算簡(jiǎn)單、穩(wěn)定有效,一直廣為使用。
3、迭代法(最佳閥值法)
(1). 求出圖象的最大灰度值和最小灰度值,分別記為Zl和Zk,令初始閾值為:
(2). 根據(jù)閾值TK將圖象分割為前景和背景,分別求出兩者的平均灰度值Z0和ZB:
式中,Z(i,j)是圖像上(i,j)點(diǎn)的象素值,N(i,j)是(i,j)點(diǎn)的權(quán)值,一般取1。
(3). 若TK=TK+1,則所得即為閾值,否則轉(zhuǎn)2,迭代計(jì)算。
4、一維最大熵閾值法
它的思想是統(tǒng)計(jì)圖像中每一個(gè)灰度級(jí)出現(xiàn)的概率 ,計(jì)算該灰度級(jí)的熵 ,假設(shè)以灰度級(jí)T分割圖像,圖像中低于T灰度級(jí)的像素點(diǎn)構(gòu)成目標(biāo)物體(O),高于灰度級(jí)T的像素點(diǎn)構(gòu)成背景(B),那么各個(gè)灰度級(jí)在本區(qū)的分布概率為:
O區(qū): i=1,2……,t
B區(qū): i=t+1,t+2……L-1
上式中的 ,這樣對(duì)于數(shù)字圖像中的目標(biāo)和背景區(qū)域的熵分別為:
對(duì)圖像中的每一個(gè)灰度級(jí)分別求取W=H0 +HB,選取使W最大的灰度級(jí)作為分割圖像的閾值,這就是一維最大熵閾值圖像分割法。
網(wǎng)站題目:vb.net圖像灰度變換,matlab灰度圖像指數(shù)變換
標(biāo)題網(wǎng)址:http://vcdvsql.cn/article26/hsoocg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、品牌網(wǎng)站設(shè)計(jì)、微信小程序、做網(wǎng)站、動(dòng)態(tài)網(wǎng)站、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)