Обработка изображения: взвешенная яркость

Я хотел бы взвесить значения яркости.

Пример :
У меня есть вектор значений яркости:

vector <int> lum {50,100,150,200,250);

У меня есть вектор коэффициентов:

vector <float> coef {5.1 , 2.55 , 1.7 , 1.275, 1.02 }

Я создаю пустое изображение:

Mat1 m(15):

Итак, мое первое значение яркости — 50 (lum [0] = 50), и я хочу, чтобы оно было применено к первому пикселю моей матрицы 5.1 (coef [0] = 5.1). Для этого мне нужно взвесить 6-й пиксель с первым и вторым значением яркости. В моем случае яркость моего 6-го пикселя будет 95, потому что (0,1 * 50) + (0,9 * 100) = 95

На данный момент для второго коэффициента (coef [1] = 2,55) я использовал 0,9 на 2,55 для предыдущего вычисления. Этот коэффициент остается равным 1,65, поэтому у седьмого пикселя будет 100 яркости, а у восьмого (0,65 * 100) + (0,35 * 150) = 117,5.

И так далее…

На самом деле у меня есть это:

//Blibliothèque Opencv
#include "opencv2/core/core.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/imgcodecs.hpp"#include "opencv2/highgui/highgui.hpp"// cpp include
#include <iostream>
#include <cmath>
#include <math.h>
#include <string.h>
#include <vector>
#include <opencv2/opencv.hpp>

#define MPI 3.14159265358979323846264338327950288419716939937510
#define RAD2DEG (180./MPI)

using namespace cv;
using namespace std;vector <int> lum{ 50, 100, 150, 200, 250 };
vector <float> coef (5,0);
vector <int> newv(15, 0);
float pixelRef = 255, angle = 0, coeff = 0;int main()
{for (int n = 0; n < lum.size(); ++n)
{
//get angle
angle = ((acos(lum[n] / pixelRef)));
cout << "angle :" << angle*RAD2DEG << endl;
// get coefficient
coef [n] = (1 / (cos(angle)));
cout << "coeff :" << coef [n] << endl;
// try to weighted my pixels
newv[n] = (coef*lum[n]) + ((1 - coeff)*lum[n + 1]);
}
return 0;
}

1

Решение

Я изменил последний элемент coef в 3.02f чтобы показать, что этот код хорошо обрабатывает и последний элемент. Последовательность результатов:

50, 50, 50, 50, 50, 95, 100, 117.5, 150, 182.5, 218.75, 250, 250,

введите описание изображения здесь

Возможно, код будет переписан лучше, но я оставлю это вам:

#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>
using namespace cv;
using namespace std;

int main()
{
vector <int> lum{ 50, 100, 150, 200, 250 };
vector <float> coef{ 5.1f, 2.55f, 1.7f, 1.275f, 3.02f };

vector<float> v;

int idx_lum = 0;
int idx_coef = 0;

while (true)
{
int c = int(coef[idx_coef]);
for (int i = 0; i < c; ++i)
{
v.push_back(float(lum[idx_lum]));
}

float alpha = fmod(coef[idx_coef], 1.f);
float beta = 1.f - alpha;

v.push_back(alpha * lum[idx_lum] + beta * lum[idx_lum + 1]);

idx_lum++;
idx_coef++;
coef[idx_coef] = coef[idx_coef] - beta;

if (idx_lum >= lum.size() - 1 || idx_coef >= coef.size() - 1)
{
int cc = int(coef[idx_coef]);
for (int i = 0; i < cc; ++i)
{
v.push_back(float(lum[idx_lum]));
}

// Only if the last remainder is needed
//float alpha = fmod(coef[idx_coef], 1.f);
//v.push_back(alpha * lum[idx_lum]);
break;
}
}

// Print out the values
copy(v.begin(), v.end(), ostream_iterator<float>(cout, ", "));

// Get a cv::Mat from the std::vector
Mat1f m = Mat1f(v).t();

return 0;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]