基本的灰度變換

最近在學習數字圖像處理,更新一些基礎知識,並使用opencv和C++作復現。函數

基本的灰度變化就是對圖像像素點作運算,使其知足咱們的需求。學習

幾種基本的灰度變換,像素點對應狀況以下圖所示:spa

 

 

一、圖像反轉3d

若原圖像灰度量級【0-L-1】,則現圖像每一個像素點灰度爲x,變化後爲L-1-X。整體變換效果就是暗的變亮,量的變暗。code

 

 1 void reverse(Mat src1)
 2 {
 3     Mat src(src1.size(), CV_8UC1);
 4     cvtColor(src1, src, CV_RGB2GRAY);
 5     Mat deimage(src.size(), CV_8UC1);
 6     int IMGH = src.rows;
 7     int IMGW = src.cols;
 8     uchar* p = src.data;
 9     uchar* pd = deimage.data;
10     int step = src.step;
11     for (int i = 0; i < IMGH; i++)
12     {
13         for (int j = 0; j < IMGW; j++)
14         {
15             pd[i*step + j] = 255 - p[i*step + j];
16         }
17     }
18     imshow("原圖", src);
19     imwrite("原圖.jpg", src);
20     imwrite("變換後圖.jpg", deimage);
21     imshow("變換後圖", deimage);
22     waitKey(0);
23 }

 

效果展現:orm

 

 

 

二、對數變換blog

即將像素值變爲對數形式。因爲對數函數的特色,該變換將較暗區域的像素值映射到較量區域,增長總體圖像亮度。it

 1 void logtrans(Mat src)
 2 {
 3     float hist[256];
 4     for (int i = 0; i < 256; i++)
 5     {
 6         hist[i] = log(1+i);
 7     }
 8     Mat graysrc;
 9     cvtColor(src, graysrc, CV_RGB2GRAY);
10     Mat yimage(graysrc.size(), CV_32FC1);
11     for (int i = 0; i < src.rows; i++)
12     {
13         for (int j = 0; j < src.cols; j++)
14         {
15             yimage.at<float>(i, j) = hist[graysrc.at<uchar>(i, j)];
16         }
17     }
18     Mat dst(graysrc.size(), CV_8UC1);
19     normalize(yimage, dst, 0, 255, NORM_MINMAX);
20     convertScaleAbs(dst,dst);
21     imshow("對數變換", dst);
22     imwrite("對數變換.jpg", dst);
23     waitKey(0);
24 
25 }

效果展現:圖像處理

 

三、冪律變換opencv

和對數變換類似,將像素變換爲指數形式,公式爲cry。不一樣的是可經過控制參數決定擴大較暗區域或較量區域的大小。像素變換先後值以下圖:

 

 

代碼略過。參照對數變換,y爲5

 

 

四、分段變換與灰度分層

分段變換即將不一樣段的像素進行不一樣的像素變換。 灰度分層只每一層灰度表示不一樣的信息。

 

 

代碼略過參照前面圖,結果以下:

 

 

 

灰度分層即找到某閾值,不一樣灰度面表明不一樣的圖像信息。大於閾值的設爲255,小於閾值設爲0,便可看出細節信息。這點到閾值分割的時候再講。

相關文章
相關標籤/搜索