數(shù)字圖像處理實驗報告_第1頁
數(shù)字圖像處理實驗報告_第2頁
數(shù)字圖像處理實驗報告_第3頁
數(shù)字圖像處理實驗報告_第4頁
數(shù)字圖像處理實驗報告_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)數(shù)字圖像處理實驗報告專 業(yè): 軟件工程 姓 名: 王鵬飛 學(xué) 號: S 指導(dǎo)老師: 王素玉 2019年 12 月 28 日信息學(xué)部軟件學(xué)院目錄TOC o 1-3 h u 實驗要求:用 c/c+語言編程實現(xiàn)以下功能實驗環(huán)境:Windows10開發(fā)工具:CodeBlocks實驗一、BMP文件的讀寫1 實驗?zāi)康呐c實驗內(nèi)容1.1灰度 BMP 圖像的讀寫: (1) 讀入 lena.bmp 文件; (2) 通過文件內(nèi)容得出文件大小,位圖數(shù)據(jù)起始字節(jié),圖像長、寬以及每像素的位數(shù)等信息

2、; (3) 提取出原圖像中的位圖數(shù)據(jù),另存為 lena.raw, 并通過 photoshop 打開該 文件,查看所讀取的數(shù)據(jù)。 僅取原始圖像左上角 1/4 的數(shù)據(jù),另存一個 lenas.bmp 圖像,在 photoshop 中打開查看效果。1.2 彩色 BMP 圖像讀寫 (1) 讀入文件 lena_C.bmp 文件; (2) 通過文件內(nèi)容得出文件大小,位圖數(shù)據(jù)起始字節(jié),圖像長、寬以及每像素 的位數(shù)等信息; (3) 提取出原圖像中的位圖數(shù)據(jù),另存為 lena_C.raw, 并通過 photoshop 打開 該文件,查看所讀取的數(shù)據(jù)。 (4) 僅取原始圖像左上角 1/4 的數(shù)據(jù),另存一個 lena

3、_Cs.bmp 圖像,在 photoshop 中打開查看效果。 2 實驗原理通過C語言讀取BMP文件,讀入圖像的文件指針、寬、高、顏色表、圖像類型、每像素位數(shù)。BMP文件的數(shù)據(jù)按照從頭文件開始的順序分為BMP頭、位圖信息頭、調(diào)色板、位圖數(shù)據(jù)。3 實驗關(guān)鍵代碼源代碼如下:/申請位圖文件頭結(jié)構(gòu)變量,填寫文件頭信息BITMAPFILEHEADERfileHead;fileHead.bfType=0 x4D42;/bmp類型/bfSize是圖像文件4個組成部分之和fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colo

4、rTablesize+lineByte*height;fileHead.bfReserved1=0;fileHead.bfReserved2=0;/bfOffBits是圖像文件前3個部分所需空間之和fileHead.bfOffBits=54+colorTablesize;/寫文件頭進文件fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp2);/申請位圖信息頭結(jié)構(gòu)變量,填寫信息7頭信息BITMAPINFOHEADERhead;head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0

5、;head.biCompression=0;head.biHeight=height;head.biPlanes=1;head.biSize=40;head.biSizeImage=lineByte*height;head.biWidth=width;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;/寫位圖信息頭進內(nèi)存fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp2);/如果灰度圖像,有顏色表,寫入文件RGBQUAD*pColorTable1;if(biBitCount=8)pColorTable1=newRGB

6、QUAD256;fread(pColorTable1,sizeof(RGBQUAD),256,fp1);if(biBitCount=8)fwrite(pColorTable1,sizeof(RGBQUAD),256,fp2);/寫位圖數(shù)據(jù)進文件inty=(biWidth*biBitCount/8+3)/4*4;fseek(fp1,-y*biHeight/2,2);longq;if(q=ftell(fp1)=-1L) puts(GetBitmapHeader讀取文件指針位置失敗!);return0;elseprintf(起始字節(jié):%dn,q);pBmpBuf1=newunsignedcharli

