圖像灰度化處理的實(shí)現(xiàn)_第1頁
圖像灰度化處理的實(shí)現(xiàn)_第2頁
圖像灰度化處理的實(shí)現(xiàn)_第3頁
圖像灰度化處理的實(shí)現(xiàn)_第4頁
圖像灰度化處理的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、圖像灰度化處理的實(shí)現(xiàn) HYPERLINK http:/zhengxuelong1228./blog/static/43967006200862264313189/ l # delphi圖像處理學(xué)習(xí) 2008-07-22 18:43 閱讀153評(píng)論0 字號(hào): HYPERLINK http:/zhengxuelong1228./blog/static/43967006200862264313189/ l # 大大 HYPERLINK http:/zhengxuelong1228./blog/static/43967006200862264313189/ l # 中中 HYPERLINK http:

2、/zhengxuelong1228./blog/static/43967006200862264313189/ l # 小小 一、 圖像的灰度化處理的基本原理將彩色圖像轉(zhuǎn)化成為灰度圖像的過程成為圖像的灰度化處理。彩色圖像中的每個(gè)像素的顏色有R、G、B三個(gè)分量決定,而每個(gè)分量有255中值可取,這樣一個(gè)像素點(diǎn)可以有1600多萬(255*255*255)的顏色的變化范圍。而灰度圖像是R、G、B三個(gè)分量相同的一種特殊的彩色圖像,其一個(gè)像素點(diǎn)的變化范圍為255種,所以在數(shù)字圖像處理種一般先將各種格式的圖像轉(zhuǎn)變成灰度圖像以使后續(xù)的圖像的計(jì)算量變得少一些?;叶葓D像的描述與彩色圖像一樣仍然反映了整幅圖像的整體

3、和局部的色度和亮度等級(jí)的分布和特征。圖像的灰度化處理可用兩種方法來實(shí)現(xiàn)。第一種方法使求出每個(gè)像素點(diǎn)的R、G、B三個(gè)分量的平均值,然后將這個(gè)平均值賦予給這個(gè)像素的三個(gè)分量。第二種方法是根據(jù)YUV的顏色空間中,Y的分量的物理意義是點(diǎn)的亮度,由該值反映亮度等級(jí),根據(jù)RGB和YUV顏色空間的變化關(guān)系可建立亮度Y與R、G、B三個(gè)顏色分量的對(duì)應(yīng):Y=0.3R+0.59G+0.11B,以這個(gè)亮度值表達(dá)圖像的灰度值。二、 用Delphi進(jìn)行圖像灰度化的實(shí)現(xiàn):procedure TForm1.BitBtn1Click(Sender: TObject);var p:PByteArray; /PByteArray的

4、定義格式 /PByteArray = TByteArray; /TByteArray = array0.32767 of Byte; ChangedBmp : Tbitmap; gray,x,y:integer; TestBMP : Tbitmap; / 處理過程中位圖begin TestBMP:=Tbitmap.Create; ChangedBmp:=Tbitmap.Create; TestBMP.Assign(image1.Picture); for y := 0 to TestBMP.Height - 1 do begin /獲取每一行象素信息 p := TestBMP.scanline

5、y; for x := 0 to TestBMP.Width - 1 do begin /這里采用YUV與RGB顏色空間變換的方法,即 Y0.3R+0.59G+0.11B Gray := Round(p3 * x + 2 * 0.3 + p3 * x + 1 * 0.59 + p3 * x * 0.11); /由于是24位真彩色,故一個(gè)像素點(diǎn)為三個(gè)字節(jié) p3 * x + 2 := byte(Gray); p3 * x + 1 := byte(Gray); p3 * x := byte(Gray); /Gray的值必須在0255之間 end; ChangedBmp.Assign(TestBMP)

6、; PaintBox1.Canvas.CopyMode:=srccopy; PaintBox1.Canvas.Draw(0,0,ChangedBmp);/用PaintBox控件重新繪制圖像; end;三、注意事項(xiàng):程序申請(qǐng)了TestBMP、WillbeChangedBmp,所以在程序初始化的時(shí)候,要注意創(chuàng)建:TestBMP:=Tbitmap.Create;ChangedBmp:=Tbitmap.Create; 程序結(jié)束后注意要把TestBMP.Destory和ChangedBmp.Destory;四、程序效果:值得一提的是,如果用QQ截圖,效果就有很大差別,不知道為什么.下面是QQ截圖的效果圖

