2015年11月4日 星期三

资工三甲 04362383 林呈钰 hw2

首先这是我用C++builder来完成的第一个作业,

程式不难但做出来对我来说很有成就感,

通过不太难的这些短短的程式码,可以做出Photoshop的一个小小功能还是很开心的。

[ 1 ] 画直方图 

整个思路就是宣告三个阵列,用两个循环去统计每个byte里的RGB值,
再通过之前学的画笔知识去把直方图画出来,从左下角[0,255]坐标开始。
当然我们也要统计出 红,绿,蓝的最大值:
     bMax = 0 ;
     gMax = 0 ;
     rMax = 0 ;
     
for(int i=0 ; i<256 ; i++)
     {
       if(B[i]>bMax) bMax = B[i] ;
       if(G[i]>gMax) gMax = G[i] ;
       if(R[i]>rMax) rMax = R[i] ;
     }


关于画布执行画直方图的部分 只要熟悉画笔的使用就好了,
而它们的高度比例是通过canvas的moveto(,)和lineto(,)的坐标值来决定的,需要用上我之前求出的 R,G,B最大值:
    for(k=0;k<256;k++)
    {
        Image2->Canvas->MoveTo(k,130);
        Image2->Canvas->LineTo(k,130-(G[k]*100/bMax));
    }
     for(k=0;k<256;k++)
    {
        Image3->Canvas->MoveTo(k,130);
        Image3->Canvas->LineTo(k,130-(G[k]*100/bMax));
    }
     for(k=0;k<256;k++)
    {
        Image4->Canvas->MoveTo(k,130);
        Image4->Canvas->LineTo(k,130-(B[k]*100/bMax));
    }





点击“show”按钮就可以画出直方图了。

[ 2 ] 直方图均化

只要将原影像f的像素色彩值f(x,y)的累积密度函数乘上最大色阶值255就可以了:

(先统计) for(int i=1; i<256;i++)
           {
             R[i]=R[i-1]+R[i];
             G[i]=G[i-1]+G[i];
             B[i]=B[i-1]+B[i];
           }
(再计算) for(int i=1;i<256;i++)
           {
             iNewRed[i]=int(255*(double(R[i])/R[255]));
             iNewGreen[i]=int(255*(double(G[i])/G[255]));
             iNewBlue[i]=int(255*(double(B[i])/B[255]));
           }
   
(后赋值) for(int j=0; j<iImageHeight; j++)
          {
             BYTE *bPtrImageRow = (Byte *)Image4->Picture->Bitmap->ScanLine[j];
             for(int i=0; i<iImageWidth; i++)
             {
                 bPtrImageRow[3*i]=iNewBlue[bPtrImageRow[3*i]];
                 bPtrImageRow[3*i+1]=iNewGreen[bPtrImageRow[3*i+1]];
                 bPtrImageRow[3*i+2]=iNewRed[bPtrImageRow[3*i+2]];
             }
          }


(直方图均化之前)



(均化之后)


[ 心得 ]

总结一下这个作业的心得
首先程式码的部分对我来说还是比较容易接受 其实只要思路清晰 并且对c++builder使用熟悉还有对canvas的使用了解 就能完成好这个作业;

直方图第一步要做的就是统计,忽略像素的坐标资料,针对色彩出现的次数来进行统计,分别统计R,G,B的色彩出现次数,然后再用画布画出来。但其实不仅仅只是统计不断循环自加,还需要得到R,G,B最大值,当得到那些数据之后再利用画布画出直方图;

对于直方图均化只要用到老师说的那个转换公式乘以最大色阶255就可以改变原来的图像,将每个点均化后再画出直方图,就是较平滑的状态。直方图均化就是利用图像直方图对对比度进行调节的方法,我的体会是这种方法对于相邻颜色对比比较不明显的地方,可以使亮度平均化,增强局部但是又不影响整体的对比度效果   直方圖均化是利用圖像直方圖對比度進行調整的方法,這種方法對於顏色接近,相鄰顏色對比較不明顯,可以使亮度平均化,增強局部而不影響整體的對比度。
下面这个图应该更加能让人体会到直方图均化的意义~分享给大家



沒有留言:

張貼留言