7、neByte*biHeight;printf(helloworld1);intt;for(t=0;tbiHeight/2;t+)fread(pBmpBuf1,1,y/2,fp1);fseek(fp1,y/2,1);fwrite(pBmpBuf1,y/2,1,fp2);fclose(fp2);fclose(fp1);return1;4 實驗運行結(jié)果(1)灰度圖像運行結(jié)果 灰度圖lena.bmp文件 lenas.bmp文件由運行結(jié)果可知該灰度圖的大小為字節(jié),長和寬都為512字節(jié),每個像素的位數(shù)為8位,位圖數(shù)據(jù)起始字節(jié)為字節(jié)。(2)彩色圖像運行結(jié)果 lena_C.bmp文件 lena_Cs.bmp文

8、件由運行結(jié)果可知,該彩色圖像的大小為字節(jié),長和寬均為512字節(jié),每個像素的位數(shù)為24位,位圖數(shù)據(jù)起始字節(jié)為字節(jié)。5 總結(jié)通過本次實驗,學(xué)會了如何讀取BMP圖像中的信息,尤其是BMP中的信息變量設(shè)置較多,這點存在很大的難度。實驗二、圖像縮放1 實驗?zāi)康募皟?nèi)容2.1 灰度圖像最近鄰縮放: (1) 讀入 lena.bmp 文件; (2) 采用最近鄰方法將原圖長寬各縮小 2 倍,即隔 1 點取 1 點,存為 lenas.bmp; (3) 采用最近鄰方法將 lenas.bmp 重新放大到原來的尺寸,存為 lenasz.bmp, 比較其與原圖 lena.bmp 的區(qū)別; (4)將縮放倍數(shù)改為 4 重復(fù)上述

9、步驟。2.2 灰度圖像雙線性插值縮放 (1) 讀入文件 lena.bmp 文件;(2) 采用雙線性插值法將圖像縮小 2 倍(將源圖像相鄰兩個像素平均后作為一個像素),存為 lenas1.bmp; (3) 將縮小后的圖像放大回原來的尺寸,存為 lenasz1.bmp,對比其與原始圖 像 lena.bmp 的異同。 (4) 將放大倍數(shù)改為任意值,重復(fù)以上步驟。 2.3 將灰度圖改為彩色圖像重復(fù) 1、2 內(nèi)容。2 實驗原理2.1 最近鄰縮放原理不需要計算,在待求象素的四鄰象素中,將距離待求象素最近的鄰象素灰度賦給待求象素。設(shè)i+u, j+v(i, j為正整數(shù), u, v為大于零小于1的小數(shù),下同)為

10、待求象素坐標(biāo),則待求象素灰度的值 f(i+u, j+v),如下圖所示:如果(i+u, j+v)落在A區(qū),即u0.5, v0.5,則將左上角象素的灰度值賦給待求象素,同理,落在B區(qū)則賦予右上角的象素灰度值,落在C區(qū)則賦予左下角象素的灰度值,落在D區(qū)則賦予右下角象素的灰度值。最鄰近元法計算量較小,但可能會造成插值生成的圖像灰度上的不連續(xù),在灰度變化的地方可能出現(xiàn)明顯的鋸齒狀。2.2 雙線性插值法原理雙線性插值原理圖,x-y坐標(biāo)系、已知Q12,Q22,Q11,Q21四個點的值,求P點值。首先在Q11Q21、Q12Q22方向上進行兩次線性插值,得到R1、R2;然后在R1R2方向再做一次線性插值,得到P

11、點。這就是雙線性插值。雙線性插值關(guān)鍵的是P點在x,y兩個方向上相對已知Q點的位置。令: = (x-x1) / (x2-x1) =(y-y1) / (y2-y1) ,則 R1= Q11 + (Q21 - Q11) * = (1 -)*Q11 +*Q21,R2= Q12 + (Q22 - Q12) * = (1 -)*Q12 +*Q22;P =(1 - )*R1+ *R2=(1 -)(1 -)*Q11 +(1 -)*Q21 + *(1 -)*Q12 +*Q22 =(1 -)*(1 -)*Q11 + *Q12) +*(1 -)*Q21 + *Q22)3 實驗關(guān)鍵代碼和運行結(jié)果最鄰近插值法主要代碼:f