7、像的二值化的基本原理 HYPERLINK http:/zhengxuelong1228./blog/static/4396700620086229132173/ l # delphi圖像處理學(xué)習(xí) 2008-07-22 21:01 閱讀28評(píng)論0 字號(hào): HYPERLINK http:/zhengxuelong1228./blog/static/4396700620086229132173/ l # 大大 HYPERLINK http:/zhengxuelong1228./blog/static/4396700620086229132173/ l # 中中 HYPERLINK http:/zhe

8、ngxuelong1228./blog/static/4396700620086229132173/ l # 小小 圖像的二值化處理就是講圖像上的點(diǎn)的灰度置為0或255,也就是講整個(gè)圖像呈現(xiàn)出明顯的黑白效果。即將256個(gè)亮度等級(jí)的灰度圖像通過適當(dāng)?shù)拈y值選取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。在數(shù)字圖像處理中,二值圖像占有非常重要的地位,特別是在實(shí)用的圖像處理中,以二值圖像處理實(shí)現(xiàn)而構(gòu)成的系統(tǒng)是很多的,要進(jìn)行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像,這樣子有利于再對(duì)圖像做進(jìn)一步處理時(shí),圖像的集合性質(zhì)只與像素值為0或255的點(diǎn)的位置有關(guān),不再涉及像素的多級(jí)值,使處

9、理變得簡(jiǎn)單,而且數(shù)據(jù)的處理和壓縮量小。為了得到理想的二值圖像,一般采用封閉、連通的邊界定義不交疊的區(qū)域。所有灰度大于或等于閥值的像素被判定為屬于特定物體,其灰度值為255表示,否則這些像素點(diǎn)被排除在物體區(qū)域以外,灰度值為0,表示背景或者例外的物體區(qū)域。如果某特定物體在內(nèi)部有均勻一致的灰度值,并且其處在一個(gè)具有其他等級(jí)灰度值的均勻背景下,使用閥值法就可以得到比較的分割效果。如果物體同背景的差別表現(xiàn)不在灰度值上(比如紋理不同),可以將這個(gè)差別特征轉(zhuǎn)換為灰度的差別,然后利用閥值選取技術(shù)來分割該圖像。動(dòng)態(tài)調(diào)節(jié)閥值實(shí)現(xiàn)圖像的二值化可動(dòng)態(tài)觀察其分割圖像的具體結(jié)果。2、 圖像的二值化的程序?qū)崿F(xiàn)通過Delph

10、i刻度控件調(diào)整閥值,實(shí)現(xiàn)動(dòng)態(tài)控制,程序如下:vprocedure TForm1.Button1Click(Sender: TObject);var p:PByteArray; /PByteArray的定義格式 /PByteArray = TByteArray; /TByteArray = array0.32767 of Byte; ChangedBmp : Tbitmap; gray,x,y:integer; TestBMP : Tbitmap; / 處理過程中位圖begin TestBMP:=TBitmap.Create; changedbmp:=tbitmap.Create; testbm

11、p.Assign(image1.Picture); for y:=0 to testbmp.Height-1 do begin p:=testbmp.ScanLiney; for x:=0 to testbmp.Width-1 do begin /首先將圖像灰度化 gray:=round(px*3+2*0.3+px*3+1*0.59+px*3*0.11); if gray TrackBar1.Position then /按閥值進(jìn)行二值化 begin px*3:=255; px*3+1:=255; px*3+2:=255; end else begin px*3:=0;px*3+1:=0;px

12、*3+2:=0; end; end; end; ChangedBmp.Assign(TestBMP); PaintBox1.Canvas.CopyMode:=srccopy; PaintBox1.Canvas.Draw(0,0,ChangedBmp);end;效果:256色和24位真彩BMP圖像灰度化2009年05月10日 星期日 下午 09:59/* 函數(shù)名稱: Convert256toGray(LPSTR lpDIB,LPSTR lpDIBBits, long lWidth,long lHeight)* 參數(shù): LPSTR lpDIB 指向dib的指針 LPSTR lpDIBBits 指向

13、dib數(shù)據(jù)的指針 long lWidth 圖像寬度 long lHeight 圖像高度* 返回值: bool * 功能: 將256色位圖轉(zhuǎn)化為灰度圖*/bool Convert256toGray(LPSTR lpDIB,LPSTR lpDIBBits, long lWidth,long lHeight) BYTE * lpSrc; / 指向DIB象素的指針 LONG lLineBytes; / 圖像每行的字節(jié)數(shù)LPBITMAPINFO lpbmi; / 指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0) LPBITMAPCOREINFO lpbmc; / 指向BITMAPCOREINFO結(jié)構(gòu)的

14、指針 lpbmi = (LPBITMAPINFO)lpDIB; / 獲取指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0) lpbmc = (LPBITMAPCOREINFO)lpDIB; / 獲取指向BITMAPCOREINFO結(jié)構(gòu)的指針BYTE bMap256; / 灰度映射表/ 計(jì)算灰度映射表(保存各個(gè)顏色的灰度值),并更新DIB調(diào)色板int i,j;for (i = 0; i bmiColorsi.rgbRed + 0.587 * lpbmi-bmiColorsi.rgbGreen + 0.114 * lpbmi-bmiColorsi.rgbBlue +0.5);*/bMapi = (

15、BYTE)(306 * lpbmi-bmiColorsi.rgbRed + 601 * lpbmi-bmiColorsi.rgbGreen + 117 * lpbmi-bmiColorsi.rgbBlue + 512) 10 ); /修改后的優(yōu)化算法/ 更新DIB調(diào)色板紅色分量lpbmi-bmiColorsi.rgbRed = i; / 更新DIB調(diào)色板綠色分量lpbmi-bmiColorsi.rgbGreen = i; / 更新DIB調(diào)色板藍(lán)色分量lpbmi-bmiColorsi.rgbBlue = i; / 更新DIB調(diào)色板保留位lpbmi-bmiColorsi.rgbReserved =

