###前提・実現したいこと
opencvでホワイトバランスを調整するプログラムを見つけたのですが,
処理の内容が分かりません.
****************************で示した部分のプログラムについての質問です
なぜこのような処理をしているのですか.
###該当のソースコード
void balance_white(Mat mat)
{
double discard_ratio = 0.05;
int hists[3][256];
memset(hists, 0, 3256sizeof(int));
for (int y = 0; y < mat.rows; ++y) {
uchar* ptr = mat.ptr<uchar>(y); for (int x = 0; x < mat.cols; ++x) { for (int j = 0; j < 3; ++j) { hists[j][ptr[x * 3 + j]] += 1; } }
}
// cumulative hist
int total = mat.cols*mat.rows;
int vmin[3], vmax[3];
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 255; ++j) { hists[i][j + 1] += hists[i][j]; } vmin[i] = 0; vmax[i] = 255;
while (hists[i][vmin[i]] < discard_ratio * total) vmin[i] += 1; while (hists[i][vmax[i]] > (1 - discard_ratio) * total) vmax[i] -= 1; if (vmax[i] < 255 - 1) vmax[i] += 1;
}
for (int y = 0; y < mat.rows; ++y)
{
uchar* ptr = mat.ptr<uchar>(y); for (int x = 0; x < mat.cols; ++x) { for (int j = 0; j < 3; ++j) { int val = ptr[x * 3 + j]; if (val < vmin[j]) val = vmin[j]; if (val > vmax[j]) val = vmax[j]; ptr[x * 3 + j] = static_cast<uchar>((val - vmin[j]) * 255.0 / (vmax[j] - vmin[j])); } }
}
}

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。