12、or (int i = 0; i dstHeight; +i)for (int j = 0; j dstWidth; +j)unsigned char *p1, *p2;x = round(double(1/lx*j);y = round(double(1/ly*i);p1 = (unsigned char *)(pBmpBuf2 + i*lineByte2 + j);p2 = (unsigned char *)(pBmpBuf + y*lineByte + x);(*p1) = (*p2);方法二:雙線性插值法:int x1, x2, y1, y2, Fq11, Fq12, Fq21, Fq

13、22;double x, y, r1, Fr1, Fr2, Fp;for (int i = 0; i dstHeight; +i)for (int j = 0; j = 0 & Fp 1)。(4)根據(jù)公式求取像素映射關(guān)系ss(i)=intmax(pix)-min(pix)*s(i)+0.5其中,pix指原圖像中的灰度值,需要求取原圖像中的最大灰度值減去最小灰度值。而有的均衡化理論中是(2n-1)-0,也就是該灰度級中的最大值減去灰度最小值。ss(i)是第i灰度級所對應(yīng)的均衡化圖像中的灰度級。(5)灰度映射上一步找到了原圖像和均衡化圖像灰度的對應(yīng)關(guān)系,對原圖進行操作,將每個像素映射成新的像素即可

14、。3 實驗關(guān)鍵代碼和實驗結(jié)果關(guān)鍵代碼如下:void savefile(char *filename ,char *filename1,unsigned char *image2000,int w,int h)FILE *fp=fopen(filename,rb);if(fp=NULL)coutcan not open this file.n;return;FILE *fp1=fopen(filename1,wb);if(fp1=NULL)coutcan not open this file1.n;return;BITMAPFILEHEADER bf;fread(&bf,sizeof(BITMA

15、PFILEHEADER),1,fp);BITMAPINFOHEADER info;fread(&info,sizeof(BITMAPINFOHEADER),1,fp);RGBQUAD *rgb;rgb=(RGBQUAD *)malloc(256*sizeof(RGBQUAD);fread(rgb,sizeof(RGBQUAD),256,fp);fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fp1);fwrite(&info,sizeof(BITMAPINFOHEADER),1,fp1);fwrite(rgb,sizeof(RGBQUAD),256,fp1);uns

16、igned char *image12000;int law_size;law_size=(w+3)/4*4;int i,j;for(i=0;ih;i+)image1i=new unsigned char law_size;for(i=0;ih;i+)for(j=0;jlaw_size;j+)image1ij=0;int n256=0;double a;double p256;for(i=0;ih;i+) for(j=0;jlaw_size;j+) nimageij+; for(i=0;i256;i+) a=(double)(ni)/(1.0*(h*law_size); pi=a;double

17、 s256=0;s0=p0;for(i=1;i256;i+) si=pi+si-1;for(i=0;ih;i+)for(j=0;jlaw_size;j+)image1ij=(int)(simageij*255+0.5);for(i=0;ih;i+)fwrite(image1i,sizeof(unsigned char),law_size,fp1);fclose(fp1);fclose(fp);實驗結(jié)果 直方圖均衡化原圖像 直方圖均衡化實驗結(jié)果圖像 彩色圖像均衡化處理后4 思考題彩色圖像 image_color 能否進行直方圖均衡?如何進行?由于直方圖均衡是對于灰度圖的圖像處理方法,它是利用圖像

18、直方圖對對比度進行調(diào)整的方法。因此直方圖均衡并不能直接用于彩色圖像的處理。但是由于彩色圖像的本質(zhì)是由R、G、B三個通道的灰度值組合而成的一個圖像,因此可以通過對R、G、B三個通道分別使用直方圖均衡之后將其組合起來從而達到對彩色圖像的直方圖均衡化,但是這樣有可能會改變原圖像的色調(diào),因為對R、G、B三通道的灰度值改變了以后圖像的疊加會出現(xiàn)一些不同的顏色,這個是難以避免的。其計算過程見附錄一。5結(jié)果分析通過實驗結(jié)果來看,經(jīng)過直方圖均衡處理之后的圖像與原圖像對比明顯,可以清晰地看到處理之后比處理之前的圖像的亮度更好,對比度更高,算法較為完整,能夠成功地達到實驗?zāi)康模瑢⒃瓐D進行處理之后得到更好。實驗四、

19、圖像濾波1 實驗?zāi)康募皟?nèi)容(1) 讀入圖像 lena1.bmp 和 lena2.bmp; (2) 分別利用盒濾波器、加權(quán)平均濾波器和鄰域平均濾波器對其進行濾波,對 比結(jié)果; (3) 用中值濾波器分別對上述兩幅圖像進行濾波,將模板分別設(shè)為 33、55、 77,對比不同的濾波效果; (4) 讀入圖像 lena.bmp,分別采用 Laplace 算子和復(fù)合 Laplace 算子對其進行 濾波,對比實驗結(jié)果; (5) 對 lena.bmp,采用 Robet 算子和 Sobel 算子進行濾波,對比結(jié)果; 2 圖像濾波的原理圖像信息在采集過程中往往受到各種噪聲源的干擾,這些噪聲在圖像上的常常表現(xiàn)為一些孤立

