Mat equalizeHistImage(Mat src){ int channel = src.channels();
if (channel == 3) { Mat imageRGB[3]; split(src, imageRGB); for (int i = 0; i 3; i++) { equalizeHist(imageRGB[i], imageRGB[i]); } merge(imageRGB, 3, src); }
return src; }
原图.png
直方图均衡化后的效果.png
3.2 Gamma 变换
Gamma 变换主要的 cv 代码如下:
uint8_t gammaLUT[256] = { 0 };
voidgammaCorrection(Mat& src, Mat& dst, float K){ src.copyTo(dst); for (int i = 0; i 256; i++) { float f = i / 255.0f; // 注意不可以写成 i / 255 f = pow(f, K); gammaLUT[i] = static_cast<uint8_t>(f * 255.0); }
MatIterator_ it = dst.begin(); MatIterator_ it_end = dst.end();
for (; it != it_end; it++) { (*it)[0] = gammaLUT[(*it)[0]]; (*it)[1] = gammaLUT[(*it)[1]]; (*it)[2] = gammaLUT[(*it)[2]]; } }
voidunsharpMask(const Mat& src, Mat& dst, int radius, int threshold, int amount){ int height = src.rows; int width = src.cols; GaussianBlur(src, dst, cv::Size(radius, radius), 2, 2);
for (int h = 0; h for (int w = 0; w int b = src.at(h, w)[0] - dst.at(h, w)[0]; int g = src.at(h, w)[1] - dst.at(h, w)[1]; int r = src.at(h, w)[2] - dst.at(h, w)[2]; if (abs(b) > threshold) { b = src.at(h, w)[0] + amount * b / 100; dst.at(h, w)[0] = saturate_cast(b); } if (abs(g) > threshold) { g = src.at(h, w)[1] + amount * g / 100; dst.at(h, w)[1] = saturate_cast(g); } if (abs(r) > threshold) { r = src.at(h, w)[2] + amount * r / 100; dst.at(h, w)[2] = saturate_cast(r); } } } }