1. 程式人生 > >C++數字圖像處理(1)-伽馬變換

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

進行 博文 免除 公式 csdn amp cto 輸入 nsf

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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

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