16、 0;/ 計(jì)算圖像每行的字節(jié)數(shù)lLineBytes = WIDTHBYTES(lWidth * 8);/ 更換每個(gè)象素的顏色索引(即按照灰度映射表換成灰度值)/逐行掃描for(i = 0; i lHeight; i+)/逐列掃描for(j = 0; j biSize;int dwData = lpDIBHdr-biSizeImage;int dwGrayData = dwData/3;int dwGrayPal = 256 * sizeof(RGBQUAD); dwData=(lpDIBHdr-biHeight) * (lpDIBHdr-biWidth); int sizeTotal=dwIn

17、fo+dwGrayPal+dwData; /灰度圖,顏色表長(zhǎng)度為255HGLOBAL hGray=(HGLOBAL):GlobalAlloc(GMEM_MOVEABLE |GMEM_ZEROINIT, sizeTotal);if (hGray=0)return false; /內(nèi)存分配失敗則返回falselpGray = (LPSTR) :GlobalLock(hGray);/ 創(chuàng)建灰度圖的顏色表 計(jì)算每個(gè)像素點(diǎn)的灰度值,即求平均即可 RGBQUAD* lpGrayRgbQuag=(RGBQUAD*)(lpGray+lpDIBHdr-biSize);char * lpBits = lpDIB

18、+ lpDIBHdr-biSize ;int rowLenSr=WIDTHBYTES(24*lpDIBHdr-biWidth);int rowLenDes=WIDTHBYTES(8*lpDIBHdr-biWidth);BYTE * lpGrayBits = (BYTE*)(lpGrayRgbQuag)+dwGrayPal;int aver=0;int i,j,k;if(24=lpDIBHdr-biBitCount) for(i=0;irgbBlue=i; lpGrayRgbQuag-rgbGreen=i; lpGrayRgbQuag-rgbRed=i; lpGrayRgbQuag-rgbRes

19、erved=0; lpGrayRgbQuag+; for (i=0;ibiHeight;i+) for (j=0; jbiWidth; j+) k=i*rowLenSr+3*j;/* lpGrayBitsi*rowLenDes+j=(BYTE)(0.114*lpBitsk +0.587*lpBitsk+1 +0.299*lpBitsk+2 + 0.5);*/ lpGrayBitsi*rowLenDes+j=(BYTE) ( 117 * lpBitsk + 601* lpBitsk+1 + 306* lpBitsk+2 + 512 ) 10 ); /修改后的優(yōu)化算法 /修正需要補(bǔ)零的像素行 fo

20、r (j=lpDIBHdr-biWidth;jbiSizeImage=sizeTotal;lpGrayHdr-biBitCount=8; lpGrayHdr-biClrUsed=256; :GlobalUnlock( hGray ); return (HGLOBAL) hGray;彩色圖像灰度化 在RGB模型中,如果R=G=B時(shí),則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值,因此,灰度圖像每個(gè)像素只需一個(gè)字節(jié)存放灰度值(又稱強(qiáng)度值、亮度值),灰度范圍為0-255。一般有以下四種方法對(duì)彩色圖像進(jìn)行灰度化:1.分量法將彩色圖像中的三分量的亮度作為三個(gè)灰度圖像的灰度值,可根據(jù)應(yīng)用需要選取一種灰

21、度圖像。 f1(i,j)=R(i,j) f2(i,j)=G(i,j) f3(i,j)=B(i,j) 其中fk(i,j)(k=1,2,3)為轉(zhuǎn)換后的灰度圖像在(i,j)處的灰度值。如圖4-1的彩色圖像轉(zhuǎn)為4-2三種灰度圖。 圖4-1 彩色圖像 (a)R分量灰度圖 (b)G分量灰度圖 (c)B分量灰度圖 圖4-2 彩色圖的三分量灰度圖2.最大值法將彩色圖像中的三分量亮度的最大值作為灰度圖的灰度值。 f(i,j)=max(R(i,j),G(i,j),B(i,j)3.平均值法將彩色圖像中的三分量亮度求平均得到一個(gè)灰度圖。 f(i,j)=(R(i,j)+G(i,j)+B(i,j) /34.加權(quán)平均法根據(jù)

22、重要性及其它指標(biāo),將三個(gè)分量以不同的權(quán)值進(jìn)行加權(quán)平均。由于人眼對(duì)綠色的敏感最高,對(duì)藍(lán)色敏感最低,因此,按下式對(duì)RGB三分量進(jìn)行加權(quán)平均能得到較合理的灰度圖像。f(i,j)=0.11R(i,j)+0.59G(i,j)+0.3B(i,j)如何用C語言對(duì)彩色圖像進(jìn)行二值化?想先是一副彩色圖像變成灰度圖像,再設(shè)定閾值對(duì)其進(jìn)行二值#include #include #include #pragma pack(1)#define R 30#define G 59#define B 11#define ONE 255 #define ZERO 0 typedef unsigned short WORD;ty

23、pedef unsigned long DWORD;typedef long LONG;typedef unsigned char BYTE;typedef struct tagBITMAPFILEHEADER / bmfh WORD bfType; / 位圖文件的類型,必須為BM DWORD bfSize; / 位圖文件的大小,以字節(jié)為單位 WORD bfReserved1; / 位圖文件保留字,必須為0 WORD bfReserved2; / 位圖文件保留字,必須為0 DWORD bfOffBits; / 位圖數(shù)據(jù)的起始位置,以相對(duì)于位圖文件頭的偏移量表示,以字節(jié)為單位 BITMAPFIL

24、EHEADER; typedef struct tagBITMAPINFOHEADER / bmih DWORD biSize; / 本結(jié)構(gòu)所占用字節(jié)數(shù) LONG biWidth; / 位圖的寬度,以像素為單位 LONG biHeight; / 位圖的高度,以像素為單位 WORD biPlanes; / 目標(biāo)設(shè)備的級(jí)別,必須為1 WORD biBitCount;/ 每個(gè)像素所需的位數(shù),必須是1(雙色),4(16色),8(256色)或24(真彩色)之一 DWORD biCompression; / 位圖壓縮類型,必須是 0(不壓縮),1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一

25、 DWORD biSizeImage; / 位圖的大小,以字節(jié)為單位 LONG biXPelsPerMeter; / 位圖水平分辨率,每米像素?cái)?shù) LONG biYPelsPerMeter; / 位圖垂直分辨率,每米像素?cái)?shù) DWORD biClrUsed;/ 位圖實(shí)際使用的顏色表中的顏色數(shù) DWORD biClrImportant;/ 位圖顯示過程中重要的顏色數(shù) BITMAPINFOHEADER; typedef struct tagPOINT BYTE b; BYTE g; BYTE r; POINT;int quit();int quit() puts(Files format wrong)

26、; exit(0);void main (int argc,char *argv) FILE *fi,*fo;/I/O file char fin80,fon80;/I/O file name BYTE buff,o=0; BITMAPFILEHEADER bf; BITMAPINFOHEADER bi; POINT *p; int i,j,t; if(argc3) printf(orginfile name:); scanf(%s,fin); printf(resultfile name:); scanf(%s,fon); else sscanf(argv1,%s,fin); sscanf(

27、argv2,%s,fon); if(argc=4) sscanf(argv4,%d,&t); else printf(theshold 0,255:); scanf(%d,&t); if (fi=fopen(fin,rb)=NULL)|(fo=fopen(fon,wb)=NULL) puts(nfile open failed); return; fread(&bf,sizeof(bf),1,fi); fread(&bi,sizeof(bi),1,fi); if(bf.bfType!=0 x4d42) quit(); if(bf.bfReserved1!=0 x0000) quit(); if(bf.bfReserved2!=0 x0000) quit(); if(bi.biClrImportant!=0) quit(); if(bi.biB

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論