圖像二值化的目的是最大限度的將圖象中感興趣的部分保留下來,在很多情況下,也是進(jìn)行圖像分析、特征提取與模式識別之前的必要的圖像預(yù)處理過程。這個看似簡單的問題,在過去的四十年里受到國內(nèi)外學(xué)者的廣泛關(guān)注,產(chǎn)生了數(shù)以百計的閾值選取方法,但如同其他圖像分割算法一樣,沒有一個現(xiàn)有方法對各種各樣的圖像都能得到令人滿意的結(jié)果。
創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)薩嘎,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
本文針對幾種經(jīng)典而常用的二值發(fā)放進(jìn)行了簡單的討論并給出了其vb.net 實現(xiàn)。
1、P-Tile法
Doyle于1962年提出的P-Tile (即P分位數(shù)法)可以說是最古老的一種閾值選取方法。該方法根據(jù)先驗概率來設(shè)定閾值,使得二值化后的目標(biāo)或背景像素比例等于先驗概率,該方法簡單高效,但是對于先驗概率難于估計的圖像卻無能為力。
2、OTSU 算法(大津法)
OSTU算法可以說是自適應(yīng)計算單閾值(用來轉(zhuǎn)換灰度圖像為二值圖像)的簡單高效方法。1978 OTSU年提出的最大類間方差法以其計算簡單、穩(wěn)定有效,一直廣為使用。
3、迭代法(最佳閥值法)
(1). 求出圖象的最大灰度值和最小灰度值,分別記為Zl和Zk,令初始閾值為:
(2). 根據(jù)閾值TK將圖象分割為前景和背景,分別求出兩者的平均灰度值Z0和ZB:
式中,Z(i,j)是圖像上(i,j)點的象素值,N(i,j)是(i,j)點的權(quán)值,一般取1。
(3). 若TK=TK+1,則所得即為閾值,否則轉(zhuǎn)2,迭代計算。
4、一維最大熵閾值法
它的思想是統(tǒng)計圖像中每一個灰度級出現(xiàn)的概率 ,計算該灰度級的熵 ,假設(shè)以灰度級T分割圖像,圖像中低于T灰度級的像素點構(gòu)成目標(biāo)物體(O),高于灰度級T的像素點構(gòu)成背景(B),那么各個灰度級在本區(qū)的分布概率為:
O區(qū): i=1,2……,t
B區(qū): i=t+1,t+2……L-1
上式中的 ,這樣對于數(shù)字圖像中的目標(biāo)和背景區(qū)域的熵分別為:
對圖像中的每一個灰度級分別求取W=H0 +HB,選取使W最大的灰度級作為分割圖像的閾值,這就是一維最大熵閾值圖像分割法。
'利用API-GetPixel 獲取窗體或圖片某一點的顏色值(long類型)。注意SaleMode屬性要設(shè)為3
'然后將long換算成rgb值,再判斷rgb是否相等(相等的為灰色)
'重復(fù)上面幾步,進(jìn)行采樣判斷。當(dāng)然如果你確定某一點 不是灰色 就是彩色的話 ,判斷 一次就行
’--這樣做不是非常精確,但一般還是可以的....
可以將打印機(jī)默認(rèn)打印設(shè)置改為黑白打印,如果打印對象是RGB配色,打印機(jī)驅(qū)動轉(zhuǎn)換為CMYK顏色時,黑色都是由彩色墨水組成的
2.可以試一下圖片從一個標(biāo)準(zhǔn)灰度圖片格式化而來,這樣圖片自身只有黑白色,也許可以
不要分
灰度圖像的像素的取值范圍為
0-255,0代表黑,255代表最亮,中間值是不同的亮度
圖像二值化,就是通過某個判斷標(biāo)準(zhǔn),將灰度圖像變成只有兩個值的圖像,即圖像值不是0,就是255
閾值,就是這個判斷標(biāo)準(zhǔn),比如,如果閾值取100,那么圖像灰度小于等于100的像素,都變成0
圖像灰度大于100的,都變成255
用point?方法太慢了,還是用api的getDIBits和setDIBits吧,彩圖轉(zhuǎn)灰度圖的代碼如下:
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)建并初始化一個bitMapInfo自定義類型
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中各點的rgb值,比point方法或getPixel函數(shù)逐像素獲取像素rgb要快出一個數(shù)量級
lrtn?=?GetDIBits(Picture1.hdc,?Picture1.Picture.Handle,?0,?iHeight,?bits(0,?0,?0),?bi24BitInfo,?0)
'數(shù)組的三個維度分別代表像素的RGB分量、以圖形左下角為原點的X和Y坐標(biāo)。
'具體說來,這時bits(0,2,3)代表從圖形左下角數(shù)起橫向第2個縱向第3個像素的Blue值,而bits(1,2,3)和bits(2,2,3)分別的Green值和Red值.
bytThreshold?=?128?'這里定義轉(zhuǎn)換為黑白圖像時的閾值為128,即灰色亮度大于128的像素轉(zhuǎn)為白色,小于128的像素轉(zhuǎn)為黑的,此值可根據(jù)需要修改為0-255之前任意數(shù)值
For?ix?=?0?To?iWidth
For?iy?=?0?To?iHeight
'***********RGB轉(zhuǎ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)?'這是簡化?sRGB?IEC61966-2.1?[gamma=2.20],有點類似于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è)置一下,否則無法顯示出圖形
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
代碼運行很快,如圖所示圖片基本可瞬間完成
在web上可以使用HTML5的特效實現(xiàn)。
在windows forms里面可以直接修改設(shè)置圖片的屬性。
Try
' 圖片位置初始化一個image1
Dim image1 As New Bitmap(
"C:\Documents and Settings\All Users\Documents\My Music\music.bmp",
True)
Dim x, y As Integer
' Loop through the images pixels to reset color.
For x = 0 To image1.Width - 1
For y = 0 To image1.Height - 1
Dim pixelColor As Color = image1.GetPixel(x, y)
Dim newColor As Color =
Color.FromArgb(pixelColor.R, 0, 0)
image1.SetPixel(x, y, newColor)
Next
Next
' Set the PictureBox to display the image.
PictureBox1.Image = image1
' Display the pixel format in Label1.
Label1.Text = "Pixel format: " + image1.PixelFormat.ToString()
Catch ex As ArgumentException
MessageBox.Show("There was an error." _
"Check the path to the image file.")
End Try