最近在學習數字圖像處理,更新一些基礎知識,並使用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,便可看出細節信息。這點到閾值分割的時候再講。