20、像素點,這可理解為像素的灰度是空間相關(guān)的,即噪聲點像素灰度與它們臨近像素的灰度有著顯著不同。通常,一般的前置圖像處理后的圖刺昂仍然帶有后續(xù)所不希望夾帶的孤立像素點,這種干擾或孤立像素點如不經(jīng)過濾波處理,會對以后的圖像區(qū)域分割、分析和判斷帶來影響。對受到噪聲污染的圖像可以采用線性濾波的方法來處理,但是很多線性濾波有低通性,在去噪聲的同時也使得邊緣模糊了,中值濾波在某些情況下可以做到既去除噪聲又保護圖像的邊緣,是一種非線性的去噪聲的方法。3 實驗關(guān)鍵代碼及結(jié)果3.1盒濾波器void meanFilter (unsigned char* corrupted, unsigned char* smoot

21、h, int width, int height)memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) );for (int j=1;jheight-1;j+)for (int i=1;iwidth-1;i+)smooth j*width+i = (corrupted (j-1)*width+(i-1) + corrupted (j-1)*width+i + corrupted (j-1)*width+(i+1) +corrupted j*width+(i-1) + corrupted j*width+i + corrup

22、ted j*width+(i+1) +corrupted (j+1)*width+(i-1) + corrupted (j+1)*width+i + corrupted (j+1)*width+(i+1) ) / 9; lena1 lena23.2 加權(quán)平均濾波器 lena1 lena23.3 鄰域平均濾波器int pixelByte = m_nBitCountOut / 8;for(i = 0; i m_imgHeight; i+)for(j = 0; j m_imgWidth * pixelByte; j+)*(m_pImgDataOut+i*lineByteOut+j)= *(m_pIm

23、gData+i*lineByteOut+j);/行處理(去掉邊緣幾行)for (i = inputY0; i m_imgHeight - inputH + inputY0 + 1; i+)/列處理(去掉邊緣幾列)for (j = inputX0; j m_imgWidth - inputW + inputX0 + 1; j+)/指向新DIB第i行第j列的像素的指針pDst = m_pImgDataOut + lineByte * (m_imgHeight - 1 - i) + j;value=0;/計算for (k = 0; k inputH; k+)for (l = 0; l inputW;

24、 l+)pSrc = m_pImgData + lineByte * (m_imgHeight - 1 - i + inputY0 - k) + j - inputX0 + l;/計算加權(quán)平均,保存像素值value += (*pSrc) * pTemplatek * inputW + l; lena1 lena23.4 中值濾波器void MedianFlitering(Mat &src, Mat &dst, int k)Mat im,m1, m2, m3, m4, m5, m6, B, G, R;vector channels;split(src, channels);B = channel

