日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理

發(fā)布時(shí)間:2024/7/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?本文主要講述基于VC++6.0 MFC圖像處理的應(yīng)用知識(shí),主要結(jié)合自己大三所學(xué)課程《數(shù)字圖像處理》及課件進(jìn)行講解,主要通過MFC單文檔視圖實(shí)現(xiàn)顯示BMP圖片點(diǎn)運(yùn)算處理,包括圖像灰度線性變換、灰度非線性變換、圖像閾值化處理、圖像均衡化處理等知識(shí),并結(jié)合前一篇論文灰度直方圖進(jìn)行展示 。同時(shí)文章比較詳細(xì)基礎(chǔ),希望該篇文章對你有所幫助,尤其是初學(xué)者和學(xué)習(xí)圖像處理的學(xué)生。
? ? ? ?【數(shù)字圖像處理】一.MFC詳解顯示BMP格式圖片
? ? ? ?【數(shù)字圖像處理】二.MFC單文檔分割窗口顯示圖片
? ? ? ?【數(shù)字圖像處理】三.MFC實(shí)現(xiàn)圖像灰度、采樣和量化功能詳解
? ? ? ?【數(shù)字圖像處理】四.MFC對話框繪制灰度直方圖
? ? ? ??免費(fèi)資源下載地址:
? ? ? ??http://download.csdn.net/detail/eastmount/8764373

?

一. 點(diǎn)運(yùn)算與初始操作

? ? ? ? 圖像的點(diǎn)運(yùn)算是圖像處理中非常基礎(chǔ)的技術(shù),它主要用于改變一篇圖像的灰度分布范圍,通過一定的變換函數(shù)將圖像的像素進(jìn)行轉(zhuǎn)換,最終生成一幅新的圖像。點(diǎn)運(yùn)算的最大特點(diǎn)就是輸出像素值只與當(dāng)前輸入像素值相關(guān)。定義如下。
? ? ? ??點(diǎn)運(yùn)算(Point Operation)指對于一幅輸入圖像,將產(chǎn)生一幅輸出圖像,輸出圖像的每個(gè)像素點(diǎn)的灰度值由輸入像素點(diǎn)決定。
? ? ? ? 點(diǎn)運(yùn)算由灰度變換函數(shù)(Grap Scale Transformation,GST)確定:B(x,y)=F[A(x,y)]
? ? ? ? 需要注意一下幾點(diǎn):
? ? ? ? (1).與局部或鄰域運(yùn)算的差別,輸入像素和輸出像素是一一對應(yīng)的;(2).與幾何運(yùn)算的差別,不改變圖像的空間關(guān)系;(3).又稱為對比增強(qiáng),對比拉伸或灰度變換。

? ? ? ? 在前面第四篇博客的基礎(chǔ)上增加點(diǎn)運(yùn)算處理。
? ? ? ? 第一步:在資源視圖中Menu中添加“圖像點(diǎn)運(yùn)算”菜單欄如下所示:


? ? ? ? 對應(yīng)的ID值為:
? ? ? ? 線性變換 ID_DYS_XXYD(點(diǎn)運(yùn)算 線性移動(dòng)) ID_DYS_XXZQ( 點(diǎn)運(yùn)算 線性增強(qiáng))
? ? ? ? ? ? ? ? ? ? ? ?ID_DYS_XXJX(點(diǎn)運(yùn)算 線性減小) ?ID_DYS_XXQB(點(diǎn)運(yùn)算 線性求補(bǔ))
? ? ? ? 非線性變換 ID_DYS_FXXPF(點(diǎn)運(yùn)算 非線性平方) ID_DYS_FXXHS(非線性函數(shù))
? ? ? ? 閾值變換 ID_DYS_YZBH(點(diǎn)運(yùn)算 閾值變換)?圖像均衡化 ID_DYS_JHH

? ? ? ? 第二步:打開類向?qū)?Ctrl+W),為點(diǎn)運(yùn)算每個(gè)ID菜單添加相應(yīng)的功能處理函數(shù),如下圖所示:選擇類CImageProcessingView,在選擇IDs為ID_DYS_...(點(diǎn)運(yùn)算)添加函數(shù)OnDysXxqb()線性求補(bǔ)。

?

?

二. 線性變換

