Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!









void KuwaharaOperation::getMeanAndVariance(int x0, int y0, int x1, int y1, float output[3], float variance[3])
{
float color[3], mean[3];
float var[3] = {0.0f};
int count = (y1 - y0 + 1) * (x1 - x0 + 1);
for (int y = y0; y <= y1; y++) {
for (int x = x0; x <= x1; x++) {
this->m_inputOperation->read(color, x, y, NULL);
add_v3_v3(mean, color);
}
}
mul_v3_fl(mean, 1.0f / count);
for (int y = y0; y <= y1; y++) {
for (int x = x0; x <= x1; x++) {
this->m_inputOperation->read(color, x, y, NULL);
sub_v3_v3(color, mean);
mul_v3_v3(color, color);
add_v3_v3(var, color);
}
}
// Код для отдельных каналов
// if (variance[0] > var[0]) {
// output[0] = mean[0];
// variance[0] = var[0];
// }
// if (variance[1] > var[1]) {
// output[1] = mean[1];
// variance[1] = var[1];
// }
// if (variance[2] > var[2]) {
// output[2] = mean[2];
// variance[2] = var[2];
// }
// Код для общей интенсивности
if (MAX3(variance[0], variance[1], variance[2]) > MAX3(var[0], var[1], var[2])) {
copy_v3_v3(output, mean);
copy_v3_v3(variance, var);
}
}
void KuwaharaOperation::executePixel(float output[4], int x, int y, void *data)
{
float color_org[4];
float variance[4] = {FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX};
int size = this->m_size;
int x1 = x - size, x2 = x, x3 = x + size;
int y1 = y - size, y2 = y, y3 = y + size;
CLAMP(x1, 0, getWidth() - 1);
CLAMP(x2, 0, getWidth() - 1);
CLAMP(x3, 0, getWidth() - 1);
CLAMP(y1, 0, getHeight() - 1);
CLAMP(y2, 0, getHeight() - 1);
CLAMP(y3, 0, getHeight() - 1);
this->m_inputOperation->read(color_org, x, y, NULL);
this->getMeanAndVariance(x1, y1, x2, y2, output, variance);
this->getMeanAndVariance(x1, y2, x2, y3, output, variance);
this->getMeanAndVariance(x2, y1, x3, y2, output, variance);
this->getMeanAndVariance(x2, y2, x3, y3, output, variance);
output[3] = color_org[3];
}





Размытие изображения фильтром Kuwahara