C++數字圖像處理(1)-伽馬變換


https://blog.csdn.net/huqiang_823/article/details/80767019


1、算法原理    伽馬變換(冪律變換)是常用的灰度變換,是一種簡單的圖像增強算法。數學公式如下:(1)    式(1)中,r為輸入的灰度值,取值范圍為[0, 1]。C稱為灰度縮放系數,用於整體拉伸圖像灰度,通常取值為1。gamma取值灰度輸入輸出曲線圖如下:圖(1) gamma曲線圖    從圖(1)可知:當gamma>1.0時,伽馬變換將拉低圖像灰度值,圖像視覺上變暗;當gamm<1.0時,伽馬變換將提高圖像的灰度值,圖像視覺上變亮。2、算法定義    輸入:8位灰度圖像。    輸出:8位灰度圖像。    參數:gamma值、C值。3、算法實現(1)、公式實現//函數名:gammaTransformation//作用:實現灰度變換中的伽馬變換//參數://matInput:輸入圖像//matOutput : 輸出圖像//fGamma : 伽馬值//fC : C值(縮放系數)//返回值:無//注:支持單通道8位灰度圖像void gammaTransformation(cv::Mat& matInput, cv::Mat& matOutput, float fGamma, float fC /*= 1.0f*/){ assert(matInput.elemSize() == 1); //構造輸出圖像 matOutput = cv::Mat::zeros(matInput.rows, matInput.cols, matInput.type());  //循環中盡量避免除法 float fNormalFactor = 1.0f / 255.0f; for (size_t r = 0; r < matInput.rows; r++) {  unsigned char* pInput = matInput.data + r * matInput.step[0];  unsigned char* pOutput = matOutput.data + r * matOutput.step[0];  for (size_t c = 0; c < matInput.cols; c++)  {   //gamma變換   float fOutput = std::pow(pInput[c] * fNormalFactor, fGamma) * fC;   //數值溢出判斷   fOutput = fOutput > 1.0f ? 1.0f : fOutput;   //輸出   pOutput[c] = static_cast<unsigned char>(fOutput * 255.0f);  } }}(2)、查表加速    幾乎所有的灰度變換算法中,都可以使用查表方法進行加速。在【公式實現】中,循環中調用了庫函數pow、並進行了一次if判斷。這些操作,可以在循環外提提前計算好,循環中查表即可。在嵌入式系統中,查表法使用較多。優化后的代碼如下:void gammaTransformation(cv::Mat& matInput, cv::Mat& matOutput, float fGamma, float fC /*= 1.0f*/){ assert(matInput.elemSize() == 1); //構造輸出圖像 matOutput = cv::Mat::zeros(matInput.rows, matInput.cols, matInput.type());  //循環中盡量避免除法 float fNormalFactor = 1.0f / 255.0f; //構造查詢表 std::vector<unsigned char> lookUp(256); for (size_t m = 0; m < lookUp.size(); m++) {  //gamma變換  float fOutput = std::pow(m * fNormalFactor, fGamma) * fC;  //數值溢出判斷  fOutput = fOutput > 1.0f ? 1.0f : fOutput;  //輸出  lookUp[m] = static_cast<unsigned char>(fOutput * 255.0f); }  for (size_t r = 0; r < matInput.rows; r++) {  unsigned char* pInput = matInput.data + r * matInput.step[0];  unsigned char* pOutput = matOutput.data + r * matOutput.step[0];  for (size_t c = 0; c < matInput.cols; c++)  {   //查表gamma變換   pOutput[c] = lookUp[pInput[c]];  } }}(3)、測試結果
---------------------
作者:圖像大師
來源:CSDN
原文:https://blog.csdn.net/huqiang_823/article/details/80767019
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM