OpenCV映像增強演算法實現(長條圖均衡化、拉普拉斯、Log、Gamma)

來源:互聯網
上載者:User

標籤:增強   span   http   fonts   cti   data-   htm   pen   line   

1. 基於長條圖均衡化的映像增強
長條圖均衡化是通過調整映像的灰階分布,使得在0~255灰階上的分布更加均衡,提高了映像的對比,達到改善映像主觀視覺效果的目的。對比較低的映像適合使用長條圖均衡化方法來增強映像細節。
彩色映像的長條圖均衡化實現:

  
  1. #include <opencv2/highgui/highgui.hpp>
  2. #include <opencv2/imgproc/imgproc.hpp>
  3. #include <iostream>
  4. using namespace cv;
  5. int main(int argc, char *argv[])
  6. {
  7. Mat image = imread("Test.jpg", 1);
  8. if (image.empty())
  9. {
  10. std::cout << "開啟圖片失敗,請檢查" << std::endl;
  11. return -1;
  12. }
  13. imshow("原映像", image);
  14. Mat imageRGB[3];
  15. split(image, imageRGB);
  16. for (int i = 0; i < 3; i++)
  17. {
  18. equalizeHist(imageRGB[i], imageRGB[i]);
  19. }
  20. merge(imageRGB, 3, image);
  21. imshow("長條圖均衡化映像增強效果", image);
  22. waitKey();
  23. return 0;
  24. }

長條圖均衡化增強前原映像:

長條圖均衡化增強後效果:


2. 基於拉普拉斯運算元的映像增強
使用中心為5的8鄰域拉普拉斯運算元與映像卷積可以達到銳利化增強映像的目的,拉普拉斯運算元如所示:        

拉普拉斯運算元可以增強局部的映像對比:

  
  1. #include <opencv2/highgui/highgui.hpp>
  2. #include <opencv2/imgproc/imgproc.hpp>
  3. #include <iostream>
  4. using namespace cv;
  5. int main(int argc, char *argv[])
  6. {
  7. Mat image = imread("Test.jpg", 1);
  8. if (image.empty())
  9. {
  10. std::cout << "開啟圖片失敗,請檢查" << std::endl;
  11. return -1;
  12. }
  13. imshow("原映像", image);
  14. Mat imageEnhance;
  15. Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, 0, 5, 0, 0, -1, 0);
  16. filter2D(image, imageEnhance, CV_8UC3, kernel);
  17. imshow("拉普拉斯運算元映像增強效果", imageEnhance);
  18. waitKey();
  19. return 0;
  20. }


拉普拉斯運算元增強前原映像:

拉普拉斯運算元增強後效果:


3. 基於對數Log變換的映像增強

對數變換可以將映像的低灰階值部分擴充,顯示出低灰階部分更多的細節,將其高灰階值部分壓縮,減少高灰階值部分的細節,從而達到強調映像低灰階部分的目的。變換方法:



對數變換對映像低灰階部分細節增強功能過可以從對數圖上直觀理解:



x軸的0.4大約對應了y軸的0.8,即原圖上0~0.4的低灰階部分經過對數運算後擴充到0~0.8的部分,而整個0.4~1的高灰階部分被投影到只有0.8~1的區間,這樣就達到了擴充和增強低灰階部分,壓縮高灰階部分的值的功能。

從還可以看到,對於不同的底數,底數越大,對低灰階部分的擴充就越強,對高灰階部分的壓縮也就越強。



  
  1. #include <opencv2/highgui/highgui.hpp>
  2. #include <opencv2/imgproc/imgproc.hpp>
  3. using namespace cv;
  4. int main(int argc, char *argv[])
  5. {
  6. Mat image = imread("Test.jpg");
  7. Mat imageLog(image.size(), CV_32FC3);
  8. for (int i = 0; i < image.rows; i++)
  9. {
  10. for (int j = 0; j < image.cols; j++)
  11. {
  12. imageLog.at<Vec3f>(i, j)[0] = log(1 + image.at<Vec3b>(i, j)[0]);
  13. imageLog.at<Vec3f>(i, j)[1] = log(1 + image.at<Vec3b>(i, j)[1]);
  14. imageLog.at<Vec3f>(i, j)[2] = log(1 + image.at<Vec3b>(i, j)[2]);
  15. }
  16. }
  17. //歸一化到0~255
  18. normalize(imageLog, imageLog, 0, 255, CV_MINMAX);
  19. //轉換成8bit映像顯示
  20. convertScaleAbs(imageLog, imageLog);
  21. imshow("Soure", image);
  22. imshow("after", imageLog);
  23. waitKey();
  24. return 0;
  25. }

對數Log變換增強前原映像:


對數Log變換增強後效果:


對數變換對於整體對比偏低並且灰階值偏低的映像增強效果較好。

4. 基於伽馬變換的映像增強

伽馬變換主要用於映像的校正,將灰階過高或者灰階過低的圖片進行修正,增強對比。變換公式就是對原映像上每一個像素值做乘積運算:



伽馬變換對映像的修正作用其實就是通過增強低灰階或高灰階的細節實現的,從伽馬曲線可以直觀理解:



γ值以1為分界,值越小,對映像低灰階部分的擴充作用就越強,值越大,對映像高灰階部分的擴充作用就越強,通過不同的γ值,就可以達到增強低灰階或高灰階部分細節的作用。

伽馬變換對於映像對比偏低,並且整體亮度值偏高(對于于相機過曝)情況下的映像增強效果明顯。

  
  1. #include <opencv2/highgui/highgui.hpp>
  2. #include <opencv2/imgproc/imgproc.hpp>
  3. using namespace cv;
  4. int main(int argc, char *argv[])
  5. {
  6. Mat image = imread("Test.jpg");
  7. Mat imageGamma(image.size(), CV_32FC3);
  8. for (int i = 0; i < image.rows; i++)
  9. {
  10. for (int j = 0; j < image.cols; j++)
  11. {
  12. imageGamma.at<Vec3f>(i, j)[0] = (image.at<Vec3b>(i, j)[0])*(image.at<Vec3b>(i, j)[0])*(image.at<Vec3b>(i, j)[0]);
  13. imageGamma.at<Vec3f>(i, j)[1] = (image.at<Vec3b>(i, j)[1])*(image.at<Vec3b>(i, j)[1])*(image.at<Vec3b>(i, j)[1]);
  14. imageGamma.at<Vec3f>(i, j)[2] = (image.at<Vec3b>(i, j)[2])*(image.at<Vec3b>(i, j)[2])*(image.at<Vec3b>(i, j)[2]);
  15. }
  16. }
  17. //歸一化到0~255
  18. normalize(imageGamma, imageGamma, 0, 255, CV_MINMAX);
  19. //轉換成8bit映像顯示
  20. convertScaleAbs(imageGamma, imageGamma);
  21. imshow("原圖", image);
  22. imshow("伽馬變換映像增強效果", imageGamma);
  23. waitKey();
  24. return 0;
  25. }

伽馬變換增強前原映像:

伽馬變換增強後效果:


(轉)OpenCV映像增強演算法實現(長條圖均衡化、拉普拉斯、Log、Gamma)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.