? ? ? ? 圖像線性變換是通過建立灰度映射來調(diào)整資源圖像的灰度,從而達(dá)到圖像增強(qiáng)的目的。其中GST函數(shù)f(D)為線性的,即:


? ? ? ? 若a=1,b=0圖像像素不發(fā)生變化
? ? ? ? 若a=1,b!=0圖像所有灰度值上移或下移
? ? ? ? 若a>1輸出圖像對比度增強(qiáng)
? ? ? ? 若0<a<1輸出圖像對比度減小
? ? ? ? 若a<0暗區(qū)域變亮,亮區(qū)域變暗,圖像求補(bǔ)


?

? ? ? ??1.D(B)=D(A)+50
? ? ? ? 首先是圖像移動(dòng),代碼如下:

  • /**********************************************************************/

  • /* 圖像點(diǎn)運(yùn)算 4種線性變化直方圖:

  • /* ID_DYS_XXYD:表示線性灰度變化移動(dòng) D(B)=D(A)+50 灰度值上移下移

  • /* ID_DYS_XXZQ:表示線性灰度變化增強(qiáng) D(B)=1.5*D(A) 圖像對比度增強(qiáng)

  • /* ID_DYS_XXJX:表示線性灰度變化減小 D(B)=0.8*D(A) 圖像對比度減小

  • /* ID_DYS_XXQB:表示線性灰度求補(bǔ) D(B)=-1*D(A)+255 圖像暗區(qū)變亮,亮區(qū)變暗

  • /**********************************************************************/

  • ?
  • // 1.點(diǎn)運(yùn)算 線性灰度變化移動(dòng) D(B)=D(A)+50

  • void CImageProcessingView::OnDysXxyd()

  • {

  • // TODO: Add your command handler code here

  • if(numPicture==0) {

  • AfxMessageBox("載入圖片后才能線性灰度運(yùn)算!",MB_OK,0);

  • return;

  • }

  • AfxMessageBox("線性灰度直方圖-灰度變化移動(dòng) D(B)=D(A)+50!",MB_OK,0);

  • int i;

  • //打開臨時(shí)的圖片

  • FILE *fpo = fopen(BmpName,"rb");

  • FILE *fpw = fopen(BmpNameLin,"wb+");

  • //讀取文件

  • fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  • fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  • fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  • fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  • //灰度圖像

  • unsigned char color;

  • unsigned char red,green,blue;

  • for( i=0; i<m_nImage/3; i++ )

  • {

  • fread(&red,sizeof(char),1,fpo);

  • fread(&green,sizeof(char),1,fpo);

  • fread(&blue,sizeof(char),1,fpo);

  • ?
  • if( (int)red+50 >255 )

  • red=255;

  • else

  • red=(int)red+50;

  • ?
  • if( (int)green+50>255 )

  • green=255;

  • else

  • green=(int)green+50;

  • ?
  • if( (int)blue+50>255 )

  • blue=255;

  • else

  • blue=(int)blue+50;

  • ?
  • fwrite(&red,sizeof(char),1,fpw);

  • fwrite(&green,sizeof(char),1,fpw);

  • fwrite(&blue,sizeof(char),1,fpw);

  • }

  • fclose(fpo);

  • fclose(fpw);

  • numPicture = 2;

  • level=101; //賦值101在ShowBitmap中調(diào)用顯示處理后的圖片

  • Invalidate();

  • }

  • ? ? ? ? 同時(shí)修改void CImageProcessingView::ShowBitmap(CDC *pDC,?
    CString BmpName)函數(shù)中的代碼:

  • else //圖像點(diǎn)運(yùn)算 線性變化

  • if(level=101)

  • {

  • m_hBitmapChange = (HBITMAP) LoadImage(NULL,BmpNameLin,IMAGE_BITMAP,0,0,

  • LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);

  • }

  • ? ? ? ? 運(yùn)行效果如下圖所示,同時(shí)我截取了直方圖(RGB相同只顯示一種)。

    ? ? ? ? 可以發(fā)現(xiàn)圖像的灰度上移了50,圖像更白了(黑0-255白)。

    ? ? ? ??2.D(B)=1.5*D(A)

  • // 2.點(diǎn)運(yùn)算 線性灰度變化增強(qiáng) D(B)=1.5*D(A)

  • void CImageProcessingView::OnDysXxzq()

  • {

  • if(numPicture==0) {

  • AfxMessageBox("載入圖片后才能線性灰度運(yùn)算!",MB_OK,0);

  • return;

  • }

  • AfxMessageBox("線性灰度直方圖-灰度變化增強(qiáng) D(B)=1.5*D(A)!",MB_OK,0);

  • int i;

  • //打開臨時(shí)的圖片

  • FILE *fpo = fopen(BmpName,"rb");

  • FILE *fpw = fopen(BmpNameLin,"wb+");

  • fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  • fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  • fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  • fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  • //灰度圖像

  • unsigned char color;

  • unsigned char red,green,blue;

  • for( i=0; i<m_nImage/3; i++ )

  • {

  • fread(&red,sizeof(char),1,fpo);

  • fread(&green,sizeof(char),1,fpo);

  • fread(&blue,sizeof(char),1,fpo);

  • ?
  • if( (int)red*1.5 >255 )

  • red=255;

  • else

  • red=(int)red*1.5;

  • ?
  • if( (int)green*1.5>255 )

  • green=255;

  • else

  • green=(int)green*1.5;

  • ?
  • if( (int)blue*1.5>255 )

  • blue=255;

  • else

  • blue=(int)blue*1.5;

  • ?
  • fwrite(&red,sizeof(char),1,fpw);

  • fwrite(&green,sizeof(char),1,fpw);

  • fwrite(&blue,sizeof(char),1,fpw);

  • }

  • fclose(fpo);

  • fclose(fpw);

  • numPicture = 2;

  • level=101; //線性變化 ShowBitmap中調(diào)用

  • Invalidate();

  • }

  • ? ? ? ? 運(yùn)行效果如下圖所示,圖像對比度增強(qiáng),平均灰度122*1.5=181

    ?

    ?

    ? ? ? ? 3.D(B)=0.8*D(A)

  • // 3.點(diǎn)運(yùn)算 線性灰度變化減小D(B)=0.8*D(A)

  • void CImageProcessingView::OnDysXxjx()

  • {

  • if(numPicture==0) {

  • AfxMessageBox("載入圖片后才能線性灰度處理!",MB_OK,0);

  • return;

  • }

  • AfxMessageBox("線性灰度直方圖-灰度減小 D(B)=0.8*D(A)!",MB_OK,0);

  • int i;

  • //打開臨時(shí)的圖片

  • FILE *fpo = fopen(BmpName,"rb");

  • FILE *fpw = fopen(BmpNameLin,"wb+");

  • fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  • fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  • fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  • fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  • //灰度圖像

  • unsigned char color;

  • unsigned char red,green,blue;

  • for( i=0; i<m_nImage/3; i++ )

  • {

  • fread(&red,sizeof(char),1,fpo);

  • fread(&green,sizeof(char),1,fpo);

  • fread(&blue,sizeof(char),1,fpo);

  • ?
  • red=(int)red*0.8;

  • green=(int)green*0.8;

  • blue=(int)blue*0.8;

  • ?
  • fwrite(&red,sizeof(char),1,fpw);

  • fwrite(&green,sizeof(char),1,fpw);

  • fwrite(&blue,sizeof(char),1,fpw);

  • }

  • fclose(fpo);

  • fclose(fpw);

  • numPicture = 2;

  • level=101;

  • Invalidate();

  • }

  • ? ? ? ? 運(yùn)行如下圖所示,圖像減弱。



    ? ? ? ? 4.D(B)=-1*D(A)+255

  • // 4.點(diǎn)運(yùn)算 線性灰度求補(bǔ) D(B)=-1*D(A)+255

  • void CImageProcessingView::OnDysXxqb()

  • {

  • if(numPicture==0) {

  • AfxMessageBox("載入圖片后才能線性灰度處理!",MB_OK,0);

  • return;

  • }

  • AfxMessageBox("線性灰度直方圖-灰度求補(bǔ) D(B)=-1*D(A)+255!",MB_OK,0);

  • int i;

  • //打開臨時(shí)的圖片

  • FILE *fpo = fopen(BmpName,"rb");

  • FILE *fpw = fopen(BmpNameLin,"wb+");

  • fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  • fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  • fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  • fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  • //灰度圖像

  • unsigned char color;

  • unsigned char red,green,blue;

  • for( i=0; i<m_nImage/3; i++ )

  • {

  • fread(&red,sizeof(char),1,fpo);

  • fread(&green,sizeof(char),1,fpo);

  • fread(&blue,sizeof(char),1,fpo);

  • ?
  • red=(int)red*(-1)+255;

  • green=(int)green*(-1)+255;

  • blue=(int)blue*(-1)+255;

  • ?
  • fwrite(&red,sizeof(char),1,fpw);

  • fwrite(&green,sizeof(char),1,fpw);

  • fwrite(&blue,sizeof(char),1,fpw);

  • }

  • fclose(fpo);

  • fclose(fpw);

  • numPicture = 2;

  • level=101;

  • Invalidate();

  • }

  • ? ? ? ? 運(yùn)行效果如下圖所示,它是圖像的求補(bǔ),發(fā)現(xiàn)直方圖是互補(bǔ)的。

    ? ? ? ? PS:注意圖片下面的直方圖應(yīng)該還有一個(gè)處理后的直方圖,但原理都一樣,我不想重復(fù)工作,你自己可以去簡單實(shí)現(xiàn)下,參考第四篇文章。同時(shí)這些圖片制作還挺麻煩的,只是為了給你更好的呈現(xiàn)它們的變化,希望對你有用和尊重作者,不喜勿噴~

    ?

    ?

    三. 非線性變換

    ? ? ? ? 灰度非線性變換主要包括對數(shù)變換、冪次變換、指數(shù)變換、分段函數(shù)變換,通過非線性關(guān)系對圖像進(jìn)行灰度處理,下面主要講解課件中的兩個(gè)函數(shù)對其進(jìn)行處理。其中對數(shù)變換實(shí)現(xiàn)了擴(kuò)展低灰度值而壓縮高灰度值的效果,圖像灰度分布更符合而你的視覺特征。


    ? ? ? ? 1.D(B)=D(A)*D(A)/252

  • /************************************************************************/

  • /* 2種非線性變化直方圖:

  • /* ID_DYS_FXXPF:表示非線性平方灰度變化,D(B)=D(A)*D(A)/255

  • /* ID_DYS_FXXHS:表示非線性函數(shù)灰度變化,D(B)=D(A)+0.8*D(A)*(255-D(A))/255

  • /************************************************************************/

  • ?
  • // 非線性平方灰度變化 D(B)=D(A)*D(A)/252

  • void CImageProcessingView::OnDysFxxpf()

  • {

  • if(numPicture==0)

  • {

  • AfxMessageBox("載入圖片后才能非線性灰度處理!",MB_OK,0);

  • return;

  • }

  • AfxMessageBox("非線性灰度變化 D(B)=D(A)*D(A)/255!",MB_OK,0);

  • int i;

  • //打開臨時(shí)的圖片

  • FILE *fpo = fopen(BmpName,"rb");

  • FILE *fpw = fopen(BmpNameLin,"wb+");

  • //讀取文件

  • fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  • fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  • fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  • fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  • //灰度圖像

  • unsigned char color;

  • unsigned char red,green,blue;

  • for( i=0; i<m_nImage/3; i++ )

  • {

  • fread(&red,sizeof(char),1,fpo);

  • fread(&green,sizeof(char),1,fpo);

  • fread(&blue,sizeof(char),1,fpo);

  • ?
  • red=(int)red*(int)red/255;

  • green=(int)green*(int)green/255;

  • blue=(int)blue*(int)blue/255;

  • ?
  • fwrite(&red,sizeof(char),1,fpw);

  • fwrite(&green,sizeof(char),1,fpw);

  • fwrite(&blue,sizeof(char),1,fpw);

  • }

  • fclose(fpo);

  • fclose(fpw);

  • numPicture = 2;

  • level=101;

  • Invalidate();

  • }

  • ? ? ? ? 運(yùn)行效果如下圖所示:


    ? ? ? ? 2.D(B)=D(A)+0.8*D(A)*(255-D(A))/255

  • // 非線性函數(shù)灰度變化 D(B)=D(A)+0.8*D(A)*(255-D(A))/255

  • void CImageProcessingView::OnDysFxxhs()

  • {

  • if(numPicture==0)

  • {

  • AfxMessageBox("載入圖片后才能非線性灰度處理!",MB_OK,0);

  • return;

  • }

  • AfxMessageBox("線性灰度直方圖-灰度變化增強(qiáng) D(B)=D(A)+0.8*D(A)*(255-D(A))/255!",MB_OK,0);

  • int i;

  • ?
  • FILE *fpo = fopen(BmpName,"rb");

  • FILE *fpw = fopen(BmpNameLin,"wb+");

  • fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  • fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  • fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  • fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  • ?
  • unsigned char color;

  • unsigned char red,green,blue;

  • for( i=0; i<m_nImage/3; i++ )

  • {

  • fread(&red,sizeof(char),1,fpo);

  • fread(&green,sizeof(char),1,fpo);

  • fread(&blue,sizeof(char),1,fpo);

  • ?
  • if( ((int)red+0.8*(int)red*(255-(int)red)/255) > 255 )

  • red=255;

  • else

  • red=(int)red+0.8*(int)red*(255-(int)red)/255;

  • ?
  • if( ((int)green+0.8*(int)green*(255-(int)green)/255) > 255 )

  • green=255;

  • else

  • green=(int)green+0.8*(int)green*(255-(int)green)/255;

  • ?
  • if( ((int)blue+0.8*(int)blue*(255-(int)blue)/255) > 255 )

  • blue=255;

  • else

  • blue=(int)blue+0.8*(int)blue*(255-(int)blue)/255;

  • ?
  • fwrite(&red,sizeof(char),1,fpw);

  • fwrite(&green,sizeof(char),1,fpw);

  • fwrite(&blue,sizeof(char),1,fpw);

  • }

  • fclose(fpo);

  • fclose(fpw);

  • numPicture = 2;

  • level=101;

  • Invalidate();

  • }

  • ? ? ? ? 運(yùn)行效果如下圖所示:


    ? ? ? ? 寫到此處你會(huì)發(fā)現(xiàn)圖像灰度的線性變換和非線性變換是非常簡單的,主要是通過以下步驟完成:
    ? ? ? ? 第一步:賦值處理后圖像的BMP頭信息
    ? ? ? ? ? ? FILE *fpo = fopen(BmpName,"rb");
    ? ? ? ? ? ? FILE *fpw = fopen(BmpNameLin,"wb+");
    ? ? ? ? ? ? fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
    ? ? ? ? ? ? fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
    ? ? ? ? ? ? fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
    ? ? ? ? ? ? fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
    ? ? ? ? 第二步:通過循環(huán)和線性變換或非線性便函函數(shù)處理每一個(gè)像素
    ? ? ? ? ? ??for( i=0; i<m_nImage/3; i++ )
    ? ? ? ? ? ? {
    ? ? ? ? ? ? ? ? ?fread(&red,sizeof(char),1,fpo);
    ? ? ? ? ? ? ? ? ?處理像素RBG 如:red=(int)red*(int)red/255;
    ? ? ? ? ? ? ? ? ?fwrite(&red,sizeof(char),1,fpw);
    ? ? ? ? ? ? }
    ? ? ? ? ?第三步:調(diào)用ShowBitmap自定義函數(shù)并重繪圖像
    ? ? ? ? ? ??numPicture = 2;
    ? ? ? ? ? ? level=101;
    ? ? ? ? ? ? Invalidate();
    ? ? ? ??而它的主要應(yīng)用包括:光度學(xué)標(biāo)定,希望數(shù)字圖像的灰度能夠真實(shí)反映圖像的物理特性;對比度增強(qiáng)和對比度擴(kuò)展;顯示標(biāo)定和輪廓線確定(閾值化)。

    ?

    ?

    四. 灰度閾值化

    ? ? ? ? 閾值又稱為臨界值,它的目的是確定出一個(gè)范圍,然后這個(gè)范圍內(nèi)的部分使用同一種方法處理,而閾值之外的部分則使用另一種處理方法或保持原樣。常用的包括產(chǎn)生二值圖:當(dāng)x<T時(shí)y=0,當(dāng)x>=T時(shí)y=255(其中T是閾值)。閾值變換在生物學(xué)上的應(yīng)用比較廣泛,常用語細(xì)胞圖像分割等。
    ? ? ? ? 打開類向?qū)?Ctrl+W)生成選擇ImageProcessingView類,IDs選擇ID_DYS_YZBH后添加相應(yīng)的函數(shù)。代碼如下:

  • /**************************************************************/

  • /* ID_DYS_YZBH:表示點(diǎn)運(yùn)算閾值變換 也看做灰度拉伸

  • /* 此處的拉伸是:閾值化(thresholding)可以看作是削波的一個(gè)特例

  • /* 只要令削波中的g1old=g2old就實(shí)現(xiàn)了閾值化。

  • /* 閾值就象個(gè)門檻,比它大就是白,比它小就是黑,二值

  • /**************************************************************/

  • ?
  • void CImageProcessingView::OnDysYzbh()

  • {

  • if(numPicture==0)

  • {

  • AfxMessageBox("載入圖片后才能點(diǎn)運(yùn)算閾值化處理!",MB_OK,0);

  • return;

  • }

  • AfxMessageBox("圖像點(diǎn)運(yùn)算閾值化處理!",MB_OK,0);

  • //讀寫文件

  • FILE *fpo = fopen(BmpName,"rb");

  • FILE *fpw = fopen(BmpNameLin,"wb+");

  • fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  • fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  • fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  • fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  • //處理

  • unsigned char color;

  • unsigned char red,green,blue;

  • for(int i=0; i<m_nImage/3; i++ )

  • {

  • fread(&red,sizeof(char),1,fpo);

  • fread(&green,sizeof(char),1,fpo);

  • fread(&blue,sizeof(char),1,fpo);

  • ?
  • if( (int)red > 128 )

  • red=255;

  • else

  • red=0;

  • ?
  • if( (int)green > 128 )

  • green=255;

  • else

  • green=0;

  • ?
  • if( (int)blue > 128 )

  • blue=255;

  • else

  • blue=0;

  • ?
  • fwrite(&red,sizeof(char),1,fpw);

  • fwrite(&green,sizeof(char),1,fpw);

  • fwrite(&blue,sizeof(char),1,fpw);

  • }

  • fclose(fpo);

  • fclose(fpw);

  • numPicture = 2;

  • level=101;

  • Invalidate();

  • }

  • ? ? ? ? 運(yùn)行效果如下圖所示,感覺還挺好看的,顯然此時(shí)的直方圖就是0和255兩條直線。

    ?

    ?

    五. 灰度均衡化

    ? ? ? ? 灰度均衡化的目的是使一輸入圖像轉(zhuǎn)換為在每一灰度級上都有相同的像素點(diǎn)(即輸出的直方圖是平的),它可以產(chǎn)生一幅灰度級分布概率均衡的圖像。
    ? ? ? ? 換句話說,經(jīng)過均衡化后的圖像在每一級灰度上像素點(diǎn)的數(shù)量相差不大,對應(yīng)的灰度直方圖的每一級高度也相差不大。它是增強(qiáng)圖像的有效手段之一。
    ? ? ? ? 研究思路是通過直方圖變換公式實(shí)現(xiàn):


    ? ? ? ? 它的步驟如下圖所示:

    ? ? ? ? 例:有一幅圖象,共有16級灰度,其直方圖分布為Pi, i=0,1,…,15,求經(jīng)直方圖均衡化后,量化級別為10級的灰度圖象的直方圖分布Qi,其中Pi和Qi為分布的概率,即灰度i出現(xiàn)的次數(shù)與總的點(diǎn)數(shù)之比。
    ? ? ? ??Pi:0.03, 0, 0.06, 0.10, 0.20,?0.11, 0, 0,?0, 0.03, 0, 0.06, 0.10,?0.20, 0.11, 0
    ? ? ? ??步驟1:用一個(gè)數(shù)組s記錄Pi,即s[0]=0.03,s[1]=0,s[2]=0.06,…,s[14]=0.11,s[15]=0
    ? ? ? ? 步驟2:i從1開始,令s[i]=s[i]+s[i-1],得到的結(jié)果是s: 0.03,? 0.03,?0.09,? 0.19,? 0.39,?0.50,? 0.50,? 0.50,?0.50,? 0.53,? 0.53,?0.59,? 0.69,? 0.89,?1.0,? 1.0
    ? ? ? ??步驟3:用一個(gè)數(shù)組L記錄新的調(diào)色板索引值,即令L[i]=s[i]×(10-1),得到的結(jié)果是L:0,0,1,2,4,5,5,5,5,5,5,5,6,8,9,9
    ? ? ? ? 這樣就找到了原來的調(diào)色板索引值和新的調(diào)色板索引值之間的對應(yīng)關(guān)系,即
    ? ? ? ? 0→0,? 1→0,?2→1,? 3→2,? 4→4,?5→5,? 6→5,? 7→5,?8→5,? 9→5,? 10→5,?11→5,? 12→6,? 13→8,?14→9,? 15→9。
    ? ? ? ?步驟4:將老的索引值對應(yīng)的概率合并,作為對應(yīng)的新的索引值的概率。例如,原來的索引值0,1都對應(yīng)了新的索引值0,則灰度索引值為0的概率為P0+P1=0.03;新的索引值3和7找不到老的索引值與之對應(yīng),所以令Q3和Q7為0。最后得到的結(jié)果是Qi:0.03,? 0.06,?0.10,? 0,? 0.20,?0.20,? 0.10,? 0,?0.20,? 0.11?

    ? ? ? ? 代碼中有詳細(xì)注釋如下:

  • // ID_DYS_JHH:表示圖像均衡化 相見算法

  • void CImageProcessingView::OnDysJhh()

  • {

  • if(numPicture==0) {

  • AfxMessageBox("載入圖片后才能圖像均衡化!",MB_OK,0);

  • return;

  • }

  • AfxMessageBox("圖像均衡化!",MB_OK,0);

  • ?
  • //第一步:獲取圖像的數(shù)據(jù)信息

  • //此操作可以在打開圖片時(shí)就進(jìn)行 在直方圖采樣(ZFTCY)中也有該代碼

  • FILE *fpo = fopen(BmpName,"rb");

  • fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  • fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  • ?
  • int i,j,k;

  • for(j=0;j<256;j++) { //定義數(shù)組并清零

  • Red[j]=0;

  • Green[j]=0;

  • Blue[j]=0;

  • }

  • ?
  • //計(jì)算4個(gè)數(shù)據(jù)

  • unsigned char red,green,blue;

  • int IntRed,IntGreen,IntBlue; //強(qiáng)制轉(zhuǎn)換

  • double sumRedHD=0,sumGreenHD=0,sumBlueHD=0; //記錄像素總的灰度值和

  • for(i=0; i<m_nImage/3; i++ )

  • {

  • fread(&red,sizeof(char),1,fpo);

  • IntRed=int(red);

  • sumRedHD=sumRedHD+IntRed;

  • if( IntRed>=0 && IntRed<256 ) Red[IntRed]++;

  • ?
  • fread(&green,sizeof(char),1,fpo);

  • IntGreen=int(green);

  • sumGreenHD=sumGreenHD+IntGreen;

  • if( IntGreen>=0 && IntGreen<256 ) Green[IntGreen]++;

  • ?
  • fread(&blue,sizeof(char),1,fpo);

  • IntBlue=int(blue);

  • sumBlueHD=sumBlueHD+IntBlue;

  • if( IntBlue>=0 && IntBlue<256 ) Blue[IntBlue]++;

  • }

  • fclose(fpo);

  • ?
  • /*****************************************************************/

  • /* 圖像均衡化處理

  • /* 利用全局變量 Red[256] Blue[256] Green[256]

  • /* 第一步:用3個(gè)數(shù)組Count..記錄0-255灰度出現(xiàn)的概率,即

  • /* 概率=該灰度出現(xiàn)次數(shù)*3/總得像素 (因?yàn)榉殖?部分RGB)

  • /* 第二步:i從1開始,令s[i]=s[i]+s[i-1] 記錄新概率數(shù)

  • /* 第三步:用一個(gè)數(shù)組L記錄新的調(diào)色板索引值,即

  • /* L[i]=s[i]×(256-1)結(jié)果四舍五入2.8即為3

  • /* 第四步:將老的索引值對應(yīng)的概率合并,作為對應(yīng)的新的索引值的概率

  • /* 1.原來的索引值0,1都對應(yīng)了新的索引值0,則灰度索引值為0的概率

  • /* 為P0+P1=0.03

  • /* 2.新的索引值3和7找不到老的索引值與之對應(yīng),所以令Q3和Q7為0

  • /*****************************************************************/

  • ?
  • //記錄出現(xiàn)的概率,會(huì)加到1 用于相加到調(diào)色板

  • float CountRed[256],CountGreen[256],CountBlue[256];

  • //記錄原始數(shù)據(jù),不會(huì)相加到1 用于計(jì)算新灰度概率

  • float CountRedLin[256],CountGreenLin[256],CountBlueLin[256];

  • ?
  • for( k=0 ; k<256 ; k++ )

  • {

  • CountRed[k]=(float)(Red[k])*3/m_nImage;

  • CountRedLin[k]=CountRed[k];

  • CountGreen[k]=(float)(Green[k])*3/m_nImage;

  • CountGreenLin[k]=CountGreen[k];

  • CountBlue[k]=(float)(Blue[k])*3/m_nImage;

  • CountBlueLin[k]=CountBlue[k];

  • }

  • ?
  • for( k=1 ; k<256 ; k++ )

  • {

  • CountRed[k]=CountRed[k]+CountRed[k-1];

  • CountGreen[k]=CountGreen[k]+CountGreen[k-1];

  • CountBlue[k]=CountBlue[k]+CountBlue[k-1];

  • }

  • ?
  • /****************************************************/

  • /* 此處百度到一個(gè)四舍五入浮點(diǎn)型的算法:

  • /* float a=3.456; 保留到小數(shù)點(diǎn)后兩位

  • /* float b=(int)((a * 100) + 0.5) / 100.0;

  • /* output b=3.46

  • /****************************************************/

  • ?
  • int LRed[256],LGreen[256],LBlue[256]; //記錄調(diào)色板

  • for( k=0 ; k<256 ; k++ )

  • {

  • LRed[k]=(int)(CountRed[k]*(256-1)+0.5);

  • LGreen[k]=(int)(CountGreen[k]*(256-1)+0.5);

  • LBlue[k]=(int)(CountBlue[k]*(256-1)+0.5);

  • }

  • ?
  • //第三步:處理均衡化圖像寫入 打開臨時(shí)的圖片

  • fpo = fopen(BmpName,"rb");

  • fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  • fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  • ?
  • FILE *fpw = fopen(BmpNameLin,"wb+");

  • fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

  • fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

  • ?
  • //m_nWidth*m_nHeight 讀取圖片最后一行不為m_nWidth時(shí)會(huì)報(bào)錯(cuò) 改為m_nImage/3

  • for( i=0; i<m_nImage/3 ; i++ )

  • {

  • fread(&red,sizeof(char),1,fpo);

  • fread(&green,sizeof(char),1,fpo);

  • fread(&blue,sizeof(char),1,fpo);

  • ?
  • red=LRed[int(red)];

  • green=LGreen[int(green)];

  • blue=LBlue[int(blue)];

  • ?
  • fwrite(&red,sizeof(char),1,fpw);

  • fwrite(&green,sizeof(char),1,fpw);

  • fwrite(&blue,sizeof(char),1,fpw);

  • }

  • fclose(fpw);

  • numPicture = 2;

  • level=101;

  • Invalidate();

  • }

  • ? ? ? ? 運(yùn)行結(jié)果如下圖所示,圖像增強(qiáng)而且異常清晰:

    ?


    ? ? ? ? 最后介紹下圖像對比度拉伸,它就是把你感興趣的灰度范圍拉開,使得該范圍內(nèi)像素,亮的更亮,暗的更暗,從而達(dá)到增強(qiáng)對比度的目的。
    ? ? ? ? 如下圖所示,a、b、c為三段直線的斜率,g1old和g2old表示途中要進(jìn)行對比度擴(kuò)展的范圍,g1new和g2new表示對應(yīng)的新值。當(dāng)g1old=g2old就是二值圖像閾值化處理。

    ?

    ? ? ? ? ??由于灰度界別也是255這個(gè)約束,所以滿足

    ? ? ? ?其中g(shù)1old=100,g2old=150,b=3.0的運(yùn)行效果如下所示:

    ?


    ? ? ? ??

    //

    https://blog.csdn.net/eastmount/article/details/46312145

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。