1. html
void RandomBrightness(const cv::Mat& in_img, cv::Mat* out_img, const float brightness_prob, const float brightness_delta) { float prob; caffe_rng_uniform(1, 0.f, 1.f, &prob); if (prob < brightness_prob) { CHECK_GE(brightness_delta, 0) << "brightness_delta must be non-negative."; float delta; caffe_rng_uniform(1, -brightness_delta, brightness_delta, &delta); AdjustBrightness(in_img, delta, out_img); } else { *out_img = in_img; } }
void AdjustBrightness(const cv::Mat& in_img, const float delta, cv::Mat* out_img) { if (fabs(delta) > 0) { in_img.convertTo(*out_img, -1, 1, delta); } else { *out_img = in_img; } }
opencv的convertTo的講解:https://blog.csdn.net/qq_22764813/article/details/52135686dom
https://blog.csdn.net/qq_15505637/article/details/53887274函數
type是是否改變深度的,即uint八、uint1六、float等,-1就是保持不變ui
scale是比例因子,即每一個像素值須要乘的值spa
shift是在每一個像素上加上的值.net
opencv調整亮度:https://blog.csdn.net/hb707934728/article/details/74914104code
g(i,j)=a*f(i,j)+b a是調整對比度,b是調整亮度,實際上就是scale調整對比度,shift調整亮度,這裏就是對比度不變,調整亮度orm
caffe_rng_uniform:生成n個在a、b之間均勻分佈的值htm
uniform distribution:均勻分佈blog
http://www.voidcn.com/article/p-hqhoassv-qh.html
void caffe_rng_uniform(const int n, const Dtype a, const Dtype b, Dtype* r) { CHECK_GE(n, 0); CHECK(r); CHECK_LE(a, b); boost::uniform_real<Dtype> random_distribution(a, caffe_nextafter<Dtype>(b)); boost::variate_generator<caffe::rng_t*, boost::uniform_real<Dtype> > variate_generator(caffe_rng(), random_distribution); for (int i = 0; i < n; ++i) { r[i] = variate_generator(); } }
2.
以前的RandomBrightness是增長亮度,RandomContrast則是增長對比度,其實兩個函數的實現差很少,
以前的RandomBrightness博客說過,g(i,j)=a*f(i,j)+b是對比度和亮度的數學表達,調整a是調整的對比度,調整b是調整的亮度,RandomBrightness、RandomContrast是分別實現的調整a和b
RandomBrightness和RandomContrast的prob都是表示執行這個操做的可能性,便是否調整對比度和亮度
void RandomContrast(const cv::Mat& in_img, cv::Mat* out_img, const float contrast_prob, const float lower, const float upper) { float prob; caffe_rng_uniform(1, 0.f, 1.f, &prob); if (prob < contrast_prob) { CHECK_GE(upper, lower) << "contrast upper must be >= lower."; CHECK_GE(lower, 0) << "contrast lower must be non-negative."; float delta; caffe_rng_uniform(1, lower, upper, &delta); AdjustContrast(in_img, delta, out_img); } else { *out_img = in_img; } }
調整的值是delta,其實是經過在lower和upper選取均勻分佈的一個值做爲調整對比度的值
void AdjustContrast(const cv::Mat& in_img, const float delta, cv::Mat* out_img) { if (fabs(delta - 1.f) > 1e-3) { in_img.convertTo(*out_img, -1, delta, 0); } else { *out_img = in_img; } }