HSV和RGB一樣是一種圖像的顔色模型,h表示色調,s表示飽和度
1.RandomHue
void RandomHue(const cv::Mat& in_img, cv::Mat* out_img,
const float hue_prob, const float hue_delta) {
float prob;
caffe_rng_uniform(1, 0.f, 1.f, &prob);
if (prob < hue_prob) {
以一定機率進行色調調整
CHECK_GE(hue_delta, 0) << "hue_delta must be non-negative.";
float delta;
caffe_rng_uniform(1, -hue_delta, hue_delta, &delta);
AdjustHue(in_img, delta, out_img);
} else {
*out_img = in_img;
}
}
需要先把rgb圖轉成hsv圖,然後對第一個通道也就是h的通道的每個值加上delta,最後再換轉成rgb圖
void AdjustHue(const cv::Mat& in_img, const float delta, cv::Mat* out_img) {
if (fabs(delta) > 0) {
// Convert to HSV colorspae.
cv::cvtColor(in_img, *out_img, CV_BGR2HSV);
// Split the image to 3 channels.
vector<cv::Mat> channels;
cv::split(*out_img, channels);
// Adjust the hue.
channels[0].convertTo(channels[0], -1, 1, delta);
cv::merge(channels, *out_img);
// Back to BGR colorspace.
cvtColor(*out_img, *out_img, CV_HSV2BGR);
} else {
*out_img = in_img;
}
}
2.RandomSaturation
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;
}
}
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;
}
}