OpenCV 【十】——Gamma校正 ——图像灰度变化
Gamma校正(C++、OpenCV實現)
1.作用:
? ? ? ?Gamma校正是對輸入圖像灰度值進行的非線性操作,使輸出圖像灰度值與輸入圖像灰度值呈指數關系:
伽瑪校正由以下冪律表達式定義:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
2.函數原型?
void calcHist( const Mat* images, int nimages,const int* channels, InputArray mask,OutputArray hist, int dims, const int* histSize,const float** ranges, bool uniform=true, bool accumulate=false );
//1.輸入的圖像數組 2.輸入數組的個數 3.通道數 4.掩碼 5.直方圖
//6.直方圖維度 7.直方圖每個維度的尺寸數組 8.每一維數組的范圍 9.直方圖是否是均勻 10.累加標志
參數詳解:
?images:輸入的圖像的指針,可以是多幅圖像,所有的圖像必須有同樣的深度(CV_8U or CV_32F)。同時一副圖像可以有多個channes。
nimages:輸入圖像的個數
?channels:需要統計直方圖的第幾通道。用來計算直方圖的channes的數組。比如輸入是2副圖像,第一副圖像有0,1,2共三個channel,第二幅圖像只有0一個channel,那么輸入就一共有4個channes,如果int channels[3] = {3, 2, 0},那么就表示是使用第二副圖像的第一個通道和第一副圖像的第2和第0個通道來計算直方圖。
3.實現:
void GetGammaCorrection(Mat& src, Mat& dst, const float fGamma)
{unsigned char bin[256];for (int i = 0; i < 256; ++i){bin[i] = saturate_cast<uchar>(pow((float)(i / 255.0), fGamma) * 255.0f);}dst = src.clone();const int channels = dst.channels();switch (channels){case 1:{MatIterator_<uchar> it, end;for (it = dst.begin<uchar>(), end = dst.end<uchar>(); it != end; it++)*it = bin[(*it)];break;}case 3:{MatIterator_<Vec3b> it, end;for (it = dst.begin<Vec3b>(), end = dst.end<Vec3b>(); it != end; it++){(*it)[0] = bin[((*it)[0])];(*it)[1] = bin[((*it)[1])];(*it)[2] = bin[((*it)[2])];}break;}}
}int main()
{Mat image = imread("C:\\Users\\Administrator\\Desktop\\ir\\2ir.bmp");if (image.empty()){cout << "Error: Could not load image" << endl;return 0;}Mat dst;float fGamma = 1 / 2.0;GetGammaCorrection(image, dst, fGamma);imshow("Source Image", image);imshow("Dst", dst); std::string filename = "C:\\Users\\Administrator\\Desktop\\ir\\dst2ir.bmp";cv::imwrite(filename, dst);cv::waitKey(0);return 0;
}
?
void GetGammaCorrection(Mat& src, Mat& dst, const float fGamma)
{unsigned char bin[256] = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11,22, 23, 24, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47,64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97,118, 119, 120, 122, 123, 124, 125, 126, 127, 129, 130, 131, 132, 133, 135, 136, 137, 138, 140, 141, 142, 143, 144, 146, 147, 148, 149, 151, 152, 153, 155, 156, 157,182, 183, 185, 186, 187, 189, 190, 191, 193, 194, 196, 197, 198, 200, 201, 202, 204, 205, 207, 208, 209, 211, 212, 214, 215, 217, 218, 219, 221, 222, 224, 225, 227,11, 12, 12 , 13, 14, 14, 15, 15, 16, 17, 17, 18, 18, 19, 20, 20, 21, 22,48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 57, 58 , 59, 60, 61, 62, 63,98, 99, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 113, 115, 116, 117,158, 160, 161, 162, 164, 165, 166, 167, 169, 170, 171, 173, 174, 175, 177, 178, 179, 181,228, 229, 231, 232, 234, 235, 237, 238, 240, 241, 243 , 244, 246, 247, 249, 250, 252 , 253};dst = src.clone();uchar* ptr = dst.ptr<uchar>(0);for (int i = 0; i < 400 * 640; ++i){ptr[i] = bin[ptr[i]];}
}int main()
{Mat src = imread("C:\\Users\\Administrator\\Desktop\\ir\\ir8_3.bmp", IMREAD_UNCHANGED);std::cout<< src.channels()<< std::endl;if (src.empty()){cout << "Error: Could not load image" << endl;return 0;}Mat gamma_dst;clock_t start_time, end_time;float fGamma = 1 / 1.5;start_time = clock();for (int i = 0; i < 100; ++i) {GetGammaCorrection(src, gamma_dst, fGamma); }end_time = clock();double duration = (double)(end_time - start_time) / CLOCKS_PER_SEC;std::cout << "duration = " << duration*1000<< std::endl;imshow("Dst", src);std::string filename = "C:\\Users\\Administrator\\Desktop\\ir\\gamma_ir8_3.bmp";cv::imwrite(filename, src);cv::waitKey(0);return 0;
}
4.效果
未經gamma校正和經過gamma校正保存圖像信息如圖:?
能夠觀察到,未經gamma校正的情況下,低灰度時,有較大范圍的灰度值被保存成同一個值,造成信息丟失;同一時候高灰度值時,非常多比較接近的灰度值卻被保存成不同的值,造成空間浪費。經過gamma校正后,改善了存儲的有效性和效率。
5.原理
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
6.參考
【1】?http://www.cambridgeincolour.com/tutorials/gamma-correction.htm
【2】http://en.wikipedia.org/wiki/Gamma_correction
總結
以上是生活随笔為你收集整理的OpenCV 【十】——Gamma校正 ——图像灰度变化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪些电影院能直播国庆70周年盛况
- 下一篇: MATLAB【四】 ————批量适配图片