25、s.at(0);G = channels.at(1);R = channels.at(2);/通道分離int a = src.rows;int b = src.cols; /獲得行和列for (int i = k/2; i a - k/2; i+)/遍歷圖像,注意要把邊框部分去除了 for (int j = k/2; j b - k/2; j+) m1 = B(Rect(j - k/2, i - k/2, k, k).clone();/選取k*k窗口中的B通道m(xù)2 = G(Rect(j - k / 2, i - k / 2, k, k).clone();/選取k*k窗口G通道m(xù)3 = R(Re

26、ct(j - k / 2, i - k / 2, k, k).clone();/選取k*k窗口R通道m(xù)1 = m1.reshape(1, 1);m2 = m2.reshape(1, 1);m3 = m3.reshape(1, 1); /像素值將其變?yōu)橐恍衏v:sort(m1, m4, 0);cv:sort(m2, m5, 0);cv:sort(m3, m6, 0);/對其排序int p0 = m4.at(0, k*k/2+1);int p1 = m5.at(0, k*k / 2 + 1);int p2 = m6.at(0, k*k / 2 + 1);/選取各通道的像素中值點dst.at(i -

27、 k/2, j - k/2)0 = p0;dst.at(i - k/2, j - k/2) 1= p1;dst.at(i - k/2, j - k/2) 2= p2;/對其進行重賦值imshow(Annie, dst);waitKey(0);lena1通過模板分別為3x3,5x5,7x7中值濾波后,所得結(jié)果如下: lena2通過模板分別為3x3,5x5,7x7中值濾波后,所得結(jié)果如下: 3.5 Laplace 算子3.6 Robet算子void Robert(double *src,double *dst,int width,int height)double RobertMask_x9=0,

28、0,0,0,-1,0,0,0,1;double RobertMask_y9=0,0,0,0,0,-1,0,1,0;double *dst_x=(double *)malloc(sizeof(double)*width*height);double *dst_y=(double *)malloc(sizeof(double)*width*height);RealConvolution(src, dst_x, RobertMask_x, width, height, ROBERT_MASK_SIZE,ROBERT_MASK_SIZE);RealConvolution(src, dst_y, Rob

29、ertMask_y, width, height, ROBERT_MASK_SIZE,ROBERT_MASK_SIZE);for(int j=0;jheight;j+)for(int i=0;iwidth;i+)dstj*width+i=abs(dst_xj*width+i)+abs(dst_yj*width+i);free(dst_x);free(dst_y);void RobertSharpen(double *src,double *dst,int width,int height,double c)Robert(src,dst,width,height);for(int j=0;jhe

30、ight;j+)for(int i=0;iwidth;i+)dstj*width+i=srcj*width+i+c*dstj*width+i;3.7 sobel算子for(int j=0;jheight;j+)for(int i=0;iwidth;i+)dstj*width+i=abs(dst_xj*width+i)+abs(dst_yj*width+i);free(dst_x);free(dst_y);void SobelSharpen(double *src,double *dst,int width,int height,double c)Sobel(src,dst,width,heig

31、ht);for(int j=0;jheight;j+)for(int i=0;iwidth;i+)dstj*width+i=srcj*width+i+c*dstj*width+i;實驗五、圖像的灰度映射1 實驗?zāi)康募皟?nèi)容(1) 讀入圖像 image1.bmp 和 image2.bmp; (2) 分別利用對數(shù)變換、冪次變換和分段線性變換對上述圖像進行灰度映射; (3) 通過設(shè)定不同的參數(shù),尋求對于每幅圖像最優(yōu)的變換結(jié)果; (4) 讀入彩色圖像 imagec.bmp,重復(fù)上述實驗步驟。2 實驗關(guān)鍵代碼及結(jié)果2.1對數(shù)變化Mat LogTransform(Mat src, double parame

32、ter)vector value;for(int r = 0;r src.rows;r+)uchar* rowData = src.ptr(r);for(int c = 0;c src.cols;c+)/對數(shù)變換公式s = c * log(1 + v * r) / log(v + 1)/其中r為輸入圖像像素,c為常數(shù),v + 1為對數(shù)底value.push_back(log(1 + parameter * rowDatac) / log(parameter + 1);/計算得出的s經(jīng)過對比拉升(將像素值歸一化到0-255)得到最終的圖像return Normalize(value, 255,

33、src.rows, src.cols, src.type(); 原圖 變換后的圖2.2 冪次變換Mat PowerTranseform(Mat src, double gamma, int parameter)Mat dst;dst.create(src.size(), src.type();vector value;for(int r = 0;r src.rows;r+)uchar* srcRowData = src.ptr(r);for(int c = 0;c src.cols;c+)/冪次變換的公式為 s = c * r vr為輸入圖像像素value.push_back(paramete

34、r * pow(double)srcRowDatac, gamma);return Normalize(value, 255, src.rows, src.cols, src.type(); 原圖 變換后的圖2.3 分段線性變換Mat Stretch(Mat input, int r1, int s1, int r2, int s2)int h input.rows ;/ 圖片高int w input.cols ;/ 圖片寬Mat out h, w, CV_8UC1 ;/ 輸出圖片uchar* data_in input.data ;/ 原圖圖片像素數(shù)據(jù)uchar* data_out out.

35、data ;/ 輸出圖片像素數(shù)據(jù)double data;/ 臨時灰度值double a, a1, a2, a3, b, b1, b2, b3;/ 直線斜率與截距a1 = (double)s1 / (double)r1;b1 = 0;a2 = (double)(s2 - s1) / (double)(r2 - r1);b2 = s1 - a2*r1;a3 = (255.0 - s2) / (255.0 - r2);b3 = s2 - a3*r2;for (int y = 0; y h; y+)for (int x = 0; x w; x+)data = data_iny*w + x;if (da

36、ta = r2)a = a3; b = b3;elsea = a2; b = b2;data = a*data + b;data_outy*w + x = (uchar)(data);return out; 原圖 變換后的圖3 不同參數(shù)的變換結(jié)果 參數(shù)為1.5的對數(shù)變換 參數(shù)為80,100,100,120的分段線性變換 參數(shù)為0.9,1的冪次變換由圖中可以看出冪次變換的效果最好 參數(shù)為0.2的對數(shù)變換 參數(shù)為60,100,80,200的分段線性變換 參數(shù)為0.4,1的冪次變換由圖中可以看出對數(shù)變換的效果最好 參數(shù)為0.9的對數(shù)變換 參數(shù)為20,100,30,200的分段線性變換 參數(shù)為0.4,

37、1的冪次變換由圖中可以看出分段線性變換的效果最好附錄一對彩色直方圖均衡化的三種方法:1. 對RGB三個通道圖像分別進行直方圖均衡化,然后再合并三個通道;2. 提取RGB三個通道圖像,計算其平均直方圖結(jié)果,然后再進行均衡化;3. RGB空間轉(zhuǎn)為HSI空間圖像,對I(亮度,Intensity)通道進行直方圖均衡化,再轉(zhuǎn)為RGB圖像。第一種方法不推薦,會破壞色彩結(jié)構(gòu);根據(jù)情況選擇第2,3種方法。在實際均衡化過程中,核心步驟如下:1. 傳入單通道圖像和該的灰度直方圖。2. 遍歷灰度直方圖,對值 I 從 0255 累計求和,對累計求和,對和結(jié)果除以圖像的素數(shù),然后乘以 L-1得到函數(shù)結(jié)果 得到函數(shù)結(jié)果

38、f(xi )。3. 將每一個灰度值 i累積求和的結(jié)果 累積求和的結(jié)果 f(xi )存儲在一個大小為 256 的 int 數(shù)組中,存儲的位置為 i;4. 遍歷輸入圖像每一個素,記點值為 x,修改其像素值使等于 f(x)。5. 均衡化結(jié)束。1、單通道均衡化主要步驟如下,EqualizedResult就是均衡化的映射函數(shù),下一步驟就是將像素點值作為映射函數(shù)的輸入,將輸出結(jié)果替代原來的像素值。代碼如下:/功能:對直方圖進行均衡化/輸入:單通道CImage對象,灰度圖對象/輸出:均衡化結(jié)果CImg HistogramEqualization:HistogramEqualizationMethod(CIm

39、g InputImage,CImg Histogram)int L = 256; /灰度級int NumOfPixels = (InputImage)._width * (InputImage)._height;double CumulativeDistributionFunction256 = 0 ; / 灰度直方圖的累積分布double EqualizedResult256 = 0 ; / 均衡化結(jié)果映射函數(shù)/*直方圖就對應(yīng)于概率密度函數(shù)pdf,而概率分布函數(shù)cdf就是直方圖的累積和,即概率密度函數(shù)的積分積分*(L(=255)-1)*/*均衡化關(guān)鍵步驟*/int count = 0;cim

40、g_forX(Histogram, x) count += Histogramx; / 累計求和CumulativeDistributionFunctionx = 1.0 * count / NumOfPixels;/計算概率EqualizedResultx = round(CumulativeDistributionFunctionx * (L - 1); / 計算概率密度,round四舍五入 /*輸出均衡化結(jié)果*/CImg OutputImage(InputImage)._width, (InputImage)._height, 1, 1, 0);cimg_forXY(OutputImag

41、e, x, y) / calculate histogram equalization resultOutputImage(x, y, 0) = EqualizedResult(InputImage)(x, y);return OutputImage;獨立RGB通道均衡化代碼如下:/*功能: 分別對彩色圖的三個通道分開求解均衡化結(jié)果,然后合并*/*輸入: 均衡化圖像文件名*/*輸出: 彩色圖均衡化結(jié)果*/CImg HistogramEqualization:Hist_Equal_ColorImage_OneColorChannel(string ImageFileName)CImg Color

42、Image;ColorImage.load_bmp(ImageFileName.c_str();CImg R_Channel = HistogramEqualizationMethod(ColorImage.get_channel(0),GetHistogram(ColorImage.get_channel(0);CImg G_Channel = HistogramEqualizationMethod(ColorImage.get_channel(1),GetHistogram(ColorImage.get_channel(1);CImg B_Channel = HistogramEquali

43、zationMethod(ColorImage.get_channel(2), GetHistogram(ColorImage.get_channel(2); CImg EqualizedImage = ColorImage;cimg_forXY(ColorImage, x, y) EqualizedImage(x, y, 0) = R_Channel(x, y, 0);EqualizedImage(x, y, 1) = G_Channel(x, y, 0);EqualizedImage(x, y, 2) = B_Channel(x, y, 0);if (show) EqualizedImag

44、e.display(通道獨立均衡化結(jié)果);char FileName100 = ;sprintf_s(FileName,%d_OneChannels_equalize_%s,number+,ImageFileName.c_str();EqualizedImage.save(FileName);return EqualizedImage;三通道直方圖平均后均衡化代碼如下:/*傳入三個通道圖像計算平均亮度直方圖*/CImg HistogramEqualization:GetAverageHistogram(CImg img1, CImg img2, CImg img3)CImg histogram

45、(256, 1, 1, 1, 0);cimg_forXY(img1, x, y) +histogram(int)img1(x, y);+histogram(int)img2(x, y);+histogram(int)img3(x, y);cimg_forX(histogram, pos) histogram(pos) /= 3;return histogram; / 功能:對彩色圖進行直方圖均衡化,先求三個通道的平均直方圖/ 輸入: 彩色圖文件名/ 輸出: 均衡化結(jié)果CImg HistogramEqualization:Hist_Equal_ColorImage_ThreeColorChann

46、els(string ImageFileName)CImg ColorImage;ColorImage.load_bmp(ImageFileName.c_str();CImg R_Channel = ColorImage.get_channel(0);CImg G_Channel = ColorImage.get_channel(1);CImg B_Channel = ColorImage.get_channel(2);CImg AverageHistogram = GetAverageHistogram(R_Channel, G_Channel, B_Channel); double Cum

47、ulativeDistributionFunction256 = 0 ; / 灰度直方圖的累積分布double EqualizedResult256 = 0 ; / 均衡化結(jié)果圖int count = 0;int L = 256;int NumOfPixels = ColorImage._height * ColorImage._width;cimg_forX(AverageHistogram, pos) count += AverageHistogrampos;CumulativeDistributionFunctionpos = 1.0 * count / NumOfPixels;Equa

48、lizedResultpos = round(CumulativeDistributionFunctionpos * (L - 1);CImg EqualizedImage = ColorImage;cimg_forXY(EqualizedImage, x, y) EqualizedImage(x, y, 0) = EqualizedResultR_Channel(x, y);EqualizedImage(x, y, 1) = EqualizedResultG_Channel(x, y);EqualizedImage(x, y, 2) = EqualizedResultB_Channel(x,

49、 y);if (show) EqualizedImage.display(三通道直方圖平均后進行均衡化的結(jié)果);char FileName100 = ;sprintf_s(FileName, %d_Threechannels_equalize_%s, number+, ImageFileName.c_str();EqualizedImage.save(FileName);return EqualizedImage;HSI空間下均衡化(復(fù)雜)代碼如下:/*功能:在HSI空間下進行均衡化,然后再轉(zhuǎn)回RGB空間*/CImg HistogramEqualization:Hist_Equal_Color

50、Image_HSISpace(string ImageFileName)CImg ColorImage;ColorImage.load(ImageFileName.c_str();/ 獲取RGB通道圖像,并歸一化CImg R_Channel = ColorImage.get_channel(0)* 1.0 / 255.0;CImg G_Channel = ColorImage.get_channel(1) * 1.0 / 255.0;CImg B_Channel = ColorImage.get_channel(2) * 1.0 / 255.0;int w = ColorImage._widt

51、h;int h = ColorImage._height; / HSI CImg Hue(w, h, 1, 1, 0);CImg Saturation(w, h, 1, 1, 0);CImg Intensity(w, h, 1, 1, 0); / for calculate HueCImg theta(w, h, 1, 1, 0);cimg_forXY(Hue, x, y) double numerator = R_Channel(x, y, 0) - G_Channel(x, y, 0) + R_Channel(x, y, 0) - B_Channel(x, y, 0);double den

52、ominator = 2.0 * sqrt(R_Channel(x, y, 0) - G_Channel(x, y, 0) * (R_Channel(x, y, 0) - G_Channel(x, y, 0)+ (R_Channel(x, y, 0) - B_Channel(x, y, 0)*(G_Channel(x, y, 0) - B_Channel(x, y, 0);theta(x, y, 0) = acos(numerator / denominator); cimg_forXY(Hue, x, y) if (G_Channel(x, y, 0) = B_Channel(x, y, 0

53、) Hue(x, y, 0) = theta(x, y, 0);else Hue(x, y, 0) = 2 * cimg:PI - theta(x, y, 0); / calculate saturation and intensitycimg_forXY(Intensity, x, y) double deno = (R_Channel(x, y, 0) + G_Channel(x, y, 0) + B_Channel(x, y, 0);if (deno = 0) deno = 1e-12f; / 取極小,近似0Saturation(x, y, 0) = 1.0 - 3.0 * cimg:m

54、in(R_Channel(x, y, 0), B_Channel(x, y, 0), G_Channel(x, y, 0)/ deno;Intensity(x, y, 0) = 1.0 * (R_Channel(x, y, 0) + G_Channel(x, y, 0) + B_Channel(x, y, 0) / 3.0;if (Saturation(x, y, 0) = 0) Hue(x, y, 0) = 0; / 黑色CImg tmp_Intensity(w, h, 1, 1, 0); / 亮度圖像 0255cimg_forXY(tmp_Intensity, x, y) tmp_Intensity(x, y, 0) = floor(Intensity(x, y, 0) * 255);CImg I_Histogram = GetHistogram(tmp_Intensity); / 亮度直方圖,由于rgb通道值

溫馨提示

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

評論

0/150

提交評論